windows程序设计 之 「COLORS3.C 」范例分析笔记

使用ChooseColor对话框
本文介绍了一个使用ChooseColor对话框的示例程序,演示了如何通过CHOOSECOLOR结构初始化颜色对话框,并展示了如何获取用户选择的颜色。

/*----------------------------------------------
   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.

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值