我写了一个splitter,关键部分的代码:
case WM_MOUSEMOVE:
if(nBeginPos >= 0)//刚按下的位置
{
SetCursor(hResizeCursor);
}
else
{
MousePos.x = LOWORD(lParam);
MousePos.y = HIWORD(lParam);
GetClientRect(hwnd, &splitRect);
if(PtInRect(&splitRect, MousePos))
{
SetCursor(hResizeCursor);
}
else
{
SetCursor(hNormalCursor);
}
}
return 0; case WM_LBUTTONDOWN:
assert(nCapture == 0);
SetCursor(hResizeCursor);
SetCapture(hwnd);
++ nCapture;
if (bHSplitter)
{
nBeginPos = HIWORD(lParam); //y
}
else
{
nBeginPos = LOWORD(lParam); //x
}
return 0; case WM_LBUTTONUP:
if(nBeginPos >= 0)
{
POINT point;
int offset;
short x = LOWORD(lParam);
short y = HIWORD(lParam);
GetWindowRect(hwnd, &splitRect);
point.x = splitRect.left;
point.y = splitRect.top;
ScreenToClient(GetParent(hwnd), &point); if (bHSplitter)
{
offset = y - nBeginPos;
SendMessage (GetParent (hwnd), WM_COMMAND,
GetWindowLong (hwnd, GWL_ID),
(LPARAM) offset);
MoveWindow(hwnd, point.x, splitRect.top + offset, splitRect.right - splitRect.left, splitRect.bottom - splitRect.top, TRUE);
}
else
{
offset = x - nBeginPos;
SendMessage (GetParent (hwnd), WM_COMMAND,
GetWindowLong (hwnd, GWL_ID),
(LPARAM) offset);
MoveWindow(hwnd, point.x + offset, point.y, splitRect.right - splitRect.left, splitRect.bottom - splitRect.top, TRUE);
} nBeginPos = -1;
assert(nCapture == 1);
-- nCapture;
ReleaseCapture();
}
return 0;
如果在splitter的clientrect里释放鼠标,则没问题(当然就是不拖动);如果拖动了,即在splitter的clientrect外释放鼠标之后,splitter就无法再响应任何鼠标事件了,何解?
case WM_MOUSEMOVE:
if(nBeginPos >= 0)//刚按下的位置
{
SetCursor(hResizeCursor);
}
else
{
MousePos.x = LOWORD(lParam);
MousePos.y = HIWORD(lParam);
GetClientRect(hwnd, &splitRect);
if(PtInRect(&splitRect, MousePos))
{
SetCursor(hResizeCursor);
}
else
{
SetCursor(hNormalCursor);
}
}
return 0; case WM_LBUTTONDOWN:
assert(nCapture == 0);
SetCursor(hResizeCursor);
SetCapture(hwnd);
++ nCapture;
if (bHSplitter)
{
nBeginPos = HIWORD(lParam); //y
}
else
{
nBeginPos = LOWORD(lParam); //x
}
return 0; case WM_LBUTTONUP:
if(nBeginPos >= 0)
{
POINT point;
int offset;
short x = LOWORD(lParam);
short y = HIWORD(lParam);
GetWindowRect(hwnd, &splitRect);
point.x = splitRect.left;
point.y = splitRect.top;
ScreenToClient(GetParent(hwnd), &point); if (bHSplitter)
{
offset = y - nBeginPos;
SendMessage (GetParent (hwnd), WM_COMMAND,
GetWindowLong (hwnd, GWL_ID),
(LPARAM) offset);
MoveWindow(hwnd, point.x, splitRect.top + offset, splitRect.right - splitRect.left, splitRect.bottom - splitRect.top, TRUE);
}
else
{
offset = x - nBeginPos;
SendMessage (GetParent (hwnd), WM_COMMAND,
GetWindowLong (hwnd, GWL_ID),
(LPARAM) offset);
MoveWindow(hwnd, point.x + offset, point.y, splitRect.right - splitRect.left, splitRect.bottom - splitRect.top, TRUE);
} nBeginPos = -1;
assert(nCapture == 1);
-- nCapture;
ReleaseCapture();
}
return 0;
如果在splitter的clientrect里释放鼠标,则没问题(当然就是不拖动);如果拖动了,即在splitter的clientrect外释放鼠标之后,splitter就无法再响应任何鼠标事件了,何解?
建议加判断鼠标是否在离开窗体.
或者采用别的方法,把WM_LBUTTONUP发送到该窗体.
在Spliter的WM_LBUTTONDOWN处SetCapture(以后所有的鼠标消息都发往Spliter
窗口)
Spliter的WM_LBUTTONUP处ReleaseCapture就行了呀.