/*----------------------------------------------
COLORS3.C
-- Version using Common Dialog Box
(c) Charles Petzold, 1998
----------------------------------------------*/
#include <windows.h>
#include <commdlg.h>
int WINAPI WinMain
(HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
static CHOOSECOLOR cc ;
/*COLORREF类型用来描绘一个RGB颜色.
结构体类似于: RGB_value struct
{ byte unused ;
byte blue ;
byte green ;
byte red; };
其中第一字节始终为 0,其它三个字节分别表示兰色、绿色和红色,刚好和 RGB 的次序相反。
COLORREF类型变量值描绘一个颜色时对应于16进制的格式: 0x00bbggrr
从COLORREF中获取RGB分量值:
BYTE r = GetRValue(colorrrefRGB);
BYTE g = GetGValue(colorrrefRGB);
BYTE b = GetBValue(colorrrefRGB); */
static COLORREF crCustColors[16] ;
cc.lStructSize = sizeof (CHOOSECOLOR) ; //结构大小
cc.hwndOwner = NULL
; //对话框拥有者的窗口句柄
cc.hInstance = NULL
; //自定义对话框模板资源载入内存后的句柄
/* 如果CC_RGBINT标识符被设置时,该成员指定了对话框打开时默认的选择颜色.
如果用户单击OK按钮,该成员指定了用户选择的颜色.*/
cc.rgbResult = RGB (0x80, 0x80, 0x80) ;
/* 指向一个包含16个值的数组,该数组包含了对话框中自定义颜色的红、绿、蓝(RGB)值。*/
cc.lpCustColors = crCustColors ;
/* CC_RGBINIT: 让对话框默认使用由rgbResult成员指定的颜色
CC_FULLOPEN: 让对话框显示额外的控件以使用户创建自定义的颜色。
如果该标识未设置,用户必须点击[自定义颜色]按钮才能显示自定颜色控件。*/
cc.Flags = CC_RGBINIT
| CC_FULLOPEN
;
cc.lCustData = 0 ; //自定义程序数据
cc.lpfnHook = NULL
; //指向一个钩子程序
/* 指向一个以空字符结束的字符串,字符串是对话框模板资源的名字,资源保存在能被hInstance成员识别的模块中 */
cc.lpTemplateName = NULL
;
/* 创建一个能使用户从中选择颜色的Color模态通用对话框。
如果用户点击对话框中的OK按钮,返回值为非零值。
CHOOSECOLOR结构中的rgbResult成员含有用户选择的颜色的RGB颜色值。
如果用户取消或关闭Color对话框或错误出现,返回值为零。
Color对话框不支持彩色调色板,对话框提供的颜色的选择仅限于系统颜色和这些颜色的混合值。 */
return ChooseColor
(&cc) ;
}
CHOOSECOLOR Structure
该结构包含了ChooseColor函数用于初始化颜色对话框的信息。在用户关闭对话框之后,系统返回关于用户选择的颜色信息。
语法
typedef struct {
DWORD lStructSize;
HWND hwndOwner;
HWND hInstance;
COLORREF rgbResult;
COLORREF *lpCustColors;
DWORD Flags;
LPARAM lCustData;
LPCCHOOKPROC lpfnHook;
LPCTSTR lpTemplateName;
} CHOOSECOLOR, *LPCHOOSECOLOR;
成员
lStructSize
指定结构的长度(字节)
hwndOwner
拥有对话框的窗口的句柄。该成员可以是任意有效的窗口句柄,或在对话框没有所有者时,可为NULL
hInstance
如果Flag成员设置了CC_ENABLETEMPLATEHANDLE
标识符时,该成员是一个包含了对话框模板的内存对象的句柄。
如果
CC_ENABLETEMPLATE
标识符被设置时,该成员是一个包含了对话框的模块句柄。
如果上述两个标识符都未被设置,则该成员被忽略。
rgbResult
如果CC_RGBINT
标识符被设置时,该成员指定了对话框打开时默认的选择颜色。如果指定的颜色值不在有效的范围内,系统会自动选择最近的颜色值。如果该成员为0或CC_RGBINT
未被设置,初始颜色是黑色。如果用户单击OK按钮,该成员指定了用户选择的颜色。
lpCustColors
指向一个包含16个值的数组,该数组包含了对话框中自定义颜色的红、绿、蓝(RGB)值。如果用户修改这些颜色,系统将用新的颜色值更新这个数组。如果要在多个ChooseColor函数中保存这个新的数组,你应该为该数组分配静态内存空间
。
Flags
一个可以让你初始化颜色对话框的位集。当对话框返回时,它用来这些标识符来标识用户的输入。该成员可以为下列标识符的任意组合。
CC_ANYCOLOR
对话框显示所有可用的基于基本颜色的颜色。
CC_ENABLEHOOK
激活由lpfnHook成员指定的钩子程序。该标识仅用于初始化对话框时。
CC_ENABLETEMPLATE
表示利用由hInstance 和 lpTemplateName 成员指定的对话框模板。该标识符仅用于初始化对话框。
CC_ENABLETEMPLATEHANDLE
表示hInstance成员标识一个包含了预加载的对话框模板的数据块。如果该标识被指定,系统会忽略 lpTemplateName 成员。该标识符仅用于初始化对话框。
CC_FULLOPEN
让对话框显示额外的控件以使用户创建自定义的颜色。如果该标识未设置,用户必须点击【自定义颜色】按钮才能显示自定颜色控件。
CC_PREVENTFULLOPEN
使自定义颜色按钮失效。
CC_RGBINIT
让对话框默认使用由rgbResult成员指定的颜色
CC_SHOWHELP
让对话框显示帮助按钮。
hwndOwner成员必须指定一个窗口,这个窗口接收对话框发送的HELPMSGSTRING注册的消息。
当用户单击帮助按钮时对话框发送这个消息。
CC_SOLIDCOLOR
让对话框仅显示基本颜色组成的纯色。
lCustData
指定应用程序自定义的数据,该数据会被系统发送给钩子程序。当系统发送WM_INITDIALOG消息给钩子程序时,消息的lParam参数是一个指向CHOOSECOLOR结构的指针。钩子程序可以利用该指针获得该成员的值。
lpfnHook
指向CCHookProc钩子程序的指针,该钩子可以处理发送给对话框的消息。该成员只在CC_ENABLEHOOK标识被设定的情况下才可用,否则该成员会被忽略。
lpTemplateName
指向一个NULL结尾的字符串,该字符串是对话框模板资源的名字。
结构信息
Header Declared in Commdlg.h, include Windows.h
Minimum operating systems Windows 95, Windows NT 3.1
Unicode Implemented as ANSI and Unicode versions.