MFC中无边框窗口的拖动 怎么添加WM_NCLBUTTONDOWN消息映射
我使用按钮当做标题栏,在Lbuttondown中:CButton::OnLButtonDown(nFlags,point);switch(m_ButtonItem){ca...
我使用按钮当做标题栏,在Lbuttondown中:
CButton::OnLButtonDown(nFlags, point);
switch(m_ButtonItem)
{
case MAIN_CAPTION:
::PostMessage(hWndMain,WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y)); break;
default:break;
}
按下后消息发送了,没有实现拖动窗口的效果,是因为没有添加消息映射吗?
实现方法原帖地址:
http://blog.sina.com.cn/s/blog_6288219501015dwa.html
方法二:当用户在窗口客户区按下鼠标左键时,使Windows认为鼠标是在标题条上,即在处理WM_LBUTTONDOWN消息的处理函数OnLButtonDown中发送一个wParam参数为HTCAPTION,lParam为当前坐标的WM_NCLBUTTONDOWN消息。
下面是使用该方法的实际代码:
void CEllipseWndDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// 调用父类处理函数完成基本操作
CDialog::OnLButtonDown(nFlags, point);
// 发送WM_NCLBUTTONDOWN消息
// 使Windows认为鼠标在标题条上
PostMessage(WM_NCLBUTTONDOWN,
HTCAPTION,
MAKELPARAM(point.x, point.y)); //或SendMessage(WM_SYSCOMMAND,0xF012,0); //0xF012 = SC_MOVE | HTCAPTION
} 展开
CButton::OnLButtonDown(nFlags, point);
switch(m_ButtonItem)
{
case MAIN_CAPTION:
::PostMessage(hWndMain,WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y)); break;
default:break;
}
按下后消息发送了,没有实现拖动窗口的效果,是因为没有添加消息映射吗?
实现方法原帖地址:
http://blog.sina.com.cn/s/blog_6288219501015dwa.html
方法二:当用户在窗口客户区按下鼠标左键时,使Windows认为鼠标是在标题条上,即在处理WM_LBUTTONDOWN消息的处理函数OnLButtonDown中发送一个wParam参数为HTCAPTION,lParam为当前坐标的WM_NCLBUTTONDOWN消息。
下面是使用该方法的实际代码:
void CEllipseWndDlg::OnLButtonDown(UINT nFlags, CPoint point)
{
// 调用父类处理函数完成基本操作
CDialog::OnLButtonDown(nFlags, point);
// 发送WM_NCLBUTTONDOWN消息
// 使Windows认为鼠标在标题条上
PostMessage(WM_NCLBUTTONDOWN,
HTCAPTION,
MAKELPARAM(point.x, point.y)); //或SendMessage(WM_SYSCOMMAND,0xF012,0); //0xF012 = SC_MOVE | HTCAPTION
} 展开
3个回答
展开全部
2005及以上版本的话,在Dlg类上点右键,属性,看跳出的窗口,在上面的一排工具栏图标中点第4个“事件”,然后里面有各种消息,选择你要的消息,添加即可。
关于无标题栏窗口的移动的代码,确实如楼主所述的方法,一般我也是这么做的,但是如果是在按钮上点击,至少用Windows标准按钮控件是不行的,因为消息队列中的LButtonDown先被按钮拾取了,窗口收不到这条消息,从Windows消息机制里可以了解到。我试了一下,用图片自绘的任意控件都是可以用上述方法实现的,楼主可以使用自绘的图片按钮。
如果要点住这个按钮才让窗口移动,其它按钮不发生这种操作,可以用RECT来判断呀,很方便。
关于无标题栏窗口的移动的代码,确实如楼主所述的方法,一般我也是这么做的,但是如果是在按钮上点击,至少用Windows标准按钮控件是不行的,因为消息队列中的LButtonDown先被按钮拾取了,窗口收不到这条消息,从Windows消息机制里可以了解到。我试了一下,用图片自绘的任意控件都是可以用上述方法实现的,楼主可以使用自绘的图片按钮。
如果要点住这个按钮才让窗口移动,其它按钮不发生这种操作,可以用RECT来判断呀,很方便。
更多追问追答
追问
图片按钮搞定了,按钮在构造函数中添加了编号,LbuttonDown时消息发送了。
求后面的具体步骤 OTZ
追答
按照你的思路,就需要判断鼠标是不是在这个按钮上方喽,这样的话,你可以获取窗口大小,然后按照你这个按钮所在的区域来判断你的鼠标是不是落在这个区域,如果在的,就发送移动窗口的消息。
你的项目是Win32 应用程序喽?
展开全部
注意不能只处理WM_NCLBUTTONDOWN消息,还需要处理WM_NCLBUTTONUP消息,只处理一个肯定无效。
按钮那么做没试过,感觉不是很靠谱,从对话框处理按钮的LBUTTON消息貌似有问题,第二个方法中,处理对话框客户区鼠标消息是肯定没有问题的,只要DOWN和UP都处理即可。
追问
我按照帖子里的方法判断在按钮上按下左键时发送了WM_NCLBUTTONDOWN,这个消息之后需要怎么处理?
看到有帖子说标题栏按下时是WM_NCLBUTTONDOWN,抬起时是WM_LBUTTONUP。
客户区的方法我试过确实方便,但是只在控件以外生效,我需要一个自绘的标题栏。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你想实现的是点击按钮然后拖动???点击按钮的时候是不响应LButtonDown这个消息。
更多追问追答
追问
使用了自定义的按钮类,添加了左键按下,调试时postmessage已经执行了,但是没有实现拖动
追答
postmessage中的句柄是主对话框的句柄么?
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询