⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mdi.asm

📁 windows汇编语言程序设计 吴中平著 一书所附所有源代码。 该书重点讲解了Windows环境下汇编语言程序设计的基本原理及其实现过程
💻 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 + -