win32汇编选择颜色对话框Demo

		.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;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
; *程序说明* ;=============================================================================================== ; ; ; 对话框是由线条和矩形组合而成,标准windows对话框一共使用了5种颜色,分别是: ; #D4D0C8,#0E296E,#FFFFFF,#808080,#404040.其中#D4D0C8是对话框主体颜色, ; #0E296E是标题栏颜色,其他三种颜色对话框边框使用的颜色,对话框边框主要用于营 ; 造对话框立体效果. ; ; 本程序由于使用的是640*480*16色显示模式,无法取到标准windows程序所需要的5种 ; 颜色,所以使用相近的颜色进行替换. ; ; 我在网上找了好久关于640*480*16色模式的相关资料,最终还是没有找到详细的资料. ; 自己写了一个画点函数(程序中的DrawPointb),但是使用这个函数画矩形时有点问题,当颜色 ; 号是奇数时正常,如果颜色号是偶数时,矩形将不能正确显示.本程序中使用的画点函数是在网 ; 上找的,不过这个函数也有一点问题,就是速度非常慢,如果画点去添满整个屏幕,将使用好长的 ; 时间.所以程序中的大背景是用我理解的那种方法画的,其他的都使用DrawPoint函数.如果谁 ; 有比较详细的640*480*16色显示模式的相关资料,不要忘了告诉我. ; ; 汉字显示和用C语言显示的方式有点区别,因为在实模式下每个段最大容量是64K,而字库 ; 文件有一百多K,所以不能一次将字库文件读入,我使用的方法是把字库文件打开,然后每显示 ; 一个汉字,移动一次指针,将指针移动到响应的点阵然后读取一个字的点阵信息到内存,直到字符 ; 串显示完毕. ; ; 如果程序要在裸机下运行,则需要将要显示的汉字的点阵信息从字库中提取出来.显示汉字 ; 的子程序也要做相应的修改. ; ; 由于时间不是很宽裕,基本上没有写注释,各个函数的作用: ; ; 1.ConfirmTCan(按钮由确定状态变为取消状态) ; 2.CanTConfirm(按钮由取消状态变为确定状态) ; 3.ShowHanZi(显示汉字子程序) ; 4.DrawDialog(显示对话框子程序) ; 5.DrawButtonNoSelected(画一个未选中状态的按钮) ; 6.DrawButtonOnSelected(画一个选中状态的按钮) ; 7.DrawRect(画矩形子程序) ; 8.DrawPoint(画点子程序) ; ; ************Tab键或者方向键控制按钮焦点变换****************************** ; ; e-mail:westdatas@163.com OICQ:19820914 ; Nirvana 2006.8.1 ;==============================================================================================
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值