主对话框上通过菜单消息,弹出一个非模态无标题栏的子对话框,我已经重载了以下函数:
LRESULT CCooling::OnNcHitTest(CPoint point)
{
// TODO: Add your message handler code here and/or call default
CRect rc;
GetClientRect(&rc);
ClientToScreen(&rc); return rc.PtInRect(point) ? HTCAPTION : CDialog::OnNcHitTest(point);
}
来实现了无标题对话框的随意拖动。
现在我想在该子对话框区域内实现右键弹出菜单,但鼠标消息被主对话框截获,子对话框无法直接响应 RButtonUp 等。
但可以进入重载后的PreTranslateMessage(MSG* pMsg)函数,可是(WM_RButtonUp == pMsg->message) 等所有鼠标消息都被主对话框截获。
于是我在PreTranslateMessage中添加了SetCapture()函数用于使当前窗口可以截获鼠标消息。 于是我就响应了鼠标右键,使得能够右键弹出菜单,但此时却使得前面已经具有的子对话框随意拖动功能失去效果了。。
郁闷啊,请问各位高人,如何使得非模态子对话框即可随意拖动,又可右键弹出菜单咧?感谢!
LRESULT CCooling::OnNcHitTest(CPoint point)
{
// TODO: Add your message handler code here and/or call default
CRect rc;
GetClientRect(&rc);
ClientToScreen(&rc); return rc.PtInRect(point) ? HTCAPTION : CDialog::OnNcHitTest(point);
}
来实现了无标题对话框的随意拖动。
现在我想在该子对话框区域内实现右键弹出菜单,但鼠标消息被主对话框截获,子对话框无法直接响应 RButtonUp 等。
但可以进入重载后的PreTranslateMessage(MSG* pMsg)函数,可是(WM_RButtonUp == pMsg->message) 等所有鼠标消息都被主对话框截获。
于是我在PreTranslateMessage中添加了SetCapture()函数用于使当前窗口可以截获鼠标消息。 于是我就响应了鼠标右键,使得能够右键弹出菜单,但此时却使得前面已经具有的子对话框随意拖动功能失去效果了。。
郁闷啊,请问各位高人,如何使得非模态子对话框即可随意拖动,又可右键弹出菜单咧?感谢!
{
PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));
CDialog::OnLButtonDown(nFlags, point);
}按窗体任何位置都可移动窗体!------------------------------------------------在无标题栏的窗体上右键功能实现:↓↓WM_RButtonDown 消息响应处理 // 鼠标右键void CDlgDlg::OnRButtonDown(UINT nFlags, CPoint point)
{
CMenu menu,*sub;
menu.LoadMenu(IDR_MENU1); ////加载菜单
sub=menu.GetSubMenu(0);
ClientToScreen(&point);
sub->TrackPopupMenu(TPM_RIGHTBUTTON,point.x,point.y,this);
CDialog::OnRButtonDown(nFlags, point);
}-----------------------------------------------------------------------------------------------------------------对于无标题栏的对话框,用鼠标移动它的简单方法为:对消息WM_NCHITTEST进行处理,然后做鼠标位置的判断,如果鼠标位置在要移动窗口的客户区,则返回为鼠标在标题栏的信号,也就是欺骗windows,让它误认为你在点击标题栏,于是,你就可以正常拖动窗口了。WM_NCHITTEST 消息响应处理让窗口部分区域起移动功能的作用!函数GetWindowPlacement得到当前窗口在屏幕上的位置.这个函数的参数类型为WINDOWPLACEMENT结构。原型为
typedef struct tagWINDOWPLACEMENT { /* wndpl */
UINT length;
UINT flags;
UINT showCmd;
POINT ptMinPosition;
POINT ptMaxPosition;
RECT rcNormalPosition;
} WINDOWPLACEMENT;
其中,第六个变量rcNormalPosition为窗口正常显示时的位置UINT CTimeWakeDlg::OnNcHitTest(CPoint point)
{
UINT hit=CDialog::OnNcHitTest(point);
if(hit==HTCLIENT)
{
WINDOWPLACEMENT winplace;
GetWindowPlacement(&winplace);
int xp=winplace.rcNormalPosition.left;
int yp=winplace.rcNormalPosition.top;
if((point.x>xp)&&(point.x<xp+50)&&(point.y>yp)&&(point.y<yp+30))
return HTCAPTION;
else
return hit;
}
else
return hit;
} 好了,再在左上角画个图之类的,就更明显漂亮喽
if(WM_RBUTTONUP == pMsg->message&&m_Cooling.m_hWnd == pMsg->hwnd)
你们没明白我的意思,我已经在子对话框里面重载了OnNcHitTest函数,使得子对话框可以随意拖动。但正因为如此,子对话框无法响应OnRButtonUp函数了。
但如果我在PreTranslateMessage函数里面设置SetCapture函数,就可以获取WM_RBUTTONUP消息了,从而可以实现子对话框区域内右键弹出菜单,但这样的话随意拖动对话框就失效了!。。 这就是矛盾所在。一楼的OnNcHitTest函数可以同时实现两个功能,可惜需要在子对话框的不同区域内。我需要整个子对话框区域左键移动就随意拖动,右键就弹出菜单。。