C 设置客户端区域大小(创建后)?
我想在创建主窗口后调整客户端区域的高度。我在创建它时使用了C 设置客户端区域大小(创建后)?,c,user-interface,winapi,C,User Interface,Winapi,我想在创建主窗口后调整客户端区域的高度。我在创建它时使用了CW\u usefault,我只想将它调整到最接近的高度,这个高度可以被一个固定的数字整除。我已经尝试过处理WM_SIZE,但它似乎不像我希望的那样工作,而且我也不确定SetWindowPos是否是调整客户端区域大小的合适方法 由于某些原因,结果是零高度客户端区域: 我尝试过的另外两种方法: 更新RECT顶部/底部成员时 WM\u NCCALCSIZE已发送 当WM\u CREATE 消息已发送 有什么想法吗?我使用了以下内容,但不
CW\u usefault
,我只想将它调整到最接近的高度,这个高度可以被一个固定的数字整除。我已经尝试过处理WM_SIZE
,但它似乎不像我希望的那样工作,而且我也不确定SetWindowPos
是否是调整客户端区域大小的合适方法
由于某些原因,结果是零高度客户端区域:
我尝试过的另外两种方法:
- 更新
顶部/底部成员时RECT
已发送WM\u NCCALCSIZE
- 当
消息已发送WM\u CREATE
有什么想法吗?我使用了以下内容,但不是来自WM_SIZE消息,而是来自函数:
r= <a rect with the size you want>;
/* Compute the size of the window rectangle based on the given
* client rectangle size and the window style, then size the
* client window.
*/
AdjustWindowRect (&r, GetWindowLong(hWnd, GWL_STYLE), FALSE);
SetWindowPos (hWnd, 0,
r.left, r.top,
r.right - r.left,
r.bottom - r.top,
SWP_NOZORDER | SWP_NOACTIVATE);
UpdateWindow(hWnd);
r=;
/*根据给定的值计算窗口矩形的大小
*客户端矩形大小和窗口样式,然后调整
*客户端窗口。
*/
AdjustWindowRect(&r,GetWindowLong(hWnd,GWL_样式),FALSE);
设置窗口位置(hWnd,0,
r、 左,右上,
r、 右-右-左,
r、 底部-右侧顶部,
SWP_NOZORDER | SWP_NOACTIVATE);
更新窗口(hWnd);
我意识到我的if语句没有按预期工作,因为当使用SetWindowPos
更新主窗口时,它实际上设置了整个窗口的高度,而HIWORD(lParam)
只是客户端区域的高度。在我的例子(Windows7)中,客户端区域和整个窗口高度在任何一点上都不能被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;
需要调用
return DefWindowProc(hWnd,message,wParam,lParam)
而不是return 0
@RbMm以获得相同的结果..使用SetWindowPos
@PaulOgilvie这就是我目前正在做的事情?听起来像是XY问题。如果要调整窗口大小,使客户端区域具有特定大小,请在构造窗口之前调用。如果线程支持DPI,则此操作无效。您应该改用AdjustWindowRectExForDpi。Windows 10 1607提供了功能AdjustWindowRectExForDpi
,该功能旨在开发“动态处理显示比例因子(DPI)变化的桌面应用程序,使其应用程序在任何显示上都清晰可见。”
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;