winapi - Win32Api 窗口移动
问题描述
按下鼠标中键时如何移动窗口?
如果使用鼠标左键,它将是
case WM_LBUTTONDOWN:
{
SendMessage(hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0);
}
return 0;
但它不适用于中间按钮
case WM_MBUTTONDOWN:
{
SendMessage(hwnd, WM_NCMBUTTONDOWN, HTCAPTION, 0);
}
return 0;
但我不确定 WM_NCMBUTTONDOWN
我没有变种,需要帮助
解决方案
恐怕你必须以艰难的方式做到这一点。我尝试了所有明显的东西,如果你想用鼠标左键以外的任何东西拖动窗口,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;
}
希望这可以帮助。
推荐阅读
- r - 使用 dplyr 在 R 中插入新行而不指定列名
- spring-boot - 连接 react-native、springboot
- javascript - IDBIndex.getAll() 是否返回排序列表?
- c# - 在 C# 中分配没有多个 for 循环的 StackElements
- java - Mapstruct 忽略 @BeanMappingqualifiedByName
- intellij-idea - 用于嵌套构建器的 Intellij Idea 代码标识
- c# - 我可以让我的代码不接受除 int C# 之外的任何输入吗
- single-page-application - 仅针对静态内容的 Web 服务器瓶颈
- c# - 如何将第一行保持在顶部,并且只滚动网格中第二行的内容
- google-chrome - 如何在 Windows 10 中禁用 Chrome 菜单右上角的无法更新 Chrome 警告?