.386
.model flat, stdcall
option casemap :none
include windows.inc
include user32.inc
includelib user32.lib
include kernel32.inc
includelib kernel32.lib
include Comdlg32.inc
includelib Comdlg32.lib
ICO_MAIN equ 1000
DLG_MAIN equ 1000
IDM_MAIN equ 1000
IDM_EXIT equ 1104
IDM_SELCOLOR equ 1204
.data?
hInstance dd ?
hWinMain dd ?
dwFontColor dd ?
dwBackColor dd ?
dwCustColors dd 16 dup (?)
szBuffer db 1024 dup (?)
.const
szFormatColor db '您选择的颜色值:%08x',0
szCaption db '执行结果',0
.code
; 选择颜色对话框过程
_ChooseColor proc
local @stCC:CHOOSECOLOR
invoke RtlZeroMemory,addr @stCC,sizeof @stCC
mov @stCC.lStructSize,sizeof @stCC
push hWinMain
pop @stCC.hwndOwner
push dwBackColor
pop @stCC.rgbResult
mov @stCC.Flags,CC_RGBINIT or CC_FULLOPEN
mov @stCC.lpCustColors,offset dwCustColors
invoke ChooseColor,addr @stCC
.if eax
push @stCC.rgbResult
pop dwBackColor
invoke wsprintf,addr szBuffer,addr szFormatColor,dwBackColor
invoke MessageBox,hWinMain,addr szBuffer,addr szCaption,MB_OK
.endif
ret
_ChooseColor endp
_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
.elseif eax == WM_COMMAND
mov eax,wParam
.if ax == IDM_EXIT
invoke EndDialog,hWnd,NULL
.elseif ax == IDM_SELCOLOR
invoke _ChooseColor
.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
rc文件;
#include <resource.h>
#define ICO_MAIN 1000
#define DLG_MAIN 1000
#define IDM_MAIN 1000
#define IDM_SELCOLOR 1204
#define IDM_EXIT 1104
ICO_MAIN ICON "Main2.ico"
DLG_MAIN DIALOGEX 150, 180, 120, 80
MENU IDM_MAIN
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU | WS_THICKFRAME
EXSTYLE WS_EX_CLIENTEDGE
CAPTION "颜色选择对话框示例"
FONT 9, "宋体"
{
}
IDM_MAIN menu discardable
BEGIN
popup "查看(&V)"
BEGIN
menuitem "选择颜色(&B)...",IDM_SELCOLOR
END
END
构建;运行;如下;
主过程调用颜色对话框过程;
RtlZeroMemory,addr @stCC,sizeof @stCC
结构体变量清零;第二个参数是结构体长度;
结构体成员赋值有两种情况;一种是Mov,一种是push pop;
mov @stCC.lStructSize,sizeof @stCC
lStructSize此字段是结构体长度;
push hWinMain
pop @stCC.hwndOwner
对话框父窗体句柄,使用push pop赋值;
push dwBackColor
pop @stCC.rgbResult
返回的颜色值;
mov @stCC.Flags,CC_RGBINIT or CC_FULLOPEN
对话框标志;
invoke ChooseColor,addr @stCC
调用win32的ChooseColor函数,参数是结构体变量地址;
.if eax
push @stCC.rgbResult
pop dwBackColor
调用成功返回选择的颜色到dwBackColor;