请选择 进入手机版 | 继续访问电脑版
MSIPO技术圈 首页 IT技术 查看内容

Win32汇编对话框子控件复习学习

2023-07-13

在此已经做了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有了;

 

运行一下,子控件的效果没有出来,只有一小点白的;下回继续;

 

 

相关阅读

手机版|MSIPO技术圈 皖ICP备19022944号-2

Copyright © 2024, msipo.com

返回顶部