【问题标题】:Setting client area size (after creation)?设置客户区大小(创建后)?
【发布时间】:2017-09-18 11:32:41
【问题描述】:

我想在主窗口创建后调整客户区的高度。我在创建它时使用CW_USEDEFAULT,我只是想将其调整到最接近的高度,该高度可以被一个固定的数字整除。我已经尝试处理WM_SIZE,但它似乎不像我想要的那样工作,而且我不确定SetWindowPos 是调整client 区域大小的适当方法。 . ?

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 top / bottom 成员时 WM_NCCALCSIZE 已发送。
  • WM_CREATE 时更改CREATESTRUCTcy 成员 消息已发送。

有什么想法吗?

【问题讨论】:

  • 需要调用return DefWindowProc(hWnd, message, wParam, lParam) 而不是return 0
  • @RbMm 得到相同的结果..
  • 使用SetWindowPos
  • @PaulOgilvie 这就是我目前正在做的事情?
  • 对我来说听起来像是 XY 问题。如果您想调整窗口大小以使客户区具有特定大小,请在构建窗口之前调用AdjustWindowRectEx

标签: c user-interface winapi


【解决方案1】:

我使用以下内容,但不是来自 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);                         

【讨论】:

  • 如果您的线程支持 DPI,这将不起作用。您应该改用 AdjustWindowRectExForDpi。
  • 函数 AdjustWindowRectExForDpi 可从 Windows 10 1607 获得,旨在开发“桌面应用程序以动态处理显示比例因子 (DPI) 变化,使其应用​​程序在任何显示器上都清晰可见呈现在。”
【解决方案2】:

我意识到我的 if 语句没有按预期工作,因为当 SetWindowPos 用于更新 窗口时,它实际上设置了 全窗口高度,而 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;

【讨论】:

    猜你喜欢
    • 2011-01-08
    • 2011-06-18
    • 2010-10-14
    • 2011-01-09
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多