##
#include <windows.h> #include <tchar.h> HINSTANCE hInst; ATOM WindowRegister(WNDPROC lpfnWndProc, char *lpClname, HBRUSH hbrBack) { WNDCLASSEX wnd; wnd.cbClsExtra = 0; wnd.cbSize = sizeof(WNDCLASSEX); wnd.cbWndExtra = 0; wnd.hbrBackground = hbrBack; wnd.hCursor = LoadCursor(NULL, IDC_ARROW); wnd.hIcon = LoadIcon(NULL, IDI_APPLICATION); wnd.hIconSm = LoadIcon(NULL, IDI_APPLICATION); wnd.hInstance = hInst; wnd.lpfnWndProc = lpfnWndProc; wnd.lpszClassName = lpClname; wnd.lpszMenuName = NULL; wnd.style = CS_HREDRAW | CS_VREDRAW; return RegisterClassEx(&wnd); } LRESULT CALLBACK ClientProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { HWND hWndEdit; RECT rect; switch (uMsg) { case WM_CREATE: GetClientRect(hWnd, &rect); hWndEdit = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("Edit"), NULL, WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_AUTOVSCROLL | ES_AUTOHSCROLL | ES_MULTILINE, 0, 0, rect.right, rect.bottom, hWnd, NULL, hInst, NULL); return 0; case WM_SIZE: hWndEdit = GetWindow(hWnd, GW_CHILD); GetClientRect(hWnd, &rect); SetWindowPos(hWndEdit, NULL, 0, 0, rect.right, rect.bottom, SWP_NOMOVE | SWP_NOZORDER); break; case WM_MDIACTIVATE: return 0; } return DefMDIChildProc(hWnd, uMsg, wParam, lParam); } LRESULT CALLBACK WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { static HWND hClient; HMENU hMenu; MDICREATESTRUCT mdic; CLIENTCREATESTRUCT ccs; HWND hChild; switch (uMsg) { case WM_CREATE: WindowRegister(ClientProc, _T("Client"), (HBRUSH)GetStockObject(WHITE_BRUSH)); hMenu = CreateMenu(); AppendMenu(hMenu, MF_STRING, 1000, _T("New(&N)")); SetMenu(hWnd, hMenu); ccs.hWindowMenu = NULL; ccs.idFirstChild = 100; hClient = CreateWindow(_T("MDICLIENT"), NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN, 0, 0, 0, 0, hWnd, NULL, hInst, &ccs); return 0; case WM_DESTROY: PostQuitMessage(0); return 0; case WM_COMMAND: switch (LOWORD(wParam)) { case 1000: mdic.szClass = _T("Client"); mdic.szTitle = _T("Document"); mdic.hOwner = hInst; mdic.x = CW_USEDEFAULT; mdic.y = CW_USEDEFAULT; mdic.cx = CW_USEDEFAULT; mdic.cy = CW_USEDEFAULT; mdic.style = 0; mdic.lParam = 0; hChild = (HWND)SendMessage(hClient, WM_MDICREATE, 0, (LPARAM)&mdic); break; default: hChild = (HWND)SendMessage(hClient, WM_MDIGETACTIVE, 0, 0); if(IsWindow(hChild)) SendMessage(hChild, WM_COMMAND, wParam, lParam); break; } break; } return DefFrameProc(hWnd, hClient, uMsg, wParam, lParam); } INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nShowCmd) { MSG msg; HWND hClient; HWND hWnd; WindowRegister(WndProc, _T("Sample"), (HBRUSH)(COLOR_APPWORKSPACE + 1)); hInst = hInstance; hWnd = CreateWindow(_T("Sample"), _T("Sample"),WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN,100, 100, 500, 400, NULL, NULL, hInstance, NULL); if (!hWnd) return FALSE; hClient=GetWindow(hWnd, GW_CHILD); ShowWindow(hWnd, nShowCmd); UpdateWindow(hWnd); while (GetMessage(&msg, NULL, 0, 0)) { if (!TranslateMDISysAccel(hClient, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return msg.wParam; }