1

を使用すると、サイズ(xy)と位置(nWidth、 )の両方のnHeight引数が無視されるようCreateWindowです。例えば:

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

以下に示すように、常に左上隅に配置され、親のサイズになります。

ここに画像の説明を入力

(ウィンドウの背景が であるため、違いがわかりますCOLOR_WINDOW)。

4

1 に答える 1

3

の座標はMDICLIENT起動には影響しません。代わりにWM_SIZE、次のように client-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 子はその移動を新しい領域に制限し、ツールバーを超えません。

于 2015-11-01T02:56:20.383 に答える