📄 colorchoose.asm
字号:
.386
.model flat, stdcall
option casemap :none
;<<<<<<<<<<<<<<<头文件和导入库文件<<<<<<<<<<<<<<<<<<<<<
include windows.inc
include user32.inc
include kernel32.inc
include COMDLG32.inc ;包含颜色通用对话框
includelib COMDLG32.lib
includelib user32.lib
includelib kernel32.lib
include gdi32.inc ;createsolidbrush的头文件
includelib gdi32.lib ;createsolidbrush的链接库
include winmm.inc
includelib winmm.lib
WndProc PROTO :DWORD,:DWORD,:DWORD,:DWORD
;<<<<<<<<<<<<<<<<<<<<<<<数据段<<<<<<<<<<<<<<<<<<<<<<<<<<
.data
hInstance dd 0 ;应用程序模块句柄
dlgname db "MAIN",0
szColor db "Color Value:%li",0 ;显示颜色数值
szMusicName db "yxh",0
.data?
buffer db 24 dup(?) ;buffer for wsprintf
rgb dd 16 dup(?) ;value for cc struct
color dd ?
hBrush dd ?
hStatic dd ?
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; 代码段
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
.code
start:
invoke GetModuleHandle, NULL ;得到应用程序的句柄
mov hInstance, eax
invoke DialogBoxParam,hInstance,ADDR dlgname,0,ADDR WndProc,0 ;创建模式对话框作为主窗口程序
invoke ExitProcess,eax
WndProc proc hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD ;如果有消息到达,则由负责该窗口的窗口回调函数处理
LOCAL cc:CHOOSECOLOR ;定义局部变量
.if uMsg == WM_INITDIALOG ;初始化对话框
invoke PlaySound, addr szMusicName, hInstance, SND_ASYNC or SND_LOOP
invoke GetDlgItem,hWin,1000 ;得到对话框控件句柄ID
mov hStatic,eax ;保存他
xor eax, eax
ret
.elseif uMsg == WM_CTLCOLORSTATIC ;当一个静态控件要被绘制时发送此消息给父窗口
mov eax,lParam
.if eax == hStatic
invoke CreateSolidBrush,color ;从指定颜色建立实心刷子
mov hBrush,eax ;保存句柄
ret
.endif
.elseif uMsg == WM_COMMAND
.if wParam == 1001
mov cc.lStructSize,sizeof cc ;结构体大小
push hWin
pop cc.hwndOwner
mov cc.rgbResult,255 ;开始选择红色作为色彩选择对话框颜色
mov cc.Flags,CC_FULLOPEN+CC_RGBINIT ;预期设定此对话框能一直打开
mov cc.lpCustColors,offset rgb ;给rgb取地址
invoke ChooseColor, addr cc ;建立一个色彩选择对话框
.if eax == TRUE ;选择颜色并且没有关闭对话框时要返回TRUE
push cc.rgbResult ;保存选择的颜色
pop color
invoke InvalidateRect,hStatic,NULL,TRUE ;在更新区域中加入一个我们要填充颜色的矩形
invoke wsprintf,addr buffer,addr szColor,color ;格式化字符串,取缓冲区的地址,并填充颜色
invoke SetDlgItemText,hWin,2000,addr buffer ;设置对话框标题,取缓冲区的地址
.endif
.endif
xor eax,eax
ret
.elseif uMsg == WM_CLOSE ;当有关闭对话框的消息时
invoke DeleteObject,hBrush ;删除实心刷子
invoke EndDialog,hWin,NULL ;关闭对话框
ret
.endif
xor eax, eax
ret
WndProc endp
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -