📄 modeldlg(1).asm
字号:
.386
.model flat, stdcall
option casemap:none
include D:\Progra~1\RadASM\masm32\include\windows.inc
include D:\Progra~1\RadASM\masm32\include\user32.inc
include D:\Progra~1\RadASM\masm32\include\comdlg32.inc
includelib D:\Progra~1\RadASM\masm32\lib\comdlg32.lib
includelib D:\Progra~1\RadASM\masm32\lib\user32.lib
include D:\Progra~1\RadASM\masm32\include\kernel32.inc
includelib D:\Progra~1\RadASM\masm32\lib\kernel32.lib
IDD_DIALOG_MAIN equ 101
IDR_MENU_MAIN equ 102
IDM_M equ 40001
IDM_ML equ 40002
IDOK equ 1
IDCANCEL equ 2
.data?
hInstance dd ?
hWinMain dd ?
hMlDlg dd ?
.const
szClassName db "MYCLASS", 0
szCaptionMain db "the main window", 0
szMBCap db "Message box", 0
szMMCap db "model", 0
szMMLCap db "modeless", 0
szOK db "pressed OK", 0
szCancel db "pressed Cancel", 0
.code
_ProcDlgModeless proc hWnd, uMsg, wParam, lParam
mov eax, uMsg
.if eax == WM_INITDIALOG
invoke SetWindowText, hWnd, addr szMMLCap
.elseif eax == WM_CLOSE
invoke DestroyWindow, hWnd
.elseif eax == WM_COMMAND
mov eax, wParam
.if eax == IDOK
invoke MessageBox, NULL, addr szOK, addr szMBCap, MB_OK
.elseif eax == IDCANCEL
invoke MessageBox, NULL, addr szCancel, addr szMBCap, MB_OK
invoke EndDialog, hWnd, NULL
.endif
.else
mov eax, FALSE
ret
.endif
mov eax, TRUE
ret
_ProcDlgModeless endp
_ProcDlgModel proc hWnd, uMsg, wParam, lParam
mov eax, uMsg
.if eax == WM_INITDIALOG
invoke SetWindowText, hWnd, addr szMMCap
.elseif eax == WM_CLOSE
invoke EndDialog, hWnd, NULL
.elseif eax == WM_COMMAND
mov eax, wParam
.if eax == IDOK
invoke MessageBox, NULL, addr szOK, addr szMBCap, MB_OK
.elseif eax == IDCANCEL
invoke MessageBox, NULL, addr szCancel, addr szMBCap, MB_OK
invoke EndDialog, hWnd, NULL
.endif
.else
mov eax, FALSE
ret
.endif
mov eax, TRUE
ret
_ProcDlgModel endp
_ProcWinMain proc uses ebx edi esi, hWnd, uMsg, wParam, lParam
LOCAL stPs:PAINTSTRUCT
LOCAL stRect:RECT
LOCAL hDc
mov eax, uMsg
.if eax == WM_COMMAND
mov eax, wParam
movzx eax, ax
.if eax == IDM_M
invoke DialogBoxParam, hInstance, IDD_DIALOG_MAIN, hWnd, _ProcDlgModel, NULL
.elseif eax == IDM_ML
invoke CreateDialogParam, hInstance, IDD_DIALOG_MAIN, hWnd, _ProcDlgModeless, NULL
mov hMlDlg, eax
.elseif eax == IDOK
invoke MessageBox, NULL, NULL, NULL, MB_OK
.endif
.elseif eax == WM_CLOSE
invoke DestroyWindow, hWinMain
.elseif eax == WM_DESTROY
invoke PostQuitMessage, NULL
.else
invoke DefWindowProc, hWnd, uMsg, wParam, lParam
ret
.endif
xor eax, eax
ret
_ProcWinMain endp
_WinMain proc
LOCAL stWndClass:WNDCLASSEX
LOCAL stMsg:MSG
invoke GetModuleHandle, NULL
mov hInstance, eax
invoke RtlZeroMemory, addr stWndClass, sizeof stWndClass
invoke LoadCursor, 0, IDC_ARROW
mov stWndClass.hCursor, eax
push hInstance
pop stWndClass.hInstance
mov stWndClass.cbSize, sizeof WNDCLASSEX
mov stWndClass.style, CS_HREDRAW or CS_VREDRAW
mov stWndClass.lpfnWndProc, offset _ProcWinMain
mov stWndClass.hbrBackground, COLOR_WINDOW+1
mov stWndClass.lpszClassName, offset szClassName
invoke RegisterClassEx, addr stWndClass
invoke LoadMenu,hInstance, IDR_MENU_MAIN
invoke CreateWindowEx, WS_EX_CLIENTEDGE, offset szClassName, offset szCaptionMain, WS_OVERLAPPEDWINDOW, 100, 100, CW_USEDEFAULT, CW_USEDEFAULT, NULL, eax, hInstance, NULL
mov hWinMain, eax
invoke ShowWindow, hWinMain, SW_SHOWNORMAL
invoke UpdateWindow, hWinMain
.while TRUE
invoke GetMessage, addr stMsg, NULL, 0, 0
.break .if eax == 0
invoke IsDialogMessage, hMlDlg, addr stMsg
invoke TranslateMessage, addr stMsg
invoke DispatchMessage, addr stMsg
.endw
ret
_WinMain endp
start:
call _WinMain
invoke ExitProcess, NULL
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -