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;