Win32 ASM 简单对话框编程Demo

一.  ASM基本对话框

asm文件;

;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; by bobo
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		.386
		.model flat, stdcall
		option casemap :none
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
include		windows.inc
include		user32.inc
includelib	user32.lib
include		kernel32.inc
includelib	kernel32.lib
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
; Equ 等值定义
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ICO_MAIN	equ		1000h	;图标
DLG_MAIN	equ		1
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		.data?
hInstance	dd		?
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
		.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	LoadIcon,hInstance,ICO_MAIN
			invoke	SendMessage,hWnd,WM_SETICON,ICON_BIG,eax
		.elseif	eax == WM_COMMAND
			mov	eax,wParam
			.if	ax == IDOK
				invoke	EndDialog,hWnd,NULL
			.endif
		.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

资源文件;

#include		<resource.h>

#define	ICO_MAIN		0x1000	//图标
#define	DLG_MAIN		1

ICO_MAIN	ICON		"Main.ico"

DLG_MAIN DIALOG 350, 250, 120, 64
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "对话框demo模板"
FONT 9, "宋体"
{
 ICON ICO_MAIN, -1, 10, 11, 18, 21
 CTEXT "简单的对话框例子\n by bobo", -1, 36, 14, 70, 19
 DEFPUSHBUTTON "退出", IDOK, 58, 46, 50, 14
 CONTROL "", -1, "Static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 6, 39, 103, 1
}

资源文件里,

#include        <resource.h>

一句,不能删除;否则将出现RC2014错误;

此处resource.h是Masm32的系统文件;位于:

控制台构建的文本如下;

Microsoft Windows [版本 10.0.17763.557]
(c) 2018 Microsoft Corporation。保留所有权利。

G:\win32ASM\小例子\Dialog1>set include=g:\masm32\include

G:\win32ASM\小例子\Dialog1>set lib=g:\masm32\lib

G:\win32ASM\小例子\Dialog1>set path=g:\masm32\bin;%path%

G:\win32ASM\小例子\Dialog1>ml /c /coff Dialog.asm
Microsoft (R) Macro Assembler Version 6.14.8444
Copyright (C) Microsoft Corp 1981-1997.  All rights reserved.

 Assembling: Dialog.asm

***********
ASCII build
***********


G:\win32ASM\小例子\Dialog1>rc Dialog.rc
Dialog.rc (7): error RC2104 : undefined keyword or key name: DS_MODALFRAME


G:\win32ASM\小例子\Dialog1>rc Dialog.rc

G:\win32ASM\小例子\Dialog1>Link /subsystem:windows Dialog.obj Dialog.RES
Microsoft (R) Incremental Linker Version 5.12.8078
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.

G:\win32ASM\小例子\Dialog1>

先调用Windows API的GetModuleHandle获取程序实例句柄;调用结果在eax;然后mov到hInstance里面;

调用DialogBoxParam创建对话框;

在对话框窗口过程处理三个消息;WM_CLOSE,WM_INITDIALOG,WM_COMMAND;

在WM_INITDIALOG消息设置图标;

点击对话框关闭按钮或者IDOK按钮,调用EndDialog关闭对话框;

二. 增加效果

下面来增加效果;载入一小排精英士兵图标;构建之前文件如下;

此操作不须改动asm文件;改变rc文件,重新执行rc,重新链接,即可;如果obj已删除,则要重新ml;

如果rc出现下图错误;

使用IconWorkshop打开图标;一个图标ico文件是可以包含多种格式的;删除所有格式,只留下32*32-RGB/A即可;

资源文件如下;

#include		<resource.h>

#define	ICO_MAIN		0x1000	//图标
#define    ICO_shibing1        0x8001
#define    ICO_shibing2        0x8002
#define    ICO_shibing3        0x8003
#define    ICO_shibing4        0x8004
#define	DLG_MAIN		1

ICO_MAIN	ICON		"Main.ico"
ICO_shibing1	ICON		"shibing1.ico"
ICO_shibing2	ICON		"shibing2.ico"
ICO_shibing3	ICON		"shibing3.ico"
ICO_shibing4	ICON		"shibing4.ico"

DLG_MAIN DIALOG 350, 250, 250, 64
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
CAPTION "对话框demo模板"
FONT 9, "宋体"
{
 ICON ICO_MAIN, -1, 10, 11, 20, 21
 ICON ICO_shibing1, -1,32, 11, 20, 21
 ICON ICO_shibing2, -1,54, 11, 20, 21
 ICON ICO_shibing3, -1,76, 11, 20, 21
 ICON ICO_shibing4, -1,98, 11, 20, 21
 DEFPUSHBUTTON "退出", IDOK, 58, 46, 50, 14
 CONTROL "", -1, "Static", SS_ETCHEDHORZ | WS_CHILD | WS_VISIBLE, 6, 39, 103, 1
}

如果资源文件有写错;例如 ,

ICON ICO_shibing1, -1,32, 11, 20, 21

一句;前面少写ICON,RC会报错 invalid control type;

构建完成文件如下;运行效果如下;

发布了475 篇原创文章 · 获赞 545 · 访问量 304万+

猜你喜欢

转载自blog.csdn.net/bcbobo21cn/article/details/104188812
今日推荐