我现在想实现这样一个功能:
开始有一个对话框,然后当鼠标移动到上面时创建另外一个对话框,当鼠标移开后面创建的这个对话框时候,destroy它,现在基本可以实现,方法如下:
响应: 
void CMaxDlg::OnMouseMove(UINT nFlags, CPoint point) 
{
// TODO: Add your message handler code here and/or call default
TRACKMOUSEEVENT   tme;   
tme.cbSize=sizeof(TRACKMOUSEEVENT);   
tme.dwFlags=/*TME_HOVER   |   */TME_LEAVE;   
tme.dwHoverTime=HOVER_DEFAULT;   
tme.hwndTrack=m_hWnd;   
if(!_TrackMouseEvent(&tme))   
AfxMessageBox("Êó±êʼþ²¶×½Ê§°Ü£¡"); 
CDialog::OnMouseMove(nFlags, point);
}
LRESULT CMaxDlg::OnMouseLeave(WPARAM wParam,LPARAM lParam)         
{       
         this->DestroyWindow();
return 0;         
}  
OnMouseLeave是我自定义的一个消息
afx_msg  LRESULT  OnMouseLeave(WPARAM ,LPARAM);  
ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)但是如果对话框上有一个按钮的时候,当我们把鼠标移动到上面时,他也删除这个对话框,原因是  tme.hwndTrack=m_hWnd; 这里鼠标跟踪的就是对话框的句柄,那么问题是:
如何解决只有当鼠标离开这个框时,才删除对话框,而鼠标移动到某个控件上时候,不删除对话框呢?
兄弟们帮帮忙,不甚感激!     

解决方案 »

  1.   

    可以在CMaxDlg::OnMouseLeave中得到鼠标和对话框的位置,来判断鼠标是否在对话框之外
      

  2.   

    获取对话框的客户区大小,然后判断鼠标是不是在这个区域内(PtInRect函数就可以判断)。注意处理坐标转换。
      

  3.   

    在CMaxDlg::OnMouseLeave中得到鼠标和对话框的位置,来判断鼠标是否在对话框之外
      

  4.   

    那么是不是不用 TrackMouseEvent?
      

  5.   

    CRect rectClient;
    GetClientRect(&rectClient);

    CPoint ptCursor;
    ::GetCursorPos(&ptCursor); if(!::PtInRect(&rectClient,ptCursor))
    {
    this->DestroyWindow();
    }
    我在OnMouseLeave中加了上面代码,问题还是没有解决
      

  6.   

    注意处理坐标转换。我把我这句话自动过滤了。
    ScreenToClient转换一下rect。
      

  7.   

    在GetClientRect(&rectClient);后面加上了ScreenToClient(&rectClient);
    仍然不行
      

  8.   

    明白了,是加上 ClientToScreen 谢谢,问题解决了!