View -> Opit порождает окно (cwcn), которое, по сути, есть оболочка вокруг дочернего окна (dccn). То есть основная функциональность именно на ребёнке. Задача cwcn в том, чтобы при его растяжении и т.п. dccn так же менял свой размер. Так вот, при разворачивании cwcn пропадают кнопки сворачивания, восстановления и закрытия. (Если убрать dccn, то всё в порядке) Вопрос - как корректно развернуть dccn? То, что есть: Код (Text): .486 .model flat, stdcall option casemap: none .nolist include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc .listall includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib QuitID equ 104 OpitID equ 105 .data? hwndClient dd ? mes MSG <?> .data wcx WNDCLASSEX <sizeof wcx, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS, offset mwp, 0, 0, ?, ?, ?, COLOR_APPWORKSPACE + 1, 0, offset mwcn, ?> mwcap db 'This does not work correctly', 0 vrwn db 'Child', 0 mwcn db 'mwcn', 0 cwcn db 'cwcn', 0 mdiccn db 'MDICLIENT', 0 dccn db 'dccn', 0 mvwn db '&View', 0 opit db '&Opit', 0 mwndn db '&Window', 0 mqtn db '&Quit', 0 .code mw_create proc hw: HWND local ccs: CLIENTCREATESTRUCT local h: dword local hView: dword invoke CreatePopupMenu mov ccs.hWindowMenu, eax invoke CreatePopupMenu mov hView, eax invoke AppendMenu, hView, MF_STRING, OpitID, offset opit invoke CreateMenu mov h, eax invoke AppendMenu, h, MF_POPUP or MF_STRING, hView, offset mvwn invoke AppendMenu, h, MF_POPUP or MF_STRING, ccs.hWindowMenu, offset mwndn invoke AppendMenu, h, MF_STRING, QuitID, offset mqtn invoke SetMenu, hw, h mov ccs.idFirstChild, 1635h invoke CreateWindowEx, 0, offset mdiccn, 0, WS_CHILD or WS_CLIPCHILDREN or WS_CLIPSIBLINGS or WS_VISIBLE, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, hw, 0, wcx.hInstance, addr ccs mov hwndClient, eax ret mw_create endp mw_command proc hw: HWND, ms: UINT, wp: WPARAM, lp: LPARAM local mdics: MDICREATESTRUCT movzx eax, word ptr wp + 2 test eax, eax jnz @def movzx eax, word ptr wp cmp eax, OpitID jne @notregs mov mdics.szClass, offset cwcn mov mdics.szTitle, offset vrwn mov eax, wcx.hInstance mov mdics.hOwner, eax mov mdics.x, CW_USEDEFAULT mov mdics.y, CW_USEDEFAULT mov mdics.lx, CW_USEDEFAULT mov mdics.ly, CW_USEDEFAULT mov mdics.style, 0 invoke SendMessage, hwndClient, WM_MDICREATE, 0, addr mdics jmp @ok @notregs: cmp eax, QuitID jne @def invoke PostQuitMessage, 0 jmp @ok @def: invoke DefFrameProc, hw, hwndClient, ms, wp, lp jmp @ret @ok: xor eax, eax @ret: ret mw_command endp mwp proc hw: HWND, ms: UINT, wp: WPARAM, lp: LPARAM cmp ms, WM_COMMAND jne @F invoke mw_command, hw, ms, wp, lp jmp @ret @@: cmp ms, WM_DESTROY jne @F invoke PostQuitMessage, 0 jmp @ok @@: cmp ms, WM_CREATE jne @F invoke mw_create, hw jmp @ok @@: invoke DefFrameProc, hw, hwndClient, ms, wp, lp jmp @ret @ok: xor eax, eax @ret: ret mwp endp cw_create proc hw: HWND, lp: LPARAM local crect: RECT invoke GetClientRect, hw, addr crect invoke CreateWindowEx, 0, offset dccn, 0, WS_CHILD or WS_VISIBLE, 0, 0, crect.right, crect.bottom, hw, 0, wcx.hInstance, 0 invoke SetWindowLong, hw, GWL_USERDATA, eax ret cw_create endp cw_size proc hw: HWND, wp: WPARAM local crect: RECT invoke GetClientRect, hw, addr crect invoke GetWindowLong, hw, GWL_USERDATA invoke MoveWindow, eax, crect.left, crect.top, crect.right, crect.bottom, 1 ret cw_size endp cwp proc hw: HWND, ms: UINT, wp: WPARAM, lp: LPARAM cmp ms, WM_SIZE jne @F invoke cw_size, hw, wp jmp @ok @@: cmp ms, WM_CREATE jne @F invoke cw_create, hw, lp jmp @ok @@: invoke DefMDIChildProc, hw, ms, wp, lp jmp @ret @ok: xor eax, eax @ret: ret cwp endp dwp proc hw: HWND, ms: UINT, wp: WPARAM, lp: LPARAM invoke DefWindowProc, hw, ms, wp, lp ret dwp endp @: invoke GetModuleHandle, 0 mov wcx.hInstance, eax invoke LoadCursor, 0, IDC_ARROW mov wcx.hCursor, eax invoke LoadIcon, 0, IDI_APPLICATION mov wcx.hIcon, eax mov wcx.hIconSm, eax invoke RegisterClassEx, offset wcx mov wcx.lpszClassName, offset cwcn mov wcx.lpfnWndProc, offset cwp invoke RegisterClassEx, offset wcx mov wcx.lpszClassName, offset dccn mov wcx.lpfnWndProc, offset dwp mov wcx.hbrBackground, COLOR_WINDOW + 1 invoke RegisterClassEx, offset wcx invoke CreateWindowEx, WS_EX_OVERLAPPEDWINDOW, offset mwcn, offset mwcap, WS_OVERLAPPEDWINDOW or WS_CLIPSIBLINGS or WS_SIZEBOX or WS_CLIPCHILDREN, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, 0, 0, wcx.hInstance, 0 invoke ShowWindow, eax, SW_SHOWDEFAULT @@: invoke GetMessage, offset mes, 0, 0, 0 inc eax jz @F dec eax jz @F invoke TranslateMDISysAccel, hwndClient, offset mes jnz @B invoke TranslateMessage, offset mes invoke DispatchMessage, offset mes jmp @B @@: invoke ExitProcess, 0 end @ Также пробовалось: Код (Text): cw_size proc hw: HWND, wp: WPARAM local crect: RECT invoke GetClientRect, hw, addr crect invoke GetWindowLong, hw, GWL_USERDATA cmp wp, SIZE_MAXIMIZED je @F invoke MoveWindow, eax, crect.left, crect.top, crect.right, crect.bottom, 1 jmp @ret @@: invoke ShowWindow, eax, SW_MAXIMIZE @ret: ret cw_size endp В ответ хотелось бы видеть корректную cw_size. UPD: проблемка решена тем, что после cw_size управление передавалось на DefMDIChildProc.