我用SDK实现了一个无标题栏的窗口,将其中一部分作为标题栏,为了能鼠标拖动窗口我拦截了WM_NCHITTEST消息,代码如下:
x = LOWORD(lParam);
y = HIWORD(lParam);
Point.x = x;
Point.y = y;
ScreenToClient(hWnd, &Point);
if (PointInRegion(Point.x, Point.y, CLOSE_BUTTON_LEFT, CLOSE_BUTTON_RIGHT, CLOSE_BUTTON_TOP, CLOSE_BUTTON_BOTTOM))
{
return HTCLOSE;
}
if (NONGLI_PointInRegion(Point.x, Point.y, MIN_BUTTON_LEFT, MIN_BUTTON_RIGHT, MIN_BUTTON_TOP, MIN_BUTTON_BOTTOM))
{
return HTMINBUTTON;
}
if (NONGLI_PointInRegion(Point.x, Point.y, 0, WINDOW_TITLE_WIDTH, 0, WINDOW_TITLE_HEIGHT))
{
return HTCAPTION;
}
return DefWindowProc(hWnd, Message, wParam, lParam);
问题是
如果不拦截WM_NCLBUTTONDOWN消息,必须双击“标题栏”区域才能得到消息WM_NCLBUTTONUP,这时要双击自定义的关闭和最小化按钮(在自定义的标题栏区域上)才能进行相应的操作。
如果拦截了M_NCLBUTTONDOWN消息,则不能鼠标拖动,但却能单击收到消息WM_NCLBUTTONUP(也就能单击自定义的关闭和最小化按钮才能进行相应的操作)
这是什么原因,我想要的是按下鼠标左键不放能拖动窗口,而且能单击自定义的关闭和最小化按钮进行关闭和最小化操作!
x = LOWORD(lParam);
y = HIWORD(lParam);
Point.x = x;
Point.y = y;
ScreenToClient(hWnd, &Point);
if (PointInRegion(Point.x, Point.y, CLOSE_BUTTON_LEFT, CLOSE_BUTTON_RIGHT, CLOSE_BUTTON_TOP, CLOSE_BUTTON_BOTTOM))
{
return HTCLOSE;
}
if (NONGLI_PointInRegion(Point.x, Point.y, MIN_BUTTON_LEFT, MIN_BUTTON_RIGHT, MIN_BUTTON_TOP, MIN_BUTTON_BOTTOM))
{
return HTMINBUTTON;
}
if (NONGLI_PointInRegion(Point.x, Point.y, 0, WINDOW_TITLE_WIDTH, 0, WINDOW_TITLE_HEIGHT))
{
return HTCAPTION;
}
return DefWindowProc(hWnd, Message, wParam, lParam);
问题是
如果不拦截WM_NCLBUTTONDOWN消息,必须双击“标题栏”区域才能得到消息WM_NCLBUTTONUP,这时要双击自定义的关闭和最小化按钮(在自定义的标题栏区域上)才能进行相应的操作。
如果拦截了M_NCLBUTTONDOWN消息,则不能鼠标拖动,但却能单击收到消息WM_NCLBUTTONUP(也就能单击自定义的关闭和最小化按钮才能进行相应的操作)
这是什么原因,我想要的是按下鼠标左键不放能拖动窗口,而且能单击自定义的关闭和最小化按钮进行关闭和最小化操作!
解决方案 »
- VC++2005 单文档程序中如何正确地加一条菜单,并能正确地响应菜单的双击事件?
- WebBrowser控件,弹出垃圾框
- CFormView 里的 WM_Command
- 新手求助!关于使用自己重载的OnPaint函数的问题!
- 求助,CFileFind遍历子目录下所有文件的问题
- 请问通常遍历CString的最恰当的方法是什么?
- 代理残根怎样用?
- 比较复杂的问题
- 假设有一个变量CString str,调用str.GetBuffer(ncount);上面函数的参数应该为多少,才能取得缓冲中的全部字串值?
- -----如何在dialog中对数据库中的数据进行绑定????多多给分。。----------
- VC和WORD的问题,请教如何做?
- 请求原码正解,关于TABCONTROL的问题源码
[email protected]
SendMessage(NCLBUTTONDOWN, HTCAPTION)这个函数可以使窗口移动。
可以在鼠标在合理区域按下时调用此函数,然后窗口就会随鼠标移动。不用NCHITTEST也可以。至于最小化嘛,放个按钮就好。
想收到双击消息也不难,并不是每次按下鼠标都是想要拖动,可以把这个消息发送动作放在MouseMove事件里,nFlags会指示鼠标在移动时按下了哪个键,具体常量见MSDN。这样可以在鼠标移动并且左键按下时再发送消息,双击消息也可以收到了。
但这样有个缺点,就是不是鼠标一动窗口就会开始动,可以看到在鼠标刚开始拖动时窗口并没有移动。不过这也无所谓。