Mfc 怎么使得对话框可以类似QQ那样,实时的隐藏或者显示呢?

本文介绍了一种解决非模态对话框中鼠标移动跟踪问题的方法,通过使用TRACKMOUSEEVENT结构和_TrackMouseEvent函数,实现了对话框内的鼠标离开和悬停事件的监听,即使鼠标移动到按钮上也能保持跟踪。

我在网上找了一些资料,大多数支持对话框中WM_MOUSEMOVE |WM_MOUSELEAVE 消息响应,可是一个很大的问题就是,我的对话框是非模态的,且边框很小,有木有呢,主要被按钮占据,而且按钮是继承的CbuttonST类,当鼠标从边框移动到按钮上时,就不能在对话框的OnMouseMove函数中响应移动事件了,这个时候OnMouseLeave函数开始响应,我明明在对话框的按钮上,却会造成对话框的隐藏怎么办呢?

终于找到一个比较不错的方法,但是还是有待改进,希望可以发现更好的方法。下面是的我的代码:

void CMainDlg::OnMouseMove(UINT nFlags, CPoint point)

{

       // TODO: Add your message handler code here and/or calldefault

       if (!m_bTracking)

       {

              TRACKMOUSEEVENT tme;

              tme.cbSize = sizeof(TRACKMOUSEEVENT);

              tme.dwFlags = TME_LEAVE | TME_HOVER;//要触发的消息

              tme.hwndTrack =this->m_hWnd;

              //tme.dwHoverTime = 10;// 若不设此参数,则无法触发mouseHover

 

              if (::_TrackMouseEvent(&tme)) //MOUSELEAVE|MOUSEHOVER消息由此函数触发

              {

                     m_bTracking = true;  

                     //return;

              }

       }

       CPoint pntCursor;

       if ( GetCursorPos(&pntCursor ))

       {

              int nScreenWidth, nScreenHeight;

              CCommonFun::GetPCScreenInfo(nScreenWidth,nScreenHeight);

              CRect rect;

              GetWindowRect(&rect);

              if ( /*this ==WindowFromPoint( pntCursor ) &&*/ (m_bIsHide== TRUE))

              {

                     ShowDlg(rect,nScreenWidth,nScreenHeight);  //show the mainoperation dlg

              }

       }

       CDialog::OnMouseMove(nFlags, point);

}

 

void CMainDlg::OnMouseLeave()

{

       // TODO: Add your message handler code here and/or calldefault

       CPoint pntCursor;

       if ( GetCursorPos(&pntCursor ))

       {

              int nScreenWidth, nScreenHeight;

              CCommonFun::GetPCScreenInfo(nScreenWidth,nScreenHeight);

              CRect rect;

              GetWindowRect(&rect);

              if (!rect.PtInRect(pntCursor))

              {

                     HideDlg(rect,nScreenWidth,nScreenHeight);  //hide the mainoperation dlg

              }

              else

              {

                     ShowDlg(rect,nScreenWidth,nScreenHeight);  //show themain operation dlg

              }

       }

       m_bTracking = false;

       CDialog::OnMouseLeave();

}

至于,怎样隐藏和显示你的对话框,自己写就可以了,亲。。。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值