读书笔记——Windows环境下32位汇编语言程序设计(5)模态对话框

时间:2021-01-14 01:22:06

资源可以用VC之类的生成,然后拷贝出来。

例如:每一个MFC工程都有一个resource.h,没有做任何修改时,这个resource.h文件是原来自带的。当对资源进行过修改添加之类的时,新添加的资源的ID都会被加入的这个工程的resource.h中。在Win32汇编的RC文件中,开头包含的那个resource.h没有做过任何修改,所以要把新添加的资源的ID用#define宏添加进来。

#include <resource.h>

#define IDD_DLG 130
#define IDC_BTN_TEST 1001
#define IDI_ICO_HEHE 1002

IDI_ICO_HEHE ICON"hehe.ico"

IDD_DLG DIALOGEX 0, 0, 316, 90
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "尝试对话框"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "确定",IDOK,205,69,50,14
PUSHBUTTON "取消",IDCANCEL,259,69,50,14
PUSHBUTTON "测试",IDC_BTN_TEST,113,18,50,14
END
对于ASM文件,这个自然是要动动手写了。

对于DialogBoxParam的回调函数,一定要写好判断逻辑。这个不比VC里好调试。

另外应用程序实例用的是dd,不过还好写错了编译会有提示。

不要忘了定义一下在RC文件里的控件ID,不过还好没写编译时也会有提示。

.386
.model flat,stdcall
option casemap:none

include windows.inc
include kernel32.inc
includelib kernel32.lib
include user32.inc
includelib user32.lib

IDD_DLG equ 130
IDC_BTN_TEST equ 1001
IDI_ICO_HEHE equ 1002

.data
gszCaptiondb'Caption',0
gszTextdb'Text',0
.data?
ghInstancedd?

.code
DlgFunc proc uses ebx edi esi hWnd,wMsg,wParam,lParam

mov eax,wMsg
.if eax==WM_CLOSE
invoke EndDialog,hWnd,NULL
.elseif eax==WM_INITDIALOG
invoke LoadIcon,ghInstance,IDI_ICO_HEHE
invoke SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
.elseif eax==WM_COMMAND
mov eax,wParam
.if ax==IDOK
invoke EndDialog,hWnd,NULL
.elseif ax==IDC_BTN_TEST
invoke MessageBox,hWnd,addr gszText,addr gszCaption,MB_OK
.endif
.else
mov eax,FALSE
ret
.endif

mov eax,TRUE
ret
DlgFunc endp

start:
invoke GetModuleHandle,NULL
mov ghInstance,eax
invoke DialogBoxParam,ghInstance,IDD_DLG,NULL,addr DlgFunc,NULL
invoke ExitProcess,NULL
end start