21xrx.com
2024-12-23 02:57:11 Monday
登录
文章检索 我的文章 写文章
C++窗口移动核心代码
2023-07-05 07:55:39 深夜i     --     --
C++ 窗口移动 核心代码

C++是一种常用的编程语言,广泛应用于各种软件开发领域。在窗口应用开发中,窗口的移动是一个常见的需求。下面介绍一下C++窗口移动的核心代码。

窗口移动的实现主要通过捕获窗口的鼠标事件来实现。例如,当鼠标按下左键并移动时,窗口就会跟随鼠标的移动而进行移动。C++中可以通过以下代码实现这个功能:

首先,在窗口类中添加如下成员变量和方法:

private:

  bool dragging;

  POINT lastCursorPosition;

  void onMouseDown(WPARAM buttonState, int x, int y);

  void onMouseMove(WPARAM buttonState, int x, int y);

  void onMouseUp(WPARAM buttonState, int x, int y);

dragging用来表示当前是否处于移动状态,lastCursorPosition用来保存上一个鼠标位置。

然后,在窗口类的构造函数中注册鼠标事件:

WNDCLASSEX windowClass;

//...

windowClass.lpfnWndProc = windowProc; //窗口消息处理函数

//...

RegisterClassEx(&windowClass);

//创建窗口

HWND hWnd = CreateWindowEx(

  0,

  "WindowClass",

  "WindowTitle",

  WS_OVERLAPPEDWINDOW,

  CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,

  NULL, NULL, hInstance, NULL);

//注册鼠标事件

SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR)this);

SetWindowLongPtr(hWnd, GWLP_WNDPROC, (LONG_PTR)windowProc);

其中,windowProc是窗口类的处理函数,在该函数中处理鼠标事件。

最后,在窗口类的实现文件中添加如下代码:

void Window::onMouseDown(WPARAM buttonState, int x, int y)

{

  if (buttonState & MK_LBUTTON)

    dragging = true;

    lastCursorPosition.x = x;

    lastCursorPosition.y = y;

}

void Window::onMouseMove(WPARAM buttonState, int x, int y)

{

  if (dragging)

  {

    int deltaX = x - lastCursorPosition.x;

    int deltaY = y - lastCursorPosition.y;

    //移动窗口

    SetWindowPos(hWnd, NULL, 0, 0, width, height, SWP_NOMOVE | SWP_NOZORDER);

    SetWindowPos(hWnd, NULL, x - deltaX, y - deltaY, width, height, SWP_NOZORDER);

    lastCursorPosition.x = x;

    lastCursorPosition.y = y;

  }

}

void Window::onMouseUp(WPARAM buttonState, int x, int y)

  dragging = false;

LRESULT CALLBACK Window::windowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)

{

  Window* window = (Window*)GetWindowLongPtr(hWnd, GWLP_USERDATA);

  if (window == NULL)

  {

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

  }

  switch (uMsg)

  {

  case WM_DESTROY:

    PostQuitMessage(0);

    break;

  case WM_MOUSEMOVE:

    window->onMouseMove(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));

    break;

  case WM_LBUTTONDOWN:

    window->onMouseDown(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));

    break;

  case WM_LBUTTONUP:

    window->onMouseUp(wParam, GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam));

    break;

  }

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

}

在windowProc函数中处理鼠标事件的消息。在鼠标按下事件中设置dragging为true并保存当前鼠标位置,然后在鼠标移动事件中计算鼠标位置的变化量,然后利用SetWindowPos函数移动窗口。在鼠标松开事件中设置dragging为false。

通过以上代码实现了C++窗口的移动功能。通过这种方法,可以轻松地实现窗口的拖动、缩放等功能。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复