Win32Api окна перемещаются - PullRequest
0 голосов
/ 07 октября 2018

как я могу переместить мое окно, когда нажата средняя кнопка мыши?

в случае левой кнопки мыши это будет

case WM_LBUTTONDOWN:
{
    SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);
}
return 0;

, но оно не работает со средней кнопкой

 case WM_MBUTTONDOWN:
    {
        SendMessage(hwnd, WM_NCMBUTTONDOWN, HTCAPTION, 0);
    }
return 0;

но я не уверен насчет WM_NCMBUTTONDOWN

У меня нет вариантов, нужна помощь, пожалуйста

1 Ответ

0 голосов
/ 09 октября 2018

Боюсь, ты должен сделать это нелегко.Я перепробовал все очевидные вещи, и WM_NCHITTEST не обрезает его, если вы хотите перетащить окно чем-либо, кроме левой кнопки мыши.

Вот код, который работает для меня (проверено на Windows 10).Я исключил проверку ошибок для краткости:

#include <windows.h>
#include <windowsx.h>
#include <tchar.h>

// WndProc
LRESULT CALLBACK MyWndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    static int xClick, yClick;

    switch (uMsg)
    {
        case WM_NCMBUTTONDOWN:
        case WM_LBUTTONDOWN:
        case WM_MBUTTONDOWN:
        {
            SetCapture (hWnd);
            POINT pt = { GET_X_LPARAM (lParam), GET_Y_LPARAM (lParam) };
            if (uMsg == WM_NCMBUTTONDOWN)
                ScreenToClient (hWnd, &pt);
            xClick = pt.x;
            yClick = pt.y;
            return 0;
        }

        case WM_LBUTTONUP:
        case WM_MBUTTONUP:
            ReleaseCapture ();
            return 0;

        case WM_MOUSEMOVE:
        {
            if (GetCapture() == hWnd)
            {
                RECT wr;
                GetWindowRect (hWnd, &wr);
                int xMouse = GET_X_LPARAM (lParam);
                int yMouse = GET_Y_LPARAM (lParam);
                int xWindow = wr.left + xMouse - xClick;
                int yWindow = wr.top + yMouse - yClick;
                SetWindowPos (hWnd, NULL ,xWindow, yWindow, 0, 0 , SWP_NOSIZE | SWP_NOZORDER);
            }
            return 0;
        }
    }

    return DefWindowProc (hWnd, uMsg, wParam, lParam);
}


// WinMain
int CALLBACK _tWinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
{
    HINSTANCE hInstance = NULL;
    WNDCLASS wc = { };
    wc.lpszClassName = __T ("MyWindowClass");
    wc.lpfnWndProc = MyWndProc;
    RegisterClass (&wc);
    HWND hWnd = CreateWindow (wc.lpszClassName, __T ("My Window"),
        WS_CAPTION | WS_BORDER | WS_VISIBLE, 100, 100, 200, 200, NULL, NULL, hInstance, 0);

    MSG msg;
    while (GetMessage (&msg, NULL, 0, 0))
        DispatchMessage (&msg);
    return 0;
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...