MDIChild child

Тема в разделе "WASM.BEGINNERS", создана пользователем JAPH, 16 июл 2007.

  1. JAPH

    JAPH New Member

    Публикаций:
    0
    Регистрация:
    23 июн 2007
    Сообщения:
    124
    View -> Opit порождает окно (cwcn), которое, по сути, есть оболочка вокруг дочернего окна (dccn). То есть основная функциональность именно на ребёнке. Задача cwcn в том, чтобы при его растяжении и т.п. dccn так же менял свой размер. Так вот, при разворачивании cwcn пропадают кнопки сворачивания, восстановления и закрытия. (Если убрать dccn, то всё в порядке)
    Вопрос - как корректно развернуть dccn?

    То, что есть:
    Код (Text):
    1.         .486
    2.         .model  flat, stdcall
    3.         option  casemap: none
    4.         .nolist
    5. include     \masm32\include\windows.inc
    6. include     \masm32\include\kernel32.inc
    7. include     \masm32\include\user32.inc
    8.         .listall
    9. includelib  \masm32\lib\kernel32.lib
    10. includelib  \masm32\lib\user32.lib
    11. QuitID      equ     104
    12. OpitID      equ     105
    13.         .data?
    14. hwndClient  dd      ?
    15. mes     MSG     <?>
    16.         .data
    17. wcx     WNDCLASSEX  <sizeof wcx, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS, offset mwp, 0, 0, ?, ?, ?, COLOR_APPWORKSPACE + 1, 0, offset mwcn, ?>
    18. mwcap       db      'This does not work correctly', 0
    19. vrwn        db      'Child', 0
    20. mwcn        db      'mwcn', 0
    21. cwcn        db      'cwcn', 0
    22. mdiccn      db      'MDICLIENT', 0
    23. dccn        db      'dccn', 0
    24. mvwn        db      '&View', 0
    25. opit        db      '&Opit', 0
    26. mwndn       db      '&Window', 0
    27. mqtn        db      '&Quit', 0
    28.         .code
    29. mw_create   proc    hw: HWND
    30.         local   ccs: CLIENTCREATESTRUCT
    31.         local   h: dword
    32.         local   hView: dword
    33.         invoke  CreatePopupMenu
    34.         mov ccs.hWindowMenu, eax
    35.         invoke  CreatePopupMenu
    36.         mov hView, eax
    37.         invoke  AppendMenu, hView, MF_STRING, OpitID, offset opit
    38.         invoke  CreateMenu
    39.         mov h, eax
    40.         invoke  AppendMenu, h, MF_POPUP or MF_STRING, hView, offset mvwn
    41.         invoke  AppendMenu, h, MF_POPUP or MF_STRING, ccs.hWindowMenu, offset mwndn
    42.         invoke  AppendMenu, h, MF_STRING, QuitID, offset mqtn
    43.         invoke  SetMenu, hw, h
    44.         mov ccs.idFirstChild, 1635h
    45.         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
    46.         mov hwndClient, eax
    47.         ret
    48. mw_create   endp
    49. mw_command  proc    hw: HWND, ms: UINT, wp: WPARAM, lp: LPARAM
    50.         local   mdics: MDICREATESTRUCT
    51.         movzx   eax, word ptr wp + 2
    52.         test    eax, eax
    53.         jnz @def
    54.         movzx   eax, word ptr wp
    55.         cmp eax, OpitID
    56.         jne @notregs
    57.         mov mdics.szClass, offset cwcn
    58.         mov mdics.szTitle, offset vrwn
    59.         mov eax, wcx.hInstance
    60.         mov mdics.hOwner, eax
    61.         mov mdics.x, CW_USEDEFAULT
    62.         mov mdics.y, CW_USEDEFAULT
    63.         mov mdics.lx, CW_USEDEFAULT
    64.         mov mdics.ly, CW_USEDEFAULT
    65.         mov mdics.style, 0
    66.         invoke  SendMessage, hwndClient, WM_MDICREATE, 0, addr mdics
    67.         jmp @ok
    68. @notregs:   cmp eax, QuitID
    69.         jne @def
    70.         invoke  PostQuitMessage, 0
    71.         jmp @ok
    72. @def:       invoke  DefFrameProc, hw, hwndClient, ms, wp, lp
    73.         jmp @ret
    74. @ok:        xor eax, eax
    75. @ret:       ret
    76. mw_command  endp
    77. mwp     proc    hw: HWND, ms: UINT, wp: WPARAM, lp: LPARAM
    78.         cmp ms, WM_COMMAND
    79.         jne @F
    80.         invoke  mw_command, hw, ms, wp, lp
    81.         jmp @ret
    82. @@:     cmp ms, WM_DESTROY
    83.         jne @F
    84.         invoke  PostQuitMessage, 0
    85.         jmp @ok
    86. @@:     cmp ms, WM_CREATE
    87.         jne @F
    88.         invoke  mw_create, hw
    89.         jmp @ok
    90. @@:     invoke  DefFrameProc, hw, hwndClient, ms, wp, lp
    91.         jmp @ret
    92. @ok:        xor eax, eax
    93. @ret:       ret
    94. mwp     endp
    95. cw_create   proc    hw: HWND, lp: LPARAM
    96.         local   crect: RECT
    97.         invoke  GetClientRect, hw, addr crect
    98.         invoke  CreateWindowEx, 0, offset dccn, 0, WS_CHILD or WS_VISIBLE, 0, 0, crect.right, crect.bottom, hw, 0, wcx.hInstance, 0
    99.         invoke  SetWindowLong, hw, GWL_USERDATA, eax
    100.         ret
    101. cw_create   endp
    102. cw_size     proc    hw: HWND, wp: WPARAM
    103.         local   crect: RECT
    104.         invoke  GetClientRect, hw, addr crect
    105.         invoke  GetWindowLong, hw, GWL_USERDATA
    106.         invoke  MoveWindow, eax, crect.left, crect.top, crect.right, crect.bottom, 1
    107.         ret
    108. cw_size     endp
    109. cwp     proc    hw: HWND, ms: UINT, wp: WPARAM, lp: LPARAM
    110.         cmp ms, WM_SIZE
    111.         jne @F
    112.         invoke  cw_size, hw, wp
    113.         jmp @ok
    114. @@:     cmp ms, WM_CREATE
    115.         jne @F
    116.         invoke  cw_create, hw, lp
    117.         jmp @ok
    118. @@:     invoke  DefMDIChildProc, hw, ms, wp, lp
    119.         jmp @ret
    120. @ok:        xor eax, eax
    121. @ret:       ret
    122. cwp     endp
    123. dwp     proc    hw: HWND, ms: UINT, wp: WPARAM, lp: LPARAM
    124.         invoke  DefWindowProc, hw, ms, wp, lp
    125.         ret
    126. dwp     endp
    127. @:      invoke  GetModuleHandle, 0
    128.         mov wcx.hInstance, eax
    129.         invoke  LoadCursor, 0, IDC_ARROW
    130.         mov wcx.hCursor, eax
    131.         invoke  LoadIcon, 0, IDI_APPLICATION
    132.         mov wcx.hIcon, eax
    133.         mov wcx.hIconSm, eax
    134.         invoke  RegisterClassEx, offset wcx
    135.         mov wcx.lpszClassName, offset cwcn
    136.         mov wcx.lpfnWndProc, offset cwp
    137.         invoke  RegisterClassEx, offset wcx
    138.         mov wcx.lpszClassName, offset dccn
    139.         mov wcx.lpfnWndProc, offset dwp
    140.         mov wcx.hbrBackground, COLOR_WINDOW + 1
    141.         invoke  RegisterClassEx, offset wcx
    142.         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
    143.         invoke  ShowWindow, eax, SW_SHOWDEFAULT
    144. @@:     invoke  GetMessage, offset mes, 0, 0, 0
    145.         inc eax
    146.         jz  @F
    147.         dec eax
    148.         jz  @F
    149.         invoke  TranslateMDISysAccel, hwndClient, offset mes
    150.         jnz @B
    151.         invoke  TranslateMessage, offset mes
    152.         invoke  DispatchMessage, offset mes
    153.         jmp @B
    154. @@:     invoke  ExitProcess, 0
    155.         end @
    Также пробовалось:
    Код (Text):
    1. cw_size     proc    hw: HWND, wp: WPARAM
    2.         local   crect: RECT
    3.         invoke  GetClientRect, hw, addr crect
    4.         invoke  GetWindowLong, hw, GWL_USERDATA
    5.         cmp wp, SIZE_MAXIMIZED
    6.         je  @F
    7.         invoke  MoveWindow, eax, crect.left, crect.top, crect.right, crect.bottom, 1
    8.         jmp @ret
    9. @@:     invoke  ShowWindow, eax, SW_MAXIMIZE
    10. @ret:       ret
    11. cw_size     endp
    В ответ хотелось бы видеть корректную cw_size.

    UPD: проблемка решена тем, что после cw_size управление передавалось на DefMDIChildProc.