break; case WM_LBUTTONUP: ReleaseCapture(); break; case WM_MOUSEMOVE: { if ((wParam & MK_LBUTTON) == MK_LBUTTON && GetCapture() == hwnd) { HDWP hdwp; RECT rect, rectStatus, rectTree; hdwp = BeginDeferWindowPos(3); GetClientRect(GetParent(hwnd), &rect); GetClientRect(hStatus, &rectStatus); GetWindowRect(hTree, &rectTree); DeferWindowPos(hdwp, hTree, NULL, 0, 0, rectTree.right - rectTree.left + (short)LOWORD(lParam), rect.bottom - rectStatus.bottom, SWP_NOMOVE | SWP_NOZORDER); DeferWindowPos(hdwp, hSplitter, NULL, rectTree.right - rectTree.left + (short)LOWORD(lParam), 0, 0, 0, SWP_NOSIZE | SWP_NOZORDER); DeferWindowPos(hdwp, hList, NULL, rectTree.right - rectTree.left + (short)LOWORD(lParam) + 2, 0, rect.right - rectTree.right + rectTree.left - (short)LOWORD(lParam) - 2, rect.bottom - rectStatus.bottom, SWP_NOZORDER); EndDeferWindowPos(hdwp); } } break; default: return DefWindowProc(hwnd, Msg, wParam, lParam); } return 0; } SetCapture和ReleaseCapture是分别在鼠标左键按下与释放的时候捕获和释放鼠标,这是分隔条的一般要求。这段代码中的核心部分就是在处理鼠标移动的事件,就是当鼠标左键按下并且分隔条捕获鼠标的时候来改变三个相关窗口的位置和宽度。具体的矩形操作与主窗口WM_SIZE的代码原理相似,我就不多说了。 我之所以不使用MoveWindow之类的函数来实现改变大小,就是因为这些函数会使窗体的多次重绘而导致整个窗体的闪烁——而事实上我并不希望状态栏也一起闪烁。
|
正在阅读:VC++学习:用SDK实现分隔条VC++学习:用SDK实现分隔条
2004-02-14 09:34
出处:CSDN
责任编辑:linjixiong
键盘也能翻页,试试“← →”键