Code: Select all
#RICHEDIT = #WS_CHILD|#WS_VISIBLE|#WS_VSCROLL|#ES_MULTILINE|#ES_AUTOVSCROLL|#ES_NOHIDESEL
#WINDOW_PARAMETERS = #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget
#WindowWidth = 480
#WindowHeight = 320
#IDR_CHILDMENU = 102
#IDM_EXIT = 40001
#IDM_TILEHORZ = 40002
#IDM_TILEVERT = 40003
#IDM_CASCADE = 40004
#IDM_NEW = 40005
#IDM_CLOSE = 40006
DisableDebugger
; Not being called, but should be
Procedure.l MDIChildProc(hWnd.l, uMsg.l, EventwParam.l, EventlParam.l)
Select uMsg
Case #WM_MDIACTIVATE
Select EventlParam
Case hWnd
SendMessage_(MDIClient, #WM_MDISETMENU, hChildMenu, GetSubMenu_(hChildMenu, 1))
Default
SendMessage_(MDIClient, #WM_MDISETMENU, hMainMenu, GetSubMenu_(hMainMenu, 1))
EndSelect
DrawMenuBar_(MDIFrame)
Default
DefMDIChildProc_(hWnd, uMsg, EventwParam, EventlParam)
EndSelect
result = 0
ProcedureReturn result
EndProcedure
EnableDebugger
If CreateMenu(0)
MenuTitle("&File")
MenuItem(0, "&New")
MenuBar()
MenuItem(1, "&Close")
MenuBar()
MenuItem(2, "&Quit")
MenuTitle("&Windows")
MenuItem(3, "Tile horizontal")
MenuItem(4, "Tile vertical")
MenuItem(5, "Cascade")
EndIf
MDIFrame = OpenWindow(0,100,100, #WindowWidth, #WindowHeight, #WINDOW_PARAMETERS ,"MDI Frame Window")
If MDIFrame
AttachMenu(0, WindowID())
hInstance = GetModuleHandle_(0)
If LoadLibrary_("RICHED20.DLL")
RichClass.s = "RichEdit20A"
Else
If LoadLibrary_("RICHED32.DLL")
RichClass.s = "RichEdit"
Else
MessageRequester("Error", "RichEdit Windows library not present.", 0)
End
EndIf
EndIf
hChildMenu = LoadMenu_(hInstance, #IDR_CHILDMENU)
hMainMenu = GetMenu_(MDIFrame)
ShowWindow_(MDIFrame, #SW_SHOWNORMAL)
cs.CLIENTCREATESTRUCT
cs\hWindowMenu = GetSubMenu_(hMainMenu, 1)
cs\idFirstChild = 100
MDIClient = CreateWindowEx_(#WS_EX_CLIENTEDGE, "MDIClient", "MDI Client Window", #RICHEDIT, 1, 4, #WindowWidth-10, #WindowHeight-50, MDIFrame, 0, hInstance, @cs)
MDIChildTitle.s = "MDI Child"
mdc.MDICREATESTRUCT
mdc\szClass = @RichClass
mdc\szTitle = @MDIChildTitle
mdc\hOwner = hInstance
mdc\x = #CW_USEDEFAULT
mdc\y = #CW_USEDEFAULT
mdc\lx = #CW_USEDEFAULT
mdc\y = #CW_USEDEFAULT
mdc\style = #RICHEDIT
mdc\lParam = 0
EndIf
Repeat
uMsg = WaitWindowEvent()
hWnd = EventWindowID()
EventwParam = EventwParam()
EventlParam = EventlParam()
Select uMsg
Case #PB_EventMenu
Select EventMenuID()
Case 0 ; New
SendMessage_(MDIClient, #WM_MDICREATE, 0, @mdc)
; SetWindowLong_(SendMessage_(MDIClient, #WM_MDICREATE, 0, @mdc), #GWL_WNDPROC, @MDIChildProc()) ; This crashes the app, should call MDIChildProc()
Case 1 ; Close
If MessageBox_(hWnd, "Are you sure you want to close this window?", "Win32asm MDI Demo", #MB_YESNO) = #IDYES
SendMessage_(MDIClient, #WM_MDIDESTROY, SendMessage_(MDIClient, #WM_MDIGETACTIVE, 0, 0), 0) ; Not working, should close MDI child
EndIf
Case 2 ; Quit
Quit = 1
Case 3 ; Tile horizontal
SendMessage_(MDIClient, #WM_MDITILE, #MDITILE_HORIZONTAL,0)
Case 4 ; Tile vertical
SendMessage_(MDIClient, #WM_MDITILE, #MDITILE_VERTICAL,0)
Case 5 ; Cascade
SendMessage_(MDIClient, #WM_MDICASCADE, #MDITILE_SKIPDISABLED, 0)
EndSelect
Default
If uMsg#WM_CREATE And uMsg#WM_DESTROY
If uMsg=#WM_COMMAND
lParam.w = PeekW(EventlParam+2)
If lParam#IDM_EXIT And lParam#IDM_TILEHORZ And lParam#IDM_TILEVERT And lParam#IDM_CASCADE And lParam#IDM_NEW And lParam#IDM_CLOSE
result = DefFrameProc_(hWnd, MDIClient, uMsg, EventwParam, EventlParam)
EndIf
Else
DefFrameProc_(hWnd, MDIClient, uMsg, EventwParam, EventlParam)
EndIf
EndIf
EndSelect
Until uMsg = #PB_EventCloseWindow
End