如何使用其客户区实现拖动窗口?

时间:2011-10-14 21:30:11

标签: c++ windows winapi

我有一个Win32 HWND,我想让用户按住控件,然后用鼠标左键拖动屏幕周围的窗口。鉴于(1)我可以检测到用户何时拥有控件,鼠标左键,并移动鼠标,以及(2)我有新的和旧的鼠标位置,如何使用Win32 API和我的HWND进行更改窗户的位置?

2 个答案:

答案 0 :(得分:33)

为WM_NCHITTEST实现消息处理程序。调用DefWindowProc()并检查返回值是否为HTCLIENT。如果是,则返回HTCAPTION,否则返回DefWindowProc返回值。您现在可以单击客户区并拖动窗口,就像您通过单击标题拖动窗口一样。

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_NCHITTEST: {
        LRESULT hit = DefWindowProc(hWnd, message, wParam, lParam);
        if (hit == HTCLIENT) hit = HTCAPTION;
        return hit;
    }
    // etc..
}

答案 1 :(得分:0)

很抱歉回答迟了一点,但这是您想要的代码

首先,您声明以下全局变量:

bool mousedown = false;
POINT lastLocation;

bool mousedown告诉我们用户是否按住鼠标左键

然后在回调函数中编写以下代码行

case WM_LBUTTONDOWN: {
    mousedown = true;
    GetCursorPos(&lastLocation);
    RECT rect;
    GetWindowRect(hwnd, &rect);
    lastLocation.x = lastLocation.x - rect.left;
    lastLocation.y = lastLocation.y - rect.top;
    break;
}
case WM_LBUTTONUP: {
    mousedown = false;
    break;
}
case WM_MOUSEMOVE: {
    if (mousedown) {
        POINT currentpos;
        GetCursorPos(&currentpos);
        int x =  currentpos.x - lastLocation.x;
        int y =  currentpos.y - lastLocation.y;
        MoveWindow(hwnd, x, y, window_lenght, window_height, false);
    }
    break;
}