我正在设计一个自定义窗口边框,我在顶部放置一个位图作为拖动条。这是有效的,但是当我试图拖动窗口时,它将自己置于两个不同的区域,并在两者之间闪烁。这是一段视频:
http://dl.dropbox.com/u/85700751/capture-1.avi
当窗口闪烁时,我正在尝试拖动它(由于某种原因它没有显示我的光标)。这是我的拖动代码:
case WM_LBUTTONDOWN: {
int posX = LOWORD(lParam);
int posY = HIWORD(lParam);
if((isDragging==false)&&(posX>4)&&(posX<470)&&(posY>4)&&(posY<24))
{
isDragging = true;
ClipCursor(rect);
oldCursorX = posX;
oldCursorY = posY;
}
}
break;
case WM_LBUTTONUP: {
isDragging = false;
ClipCursor(NULL);
}
break;
case WM_MOUSEMOVE: {
if(isDragging) {
SetWindowPos(hWnd, NULL, LOWORD(lParam)-oldCursorX, HIWORD(lParam)-oldCursorY, 500, 500, NULL);
}
}
break;
答案 0 :(得分:5)
简单地回复WM_NCHITTEST通常最容易。对于该消息,LPARAM将鼠标点击X和Y坐标(与WM_LBUTTONDOWN相同)。如果他们在您的可拖动区域内,请返回HTCAPTION。然后系统会自动为您处理所有拖动逻辑。
答案 1 :(得分:0)
传递给WM_MOUSEMOVE的光标坐标是相对于窗口位置的。但是,每收到WM_MOUSEMOVE,你都会不断更改窗口位置。
使用:: ClientToScreen()将坐标转换为屏幕坐标。