如何设置MDI客户端的大小和位置?
How to set size and position of a MDI Client?
似乎在使用 CreateWindow
时忽略了大小 (x
、y
) 和位置 (nWidth
、nHeight
) 参数。例如:
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 子项将其移动限制在新区域,它不会越过工具栏。
似乎在使用 CreateWindow
时忽略了大小 (x
、y
) 和位置 (nWidth
、nHeight
) 参数。例如:
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 子项将其移动限制在新区域,它不会越过工具栏。