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

📄 dialog.asm

📁 windows汇编语言程序设计 吴中平著 一书所附所有源代码。 该书重点讲解了Windows环境下汇编语言程序设计的基本原理及其实现过程
💻 ASM
字号:
include .\head.inc
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
ModalDlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
ModelessDlgProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
.const
IDR_MODELESSDIALOG           equ   101
IDR_MODALDIALOG                 equ   102
IDR_MENU                                equ   103
IDC_MODALBUTTON                equ   1000
IDC_MODALEDIT                      equ   1001
IDC_MODELESSEDIT                equ   1002
IDC_MODELESSCHECK             equ   1003
IDC_MODELESSBUTTON           equ   1004
IDM_MODALNEW                      equ   40001
IDM_EXIT                                  equ   40002
IDM_MODELESSNEW                equ   40003
IDM_MODELESSCLOSE             equ   40006
.data
ClassName       db "WinClass",0
TitleName       db "对话框测试",0


.data?
hInstance	            HINSTANCE ?
hMenu                  HMENU  ?
hModelessDialog   HWND   ?
.code
start:
        invoke GetModuleHandle, NULL
        mov    hInstance,eax
        invoke WinMain, NULL,NULL,NULL, SW_SHOWDEFAULT
        invoke ExitProcess,eax

WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
        LOCAL wc:WNDCLASSEX
        LOCAL msg:MSG
        LOCAL hwnd:HWND
        mov   wc.cbSize,SIZEOF WNDCLASSEX
        mov   wc.style, CS_HREDRAW or CS_VREDRAW or CS_DBLCLKS
        mov   wc.lpfnWndProc, OFFSET WndProc
        mov   wc.cbClsExtra,NULL
        mov   wc.cbWndExtra,NULL
        mov   eax, hInstance
        mov   wc.hInstance,eax
        invoke GetStockObject,WHITE_BRUSH 
        mov   wc.hbrBackground,eax
        mov   eax,IDR_MENU
        mov   wc.lpszMenuName,eax
        mov   wc.lpszClassName,OFFSET ClassName
        invoke LoadIcon,NULL,IDI_ASTERISK
        mov   wc.hIcon,eax
        mov   wc.hIconSm,0
        invoke LoadCursor,NULL,IDC_HAND
        mov   wc.hCursor,eax
        invoke RegisterClassEx, addr wc
        invoke CreateWindowEx,WS_EX_CLIENTEDGE+WS_EX_APPWINDOW+WS_EX_TOPMOST,addr ClassName,\
            addr TitleName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,400,200,\
            NULL,NULL,hInst,NULL
        mov   hwnd,eax
        invoke ShowWindow,hwnd,CmdShow
        invoke UpdateWindow,hwnd
        invoke GetMenu,hwnd
        mov hMenu,eax
        .while TRUE
        invoke GetMessage, addr msg,NULL,0,0
           .BREAK .IF (!eax)
           invoke TranslateMessage,addr msg
           invoke DispatchMessage, addr msg
        .endw
        mov eax,msg.wParam
        ret
WinMain endp

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
   .if uMsg==WM_DESTROY
          invoke PostQuitMessage,NULL
   .elseif uMsg==WM_COMMAND
      mov eax,wParam
      .if lParam==NULL
        .if ax==IDM_MODALNEW
            invoke DialogBoxParam,NULL,IDR_MODALDIALOG,hWnd,addr ModalDlgProc,NULL
        .elseif ax==IDM_MODELESSNEW
            invoke CreateDialogParam,hInstance,IDR_MODELESSDIALOG,hWnd,addr ModelessDlgProc,NULL
            mov hModelessDialog  ,eax
            invoke ShowWindow,eax,SW_SHOWDEFAULT
            invoke EnableMenuItem,hMenu,IDM_MODELESSNEW,MF_DISABLED
        .elseif ax==IDM_MODELESSCLOSE
            invoke DestroyWindow,hModelessDialog
            invoke EnableMenuItem,hMenu,IDM_MODELESSNEW,MF_ENABLED
        .elseif ax==IDM_EXIT
            invoke DestroyWindow,hWnd 
        .endif         
      .endif             
    .else
      invoke DefWindowProc,hWnd,uMsg,wParam,lParam		
      ret
    .endif
    xor eax,eax
    ret
WndProc endp


ModalDlgProc proc hWnd:dword,uMsg:dword,wParam:dword,lParam:dword
  .if uMsg==WM_INITDIALOG
      invoke GetDlgItem,hWnd,IDC_MODALEDIT
      invoke SetFocus,eax 
      mov eax,FALSE
      ret
  .elseif uMsg==WM_CLOSE
     invoke EndDialog,hWnd,NULL
  .else
     mov eax,FALSE
     ret
  .endif
  mov eax,TRUE
  ret
ModalDlgProc endp

ModelessDlgProc proc hWnd:dword,uMsg:dword,wParam:dword,lParam:dword
  .if uMsg==WM_INITDIALOG
      invoke GetDlgItem,hWnd,IDC_MODELESSEDIT
      invoke SetFocus,eax
      mov eax,FALSE
      ret
  .elseif uMsg==WM_CLOSE
     invoke EnableMenuItem,hMenu,IDM_MODELESSNEW,MF_ENABLED
     invoke DestroyWindow,hWnd
  .else
     mov eax,FALSE
     ret
  .endif
  mov eax,TRUE
  ret
ModelessDlgProc endp
end start


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -