一般的窗口只有点击地址标题栏才能实现拖拽,以下代码可以实现点击任何位置产生拖拽。
1> 首先介绍MFC实现的方法:
在对话框“属性”栏中调出“message”中的WM_NCHITTEST,对于函数为OnNcHitTest
LRESULT CFadeDlg::OnNcHitTest(CPoint point)
{
// TODO: Add your message handler code here and/or call default
return CDialog::OnNcHitTest(point);
}
在其中添加需要的代码后,OnNcHitTest函数如下:
LRESULT CFadeDlg::OnNcHitTest(CPoint point)
{
// TODO: Add your message handler code here and/or call default
//得到鼠标点击的窗口的部位
UINT nHitTest = CDialog::OnNcHitTest(point);
// 如果鼠标点击的是客户区,则返回HTCAPTION给Windows
if (nHitTest == HTCLIENT)
{
return HTCAPTION;
}
else
return nHitTest;
return CDialog::OnNcHitTest(point);
}
2> 再介绍使用window API实现方法:
假设注册窗口类传递的回调函数为WndProc
例如:
wcex.lpfnWndProc = (WNDPROC)WndProc;
在WndProc的switch中case WM_NCHITTEST添加部分代码,效果如下:
LRESULT __stdcall WndProc(HWND hWnd, UINT nMsg, WPARAM wParam, LPARAM lParam)
{
switch(nMsg)
{
case WM_NCHITTEST:
{
UINT nHitTest;
nHitTest = ::DefWindowProc(hWnd, WM_NCHITTEST, wParam, lParam);
if (nHitTest == HTCLIENT &&
::GetAsyncKeyState(MK_LBUTTON) < 0) // 如果鼠标左键按下,GetAsyncKeyState函数的返回值小于0
nHitTest = HTCAPTION;
return nHitTest;
}
case ...
...
}
}
也可参考:http://www.cnblogs.com/lzjsky/archive/2010/08/04/1791874.html