设置客户区大小(创建后)?

时间:2017-04-21 12:48:16

标签: c user-interface winapi

我想在创建主窗口后调整客户区的高度。我在创建它时使用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;
}

由于某种原因,结果是零高度客户区:

Test

我尝试过的另外两种方法:

  • 更新RECT 热门 / 底部成员时 WM_NCCALCSIZE已发送。
  • cy时更改CREATESTRUCT的{​​{1}}成员 消息已发送。

有什么想法吗?

2 个答案:

答案 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;