C++ 可拖动无边框窗口问题

3
我正在设计自定义窗口边框,并在顶部放置了一个位图作为拖动栏。这个方案是可行的,但当我尝试拖动窗口时,它会分别放置在两个不同的区域并在两者之间闪烁。以下是视频链接: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;
2个回答

5

通常最简单的方法是响应WM_NCHITTEST消息。对于该消息,LPARAM参数将具有鼠标点击的X和Y坐标(与WM_LBUTTONDOWN相同)。如果它们在您的可拖动区域内,只需返回HTCAPTION。系统会自动处理所有的拖动逻辑。


0

传递给 WM_MOUSEMOVE 的光标坐标是相对于窗口位置的。但是您在每次接收到 WM_MOUSEMOVE 时都会更改窗口位置。

使用 ::ClientToScreen() 将坐标转换为屏幕坐标。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接