如何设置MDI客户端的大小和位置?

How to set size and position of a MDI Client?

似乎在使用 CreateWindow 时忽略了大小 (xy) 和位置 (nWidthnHeight) 参数。例如:

CreateWindow(L"MDICLIENT", L"", WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
             150, 10, 400, 300, hWnd, NULL, hInst, (LPVOID)&ccs);

它始终与左上角对齐并采用父项的大小,如下所示。

(我们可以看到差异,因为 window 背景是 COLOR_WINDOW)。

MDICLIENT的坐标对启动没有影响。相反,您必须按如下方式处理 WM_SIZE 中的客户端大小:

LRESULT CALLBACK FrameWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hwndClient;
    switch (message)
    {

    case WM_CREATE:
    {
        hwndClient = CreateWindow(L"MDICLIENT", L"", WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE,
            0, 0, 0, 0, hWnd, NULL, hInst, (LPVOID)&ccs);
        ...
        return 0;
    }

    case WM_SIZE:
    {
        RECT rc;
        GetClientRect(hwnd, &rc);

        SetWindowPos(hwndToolbar, 0, 0, 0, rc.right, 30, SWP_SHOWWINDOW);

        int x = 50; //right-edge of another toolbar...
        int y = 30;
        int w = rc.right - x;
        int h = rc.bottom - y;
        MoveWindow(hwndClient, x, y, w, h, 0);
        return 0;
    }
    ...
}

顺便说一下,除非您添加 MDI 子项,否则您在屏幕上不会真正看到任何差异。 MDI 子项将其移动限制在新区域,它不会越过工具栏。