我想在创建主窗口后调整客户区的高度。我在创建它时使用CW_USEDEFAULT
,我只想将其调整到最接近的高度,该高度可以被固定数字整除。我已经尝试过处理WM_SIZE
,但它似乎没有像我想要的那样工作,而且我不确定SetWindowPos
是调整客户端的适当方法 area ..?
LRESULT CALLBACK mainWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message) {
case WM_SIZE:
if (HIWORD(lParam) % 15) {
SetWindowPos(hWnd, NULL, 0, 0, LOWORD(lParam), HIWORD(lParam) / 15 * 15, SWP_NOMOVE);
}
return DefWindowProc(hWnd, message, wParam, lParam);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
break;
}
return 0;
}
由于某种原因,结果是零高度客户区:
我尝试过的另外两种方法:
RECT
热门 / 底部成员时
WM_NCCALCSIZE
已发送。cy
时更改CREATESTRUCT
的{{1}}成员
消息已发送。有什么想法吗?
答案 0 :(得分:0)
我使用以下内容,但不是来自WM_SIZE消息,只是来自函数:
=:=
答案 1 :(得分:-1)
我意识到我的if语句没有按预期工作,因为当SetWindowPos
用于更新 main 窗口时,它实际上设置了完整窗口高度,而HIWORD(lParam)
只是客户区高度。在我的情况下(Windows 7),客户端区域和完整窗口高度根本不会在任何时候都可被15整除,因此它基本上会保持循环。所以这是我的解决方案:
int initSize = 0; /* global */
/* ... */
case WM_SIZE:
if (!initSize && HIWORD(lParam) % 15) {
RECT r;
GetClientRect(hWnd, &r);
r.bottom = r.top + (HIWORD(lParam) / 15 * 15);
AdjustWindowRect(&r, GetWindowLong(hWnd, GWL_STYLE), TRUE);
SetWindowPos(hWnd, NULL, 0, 0, r.right - r.left, r.bottom - r.top, SWP_NOZORDER|SWP_NOACTIVATE|SWP_NOMOVE);
initSize = 1;
}
return DefWindowProc(hWnd, message, wParam, lParam);
break;