准备写一个资源编辑器,自己先研究一下:
1.正常的按钮是不能响应wm_lbutton down消息的,所以要先将控件子类化。
hwndButton = ::CreateWindow(_T("Button"), _T("button"), WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON, 0, 0, 100, 30, hWnd, (HMENU)WM_USER, hInst, 0);
oldProc = (WNDPROC)SetWindowLong(hwndButton, GWL_WNDPROC, (LONG)ButtonProc);
2.按下鼠标左键时,要开始捕捉鼠标运行
if (uMsg == WM_LBUTTONDOWN)
{
SetWindowText(hWnd, _T("down"));
SetCapture(hWnd);
return 1;
}
3.放开鼠标左键时,要释放捕捉,并将按钮的位置移动到新的坐标点。
if (uMsg == WM_LBUTTONUP)
{
SetWindowText(hWnd, _T("up"));
ReleaseCapture();
POINT pt;
GetCursorPos(&pt);
HWND hParent = GetParent(hWnd);
::ScreenToClient(hParent, &pt);
SetWindowPos(hWnd, NULL, pt.x, pt.y, 0, 0, SWP_NOSIZE);
return 1;
}
总结,通过以上的消息控件,就实现了最基本的按钮拖动效果。
下一步要完善以下效果:
拖动时,要显示虚线框,以显示拖动的效果。
我的测试代码: