📄 mdi.asm
字号:
include head.inc
WinMain proto :DWORD,:DWORD,:DWORD,:DWORD
.const
IDR_MAIN equ 101
IDR_CHILDTEXT equ 102
IDR_CHILDGRAPHICS equ 103
IDM_GRAPHICS equ 40001
IDM_TEXT equ 40002
IDM_NEWTEXT equ 40003
IDM_NEWGRAPHICS equ 40004
IDM_CLOSE equ 40005
IDM_EXIT equ 40006
IDM_TILEHORZ equ 40007
IDM_TILEVERT equ 40008
IDM_CASCADE equ 40009
WM_MDICHILD equ WM_USER+1
.data
ClassName db "FrameClass",0
MDIClientClassName db "MDICLIENT",0
MDIChildClassName db "ChildClass",0
MDIChildTextTitle db "文本子窗口",0
MDIChildGraphicsTitle db "图形子窗口",0
TitleName db "多文档框架-客户融合",0
ClosePromptMessage db "退出当前子窗口?",0
Buffer db 3 dup(0)
Compare db "文",0
ChildWindowContent db "自定义消息传递的文本内容!",0
.data?
hInstance dd ?
hwndFrame dd ?
hMainMenu dd ?
hwndClient dd ?
hChildTextMenu dd ?
hChildGraphicsMenu dd ?
mcsText MDICREATESTRUCT <>
mcsGraphics MDICREATESTRUCT <>
.code
start:
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke WinMain, hInstance,NULL,NULL, SW_SHOWDEFAULT
invoke ExitProcess,eax
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
LOCAL wc:WNDCLASSEX
LOCAL childwc:WNDCLASSEX
LOCAL msg:MSG
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
invoke GetStockObject,WHITE_BRUSH
mov wc.hbrBackground,eax
mov wc.lpszMenuName,IDR_MAIN
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,NULL,IDI_ASTERISK
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_HAND
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
invoke MemCopy,addr wc,addr childwc,sizeof WNDCLASSEX
invoke LoadIcon,NULL,IDI_APPLICATION
mov childwc.hIcon,eax
mov childwc.hIconSm,eax
invoke LoadCursor,NULL,IDC_NO
mov childwc.hCursor,eax
mov childwc.lpfnWndProc,offset ChildProc
mov childwc.lpszClassName,offset MDIChildClassName
mov childwc.lpszMenuName,NULL
invoke RegisterClassEx,addr childwc
invoke CreateWindowEx,NULL,ADDR ClassName,ADDR TitleName,\
WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,0, hInst,NULL
mov hwndFrame,eax
invoke ShowWindow, hwndFrame,SW_SHOWNORMAL
invoke UpdateWindow, hwndFrame
invoke LoadMenu,hInstance, IDR_CHILDTEXT
mov hChildTextMenu,eax
invoke LoadMenu,hInstance, IDR_CHILDGRAPHICS
mov hChildGraphicsMenu,eax
.while TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.break .if (!eax)
invoke TranslateMDISysAccel,hwndClient,addr msg
.if eax==0
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.endif
.endw
mov eax,msg.wParam
ret
WinMain endp
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
LOCAL ccs:CLIENTCREATESTRUCT
.if uMsg==WM_CREATE
invoke GetMenu,hWnd
mov hMainMenu,eax
invoke GetSubMenu,hMainMenu,1
mov ccs.hWindowMenu,eax
mov ccs.idFirstChild,100
invoke CreateWindowEx,NULL,ADDR MDIClientClassName,NULL,\
WS_CHILD or WS_VISIBLE or WS_CLIPCHILDREN,CW_USEDEFAULT ,\
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hWnd,NULL,\
hInstance,addr ccs
mov hwndClient,eax
invoke ShowWindow,hwndClient,SW_SHOWNORMAL
mov mcsText.szClass,offset MDIChildClassName
mov mcsText.szTitle,offset MDIChildTextTitle
mov eax,hInstance
mov mcsText.hOwner,eax
mov mcsText.x,CW_USEDEFAULT
mov mcsText.y,CW_USEDEFAULT
mov mcsText.lx,CW_USEDEFAULT
mov mcsText.ly,CW_USEDEFAULT
invoke MemCopy,addr mcsText,addr mcsGraphics,sizeof MDICREATESTRUCT
mov mcsGraphics.szTitle,offset MDIChildGraphicsTitle
.elseif uMsg==WM_COMMAND
.if lParam==0
mov eax,wParam
.if ax==IDM_EXIT
invoke SendMessage,hWnd,WM_CLOSE,0,0
.elseif ax==IDM_TEXT
invoke SendMessage,hwndClient,WM_MDIGETACTIVE,0,0
invoke SendMessage,eax,WM_MDICHILD,IDM_TEXT,0
.elseif ax==IDM_GRAPHICS
invoke SendMessage,hwndClient,WM_MDIGETACTIVE,0,0
invoke SendMessage,eax,WM_MDICHILD,IDM_GRAPHICS,0
.elseif ax==IDM_TILEHORZ
invoke SendMessage,hwndClient,WM_MDITILE,MDITILE_HORIZONTAL,0
.elseif ax==IDM_TILEVERT
invoke SendMessage,hwndClient,WM_MDITILE,MDITILE_VERTICAL,0
.elseif ax==IDM_CASCADE
invoke SendMessage,hwndClient,WM_MDICASCADE,MDITILE_SKIPDISABLED,0
.elseif ax==IDM_NEWTEXT
invoke SendMessage,hwndClient,WM_MDICREATE,0,addr mcsText
.elseif ax==IDM_NEWGRAPHICS
invoke SendMessage,hwndClient,WM_MDICREATE,0,addr mcsGraphics
.elseif ax==IDM_CLOSE
invoke SendMessage,hwndClient,WM_MDIGETACTIVE,0,0
invoke SendMessage,eax,WM_CLOSE,0,0
.else
invoke DefFrameProc,hWnd,hwndClient,uMsg,wParam,lParam
ret
.endif
.endif
.elseif uMsg==WM_DESTROY
invoke PostQuitMessage,NULL
.else
invoke DefFrameProc,hWnd,hwndClient,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
WndProc endp
ChildProc proc hChild:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
LOCAL hdc:HDC
.if uMsg==WM_MDIACTIVATE
mov eax,lParam
.if eax==hChild
invoke GetWindowText,eax,addr Buffer,3
invoke lstrcmp,addr Buffer, addr Compare
.if eax==0
invoke GetSubMenu,hChildTextMenu,1
invoke SendMessage,hwndClient,WM_MDISETMENU,hChildTextMenu,eax
.else
invoke GetSubMenu,hChildGraphicsMenu,1
invoke SendMessage,hwndClient,WM_MDISETMENU,hChildGraphicsMenu,eax
.endif
.else
invoke SendMessage,hwndClient,WM_MDISETMENU,hMainMenu,NULL
.endif
invoke DrawMenuBar,hwndFrame
.elseif uMsg==WM_CLOSE
invoke SendMessage,hwndClient,WM_MDIDESTROY,hChild,0
.elseif uMsg==WM_MDICHILD
invoke GetDC,hChild
mov hdc,eax
.if wParam==IDM_TEXT
invoke lstrlen,addr ChildWindowContent
invoke TextOut,hdc,10,100,addr ChildWindowContent,eax
.elseif wParam==IDM_GRAPHICS
invoke Pie,hdc,0,0,200,200,200,100,120,20
.endif
invoke ReleaseDC,hChild,hdc
.else
invoke DefMDIChildProc,hChild,uMsg,wParam,lParam
ret
.endif
xor eax,eax
ret
ChildProc endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -