在此已经做了Win32汇编的对话框子控件ListBox和ComboBox;
Win32汇编ListBox最简Demo_win32 list列表_bcbobo21cn的博客-CSDN博客
Win32汇编最简ComboBox Demo_bcbobo21cn的博客-CSDN博客
它们的代码是相似的;
以ComboBox为例;
首先是要做一个资源文件,.rc文件;在rc文件,
定义一个对话框,对话框的ID是DLG_MAIN;定义对话框的位置和大小;要为标识符DLG_MAIN定义一个数值;
STYLE 这行指定对话框的风格;
CAPTION 这行指定对话框标题;
然后定义ComboBox,指定子控件使用的字体为9;
ComboBox的ID是IDC_TITLETEXT;
指定ComboBox的位置和大小,控件风格;
为标识符IDC_TITLETEXT定义一个数值;
asm代码;
首先要定义标识符的数值;
在数据段的常量段定义数个加入ComboBox下拉列表的文本;
在程序启动以后调用Win32 DialogBoxParam 函数显示对话框;此函数需要对话框的资源ID,就是前面的DLG_MAIN;还需要一个对话框过程的偏移地址作为参数;
在对话框过程,收到WM_INITDIALOG消息时,调用 SendDlgItemMessage 函数给组合框添加下拉列表的文本;
下面参照来做2个子控件;
test.rc,
#include <resource.h>
#define DLG_MAIN 1
#define IDC_MYPUSH1 40001
#define IDC_MYCHECK1 40002
DLG_MAIN DIALOG 193, 180, 130, 150
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
CAPTION "对话框子窗口控制示例"
FONT 9, "宋体"
{
CHECKBOX IDC_MYCHECK1, 10, 80, 100, 50, BS_CHECKBOX | WS_TABSTOP
PUSHBUTTON IDC_MYPUSH1, 15, 20, 100, 50, BS_PUSHBUTTON
}
定义2个子控件,包括子控件ID,位置和大小,风格;
test.asm
.386
.model flat, stdcall
option casemap :none
include D:\masm32\include\windows.inc
include D:\masm32\include\user32.inc
include D:\masm32\include\kernel32.inc
include D:\masm32\include\gdi32.inc
includelib D:\masm32\lib\user32.lib
includelib D:\masm32\lib\kernel32.lib
includelib D:\masm32\lib\gdi32.lib
DLG_MAIN equ 1
IDC_MYPUSH1 equ 40001
IDC_MYCHECK1 equ 40002
.data?
hInstance dd ?
.const
szText1 db '文本1',0
szText2 db '文本2',0
.code
_ProcDlgMain 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 SetDlgItemText,hWnd,IDC_MYPUSH1,addr szText1
invoke SetDlgItemText,hWnd,IDC_MYCHECK1,addr szText2
.elseif eax == WM_COMMAND
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
_ProcDlgMain endp
start:
invoke GetModuleHandle,NULL
mov hInstance,eax
invoke DialogBoxParam,hInstance,DLG_MAIN,NULL,offset _ProcDlgMain,NULL
invoke ExitProcess,NULL
end start
首先equ指定标识符的数值;
不能和RESOURCE.H里面的重复;一般可以从40001开始;
常量段定义2个文本;
程序启动调用DialogBoxParam;
对话框过程,在收到WM_INITDIALOG消息调用SetDlgItemText设置子控件文本;SetDlgItemText需要三个参数,第一个是主对话框句柄,第二个是子控件ID,第三个是文本的地址;
编译test.asm为test.obj;
用rc命令编译资源文件为.RES文件;然后link,指定subsystem参数,链接obj和RES;然后exe有了;
运行一下,子控件的效果没有出来,只有一小点白的;下回继续;