我在WINAPI项目上遇到了麻烦。有两个问题,当我用下面的代码启动一个窗口时,高度参数的行为很奇怪。它似乎上限在1092,18像素以下,我需要它在我的电脑。第二个问题是,窗口没有边缘,也没有顶部菜单栏,直到我使用Windows+上/下键组合来最小化和最大化它,然后它才能正常工作。我使用下面的代码初始化窗口(在初始化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);窗口程序如下:
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;
}发布于 2014-11-16 13:40:00
Windows有两个不同的矩形:
通过调用AdjustWindowRect,您将客户端矩形转换为窗口矩形。因此,如果要设置与整个屏幕一样大的客户端矩形,将其转换为窗口矩形并创建具有此大小的窗口,则边框和菜单不可见。如果在使用调试器调用wndRect之后查看AdjustWindowRect(..),您将看到top和left是负的。
窗口高度被某些像素关闭是默认的窗口行为。默认情况下,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;如果您只想启动您的窗口,或者最大化(所有控件和边界可见),或者在其他定义的位置启动窗口,只需执行以下操作:通常使用在if (options.fullscreen)的其他部分内初始化的if (options.fullscreen)创建窗口,并按如下方式更改ShowWindow(..)的调用:
if (options.fullscreen)
{
ShowWindow(hWnd, SW_MAXIMIZE);
}
else
{
ShowWindow(hWnd, SW_SHOWDEFAULT);
}
UpdateWindow(hWnd);https://stackoverflow.com/questions/26953592
复制相似问题