一. 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;
构建完成文件如下;运行效果如下;