gpt4 book ai didi

c++ - WINAPI CreateWindow 显示奇怪的结果

转载 作者:太空宇宙 更新时间:2023-11-04 08:34:20 24 4
gpt4 key购买 nike

我在使用 WINAPI 项目时遇到问题。有两个问题,当我用下面的代码启动一个窗口时,高度参数表现得很奇怪。它似乎以 1092 为上限,比我在计算机上需要的位置低 18 个像素。第二个问题是窗口没有边缘,也没有顶部菜单栏,直到我使用 Windows+Up/Down 组合键最小化和最大化它,然后它才正常运行。我正在使用下面的代码来初始化窗口(在此之前运行的唯一代码初始化 options.pxXRes 和下面使用的其他变量):

//Set up the window class
WNDCLASSEX wndClass;
wndClass.cbSize = sizeof(WNDCLASSEX);
wndClass.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
wndClass.lpfnWndProc = &WndHandleInput;
wndClass.cbClsExtra = 0;
wndClass.cbWndExtra = 0;
wndClass.hInstance = GetModuleHandle(nullptr);


wndClass.hIcon = nullptr;
wndClass.hCursor = LoadCursor(nullptr, IDC_ARROW);
wndClass.hbrBackground = (HBRUSH)(COLOR_BACKGROUND + 1);
wndClass.lpszMenuName = nullptr;
wndClass.lpszClassName = "ToastCatClass";
wndClass.hIconSm = nullptr;

RegisterClassEx(&wndClass);

RECT wndRect;
if (options.fullscreen) {
wndRect.left = 0;
wndRect.right = options.pxXRes;
wndRect.top = 0;
wndRect.bottom = options.pxYRes;
AdjustWindowRect(&wndRect, WS_OVERLAPPEDWINDOW, false);
} else {
wndRect.left = (GetPXXRes() - options.pxXRes) / 2;
wndRect.right = options.pxXRes;
wndRect.top = (GetPXYRes() - options.pxYRes) / 2;
wndRect.bottom = options.pxYRes;
AdjustWindowRect(&wndRect, WS_OVERLAPPEDWINDOW, false);
}

hWnd = CreateWindowEx(
0,
wndClass.lpszClassName,
"ToastCat",
WS_OVERLAPPEDWINDOW,
wndRect.left,
wndRect.top,
wndRect.right - wndRect.left,
wndRect.bottom - wndRect.top,
nullptr,
nullptr,
wndClass.hInstance,
nullptr
);

assert(hWnd != nullptr, "Failure to launch window.");

ShowWindow(hWnd, SW_SHOWDEFAULT);
UpdateWindow(hWnd);

Window过程如下:

LRESULT __stdcall WndHandleInput(HWND hWndParam, UINT msg, WPARAM wParam, LPARAM lParam) {
switch (msg) {
case WM_NCCREATE:
return true;
case WM_KEYDOWN:
switch (wParam) {
//TODO: Update controls
}
break;
case WM_KEYUP:
switch (wParam) {
//TODO: Update controls
}
break;
case WM_CLOSE:
case WM_QUIT:
Cleanup();
break;
default:
return DefWindowProc(hWnd, msg, wParam, lParam);
}

return 0;
}

最佳答案

Windows 有两个不同的矩形:

  • 客户端矩形,它是应用程序可以在其中绘制或创建子窗口的窗口区域
  • 窗口矩形,它是窗口的外部矩形(包括边框、菜单...)。

通过调用 AdjustWindowRect,您可以将客户端矩形转换为窗口矩形。因此,如果您正在设置与整个屏幕一样大的客户端矩形,将其转换为窗口矩形并创建具有这样大小的窗口,则边框和菜单将不可见。如果您在使用调试器调用 AdjustWindowRect(..) 之后查看 wndRect,您将看到 topleft 是否定的。

窗口高度偏离一些像素是默认的窗口行为。默认情况下,Windows 不允许窗口的高度大于屏幕高度,因为这会将标题移出鼠标可以到达的区域。要更改此设置,您必须处理消息 WM_GETMINMAXINFO:

case WM_GETMINMAXINFO:
DefWindowProc(hWnd, msg, wParam, lParam);
MINMAXINFO *pmmi = (MINMAXINFO*)lParam;
pmmi->ptMaxTrackSize.x *= 2; // just make it bigger...
pmmi->ptMaxTrackSize.y *= 2; //
return 0;

如果您只想以最大化(所有控件和边框可见)或在其他定义的位置启动窗口,只需执行以下操作:使用在 else 中初始化的 wndRect 正常创建窗口- if (options.fullscreen) 的一部分,并将 ShowWindow(..) 的调用更改为如下:

if (options.fullscreen)
{
ShowWindow(hWnd, SW_MAXIMIZE);
}
else
{
ShowWindow(hWnd, SW_SHOWDEFAULT);
}
UpdateWindow(hWnd);

关于c++ - WINAPI CreateWindow 显示奇怪的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26953592/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com