2024年4月30日发(作者:)

VC调用系统颜色对话框

通过MFC类调用

MFC为我们提供了CColorDialog类来调用系统对话框。

构造函数

CColorDialog(COLORREFclrInit=0,DWORDdwFlags=0,CWnd*pParentWnd=NULL);

参数说明:

COLORREFclrInit为颜色对话框传递一个默认的颜色。默认值为0,默认颜色为黑色。

DWORDwFlags一组标记,用来定义颜色对话框的功能和外观。可参照CHOOSECOLOR

结构体的Flags成员变量。

CWnd*pParentWnd指定颜色对话框父窗口或拥有者窗口的指针。

调用颜色对话框的一般示例代码:

CColorDialogdlg;//全部使用默认值

if(IDOK==l()){

COLORREFclr=or();//获取用户选择的颜色

}

CColorDialog类有一个成员变量m_cc,它是CHOOSECOLOR类型的结构体(这个结构体的具

体内容见下面win32函数调用颜色对话框)。其中一个成员变量是COLORREFrgbResult;如果在调

用DoModal()前给其赋值,表示指定颜色对话框的默认选择颜色为rgbResult的颜色。为rgbResult

赋值初始颜色后,还必须为m_cc的Flags成员增加CC_RGBINIT属性,表示使rgbResult设置的值

有效。示例代码如下:

CColorDialogdlg;

dlg.m_ult=RGB(255,255,0);//打开颜色对话框后,默认颜色为黄色

dlg.m_|=CC_RGBINIT;//添加CC_RGBINIT标记,表示使用rgbResult中设置的颜色作为

//默认颜色

if(IDOK==l()){

COLORREFclr=or();//获取用户选择的颜色

}

CColorDialog类的常用函数

CColorDialog::GetColor

COLORREFGetColor()const;

功能:返回用户选择的颜色。

除了用这个函数返回用户选择的颜色外,也可以用m_cc的成员变量rgbResult,它也包含了用

户选择的颜色。如将上面获取用户颜色的代码改为COLORREFclr=dlg.m_ult;也是可以

的。

通过win32API函数调用颜色对话框

用api函数调用颜色对话框需要CHOOSECOLOR结构体和ChooseColor()函数。现在简单

介绍如下:

CHOOSECOLOR

typedefstruct{//cc

DWORDlStructSize;

HWNDhwndOwner;

HWNDhInstance;

COLORREFrgbResult;

COLORREF*lpCustColors;

DWORDFlags;

LPARAMlCustData;

LPCCHOOKPROClpfnHook;

LPCTSTRlpTemplateName;

}CHOOSECOLOR;

参数说明:

DWORDlStructSize指定本结构体的长度()字节,一般用sizeof(CHOOSECOLOR)赋

值。

HWNDhwndOwner颜色对话框拥有者的窗口句柄,可以赋值NULL,表示没有拥有者。

HWNDhInstance;如果Flags成员设置了CC_ENABLETEMPLATEHANDLE标识符时,

hInstance是一个包含了对话框模板的内存对象的句柄。如果Flags成员设置了

CC_ENABLETEMPLATE标识符时,hInstance是一个包含了对话框的模块句柄。如果上述两个标识

符都未被设置,则该成员被忽略。

COLORREFrgbResult如果Flags成员设置了CC_RGBINIT标识符,该成员指定了对话框打

开时默认选择颜色。如果指定的颜色值不在有效的范围内,系统会自动选择最近的颜色值。如果该

成员为0或CC_RGBINIT未被设置,初始颜色是黑色。如果用户单击OK按钮,该成员指定了用

户选择的颜色。

COLORREF*lpCustColors指向一个包含16个COLORREF成员的数组,该数组包含了对

话框中用户自定义颜色的红、绿、蓝(RGB)值。如果用户修改这些颜色,系统将用新的颜色值更

新这个数组。如果要在多个ChooseColor函数中保存这个新的数组,你应该为该数组分配静态内存

空间。

DWORDFlags一个可以让你初始化颜色对话框的位集。当对话框返回时,它用来这些标

识符来标识用户的输入。该成员可以为下列标识符的任意组合。

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让对话框仅显示基本颜色组成的纯色。

LPARAMlCustData指定应用程序自定义的数据,该数据会被系统发送给钩子程序。当系

统的发送WM_INITDIALOG消息给钩子程序时,消息的lParam参数是一个指向CHOOSECOLOR

结构的指针。钩子程序可以利用该指针获得该成员的值。

LPCCHOOKPROClpfnHook指向CCHookProc钩子程序的指针,该钩子可以处理发送给对话

框的消息。该成员只在CC_ENABLEHOOK标识被设定的情况下才可用,否则该成员会被忽略。

LPCTSTRlpTemplateName指向一个NULL结尾的字符串,该字符串是对话框模板资源的

名字。

ChooseColor

BOOLChooseColor(

LPCHOOSECOLORlpcc//pointertostructurewithinitializationdata

);

返回值:如果用户点击了“确定”按钮,函数返回TRUE,并且在lpcc中保留用户选择的颜色。如

果用户单击“取消”或关闭对话框,将返回FALSE。

示例代码:

COLORREFcrCustColors[16]={0};

CHOOSECOLORcc;

memset(&cc,0,sizeof(CHOOSECOLOR));

tSize=sizeof(CHOOSECOLOR);

ner=this->m_hWnd;

nce=NULL;

ata=NULL;

Colors=crCustColors;

=CC_RGBINIT/*|CC_ANYCOLOR*/;

ult=RGB(255,255,0);

if(::ChooseColor(&cc)){

COLORREFclr=ult;

}

//打开颜色对话框后,默认颜色为黄色

//获取用户选择的颜色

上图是用两种方式调用系统对话框,然后用选择的颜色绘制线条,

具体可参考这篇文章:/s/blog_