下载本文示例代码
用过Windwos的朋友都知道,Windows系统在需要设置颜色的地方都提供了一个颜色选择器,通过它用户可以选择自己喜爱的颜色来设定应用程序的界面,例如在设置字体的时候,我们就可以通过颜色选择器来设置所要显示的字体的颜色。为了在自己开发的软件中实现颜色的选择功能,本例封装了一个称为CColorPicker的类,它实现了上述的选择颜色的功能。为了演示该类的用法,本例子在一个对话框程序中添加了三个颜色选择按钮,其中两个颜色选择按钮分别用来让用户选择对话框背景颜色、对话框上的字体颜色,另外一个颜色选择按钮与一个编辑框绑定在一起,当用户选择颜色后,编辑框控件显示当前颜色的值。程序编译运行后的界面效果如图一所示:
图一、颜色选择器界面效果图 一、实现方法 CColorPicker类是从CButton派生的,可以像一般的按钮一样使用它。因为考虑到封装性与使用的方便,其中的鼠标光标与色彩对话框都采用动态建立。该类提供自动绑定的功能,当选择的颜色改变后,立即将当前的颜色值显示到绑定的编辑控件上。 要得到如上图所示的界面效果,CColorPicker类就要重载CButton类的OnEraseBkgnd(CDC* pDC)重画背景函数,在该函数中首先得到按钮的区域尺寸,使用CDC::Draw3dRect()、CDC::FillSolidRect()等函数来设置区域效果, 然后为设备上下文CDC对象添加特定的画笔对象,在按钮区域使用CDC::MoveTo()、CDC::LineTo()等函数画上边缘线得到的,至于按钮上等黑色小三角,也是用通过类似思路来实现的。 当用户点击按钮后,要创建一个显示各种色彩的窗口,该窗口的创建是通过设置WNDCLASS 对象实现的,该WNDCLASS结构如下:
typedef struct _WNDCLASS { UINT style; //窗体类型; WNDPROC lpfnWndProc; //该窗体对应的处理函数,发往该窗体的消息都在此函数中处理; int cbClsExtra; //窗体类的扩展; int cbWndExtra; //窗口的扩展 HINSTANCE hInstance; //包含窗口的应用程序实例句柄; HICON hIcon; //窗口图标句柄; HCURSOR hCursor; //窗口光标句柄; HBRUSH hbrBackground; //窗口背景画刷; LPCTSTR lpszMenuName; //窗口菜单资源名; LPCTSTR lpszClassName; //窗口类名;} WNDCLASS, *PWNDCLASS; 填充过上述窗口类的结构成员后,使用API函数::RegisterClass()在Windows中注册该窗口类,最后就可以使用API函数::CreateWindowEx()、::ShowWindow()来创建、显示该窗口了。::CreateWindowEx()函数的原型为:
HWND CreateWindowEx( DWORD dwExStyle, // 扩展的窗口类; LPCTSTR lpClassName, // 注册的窗口类名; LPCTSTR lpWindowName, // 窗口名; DWORD dwStyle, // 窗口类型; int x, // 窗口的水平位置; int y, // 窗口的垂直位置; int nWidth, // 窗口的宽度; int nHeight, // 窗口的高度; HWND hWndParent, // 父窗口句柄; HMENU hMenu, // 菜单句柄; HINSTANCE hInstance, // 应用程序句柄; LPVOID lpParam // 创建窗口的数据;); 在程序退出时,需要销毁创建的窗口,此时可以使用::DestroyWindow()、::UnregisterClass()来实现。 上面的只是创建了显示颜色表的窗口,关键的部分是要在窗口中显示各种颜色,动态的获取、设置颜色。为了显示各种颜色,例子中分成两个步骤来实现,第一步是处理窗口的WM_ERASEBKGND消息,显示颜色表的背景框架,用黑色的横线、竖线将显示颜色的区域分割成一个个小正方形;第二步是处理窗口的WM_PAINT消息,向各个小方格填充相应的颜色,同时使用CDC::DrawFocusRect()函数根据当前窗口的颜色方格的索引来显示用户选择的颜色方格。为了动态跟踪用户在操纵颜色窗口时选择的颜色,也就是确定当前用户选择的颜色方格的索引,需要处理WM_MOUSEMOVE,它的实现思路是根据鼠标的位置来得到索引值的和颜色值,其中使用了::WindowFromPoint()、GetPixel()、Crect::PtInRect()等关键的函数,它们的功能分别是:从当前鼠标位置得到窗口的句柄、从当前鼠标位置得到颜色值、判断当前鼠标位置是否在某个区域中。但如何得到色彩选择器颜色改变的通知呢? 将一个编辑控件绑定到相显示颜色的窗口很简单,只要在该类中定义个窗口句柄,用它来存放当前绑定到该类的编辑框的句柄就可以了。 在使用该类的过程中,按钮的BN_CLICKED的单击事件已经成了颜色改变的事件了。我们只要像添加按钮单击处理函数一样即可添加颜色改变处理函数。在处理函数里我们可以通过COLORREF CColorPicker::GetColor()函数得到COLORREF类型的颜色值,或者通过void CColorPicker::GetColor(CString& strColor)函数直接得到型如#FFFFFF样式的字符串。 下面就让我们来看看CColorPicker类的具体使用步骤吧! 二、编程步骤 1、启动Visual C 6.0,创建一个基于对话框的应用程序,该程序命名为ColorPickerDemo; 2、在项目代码中添加ColorPicker类; 3、利用资源编辑器在主对话框中加入ID为IDC_EDIT1的编辑框;添加ID为IDC_BUTTON1的按钮,在Style中设置其为Owner draw属性。在CColorPickerDemoDlg类中为IDC_BUTTON1添加Control类别的成员变量(Member Variables)m_btnColor1,然后在ColorPickerDemoDlg.h中将CButton m_btnColor1改为CColorPicker m_btnColor1,并在ColorPickerDemoDlg.h中加上#include "ColorPicker.h",同样的方法来此处理m_btnColor2、 m_btnColor3按钮,这些按钮分别用来在绑定编辑框上显示当前颜色、设置对话框的背景和显示字体色; 4、使用Class Wizard为主对话框添加按纽单击、重画背景等消息处理函数,为CcolorPickerDemoDlg类添加COLORREF m_clrBKColor、COLORREF m_clrTEXTColor成员变量,分别用来存放当前的背景、文本颜色; 5、添加代码,编译运行程序。共2页。 1 2 :
用过Windwos的朋友都知道,Windows系统在需要设置颜色的地方都提供了一个颜色选择器,通过它用户可以选择自己喜爱的颜色来设定应用程序的界面,例如在设置字体的时候,我们就可以通过颜色选择器来设置所要显示的字体的颜色。为了在自己开发的软件中实现颜色的选择功能,本例封装了一个称为CColorPicker的类,它实现了上述的选择颜色的功能。为了演示该类的用法,本例子在一个对话框程序中添加了三个颜色选择按钮,其中两个颜色选择按钮分别用来让用户选择对话框背景颜色、对话框上的字体颜色,另外一个颜色选择按钮与一个编辑框绑定在一起,当用户选择颜色后,编辑框控件显示当前颜色的值。程序编译运行后的界面效果如图一所示:
图一、颜色选择器界面效果图 一、实现方法 CColorPicker类是从CButton派生的,可以像一般的按钮一样使用它。因为考虑到封装性与使用的方便,其中的鼠标光标与色彩对话框都采用动态建立。该类提供自动绑定的功能,当选择的颜色改变后,立即将当前的颜色值显示到绑定的编辑控件上。 要得到如上图所示的界面效果,CColorPicker类就要重载CButton类的OnEraseBkgnd(CDC* pDC)重画背景函数,在该函数中首先得到按钮的区域尺寸,使用CDC::Draw3dRect()、CDC::FillSolidRect()等函数来设置区域效果, 然后为设备上下文CDC对象添加特定的画笔对象,在按钮区域使用CDC::MoveTo()、CDC::LineTo()等函数画上边缘线得到的,至于按钮上等黑色小三角,也是用通过类似思路来实现的。 当用户点击按钮后,要创建一个显示各种色彩的窗口,该窗口的创建是通过设置WNDCLASS 对象实现的,该WNDCLASS结构如下:
typedef struct _WNDCLASS { UINT style; //窗体类型; WNDPROC lpfnWndProc; //该窗体对应的处理函数,发往该窗体的消息都在此函数中处理; int cbClsExtra; //窗体类的扩展; int cbWndExtra; //窗口的扩展 HINSTANCE hInstance; //包含窗口的应用程序实例句柄; HICON hIcon; //窗口图标句柄; HCURSOR hCursor; //窗口光标句柄; HBRUSH hbrBackground; //窗口背景画刷; LPCTSTR lpszMenuName; //窗口菜单资源名; LPCTSTR lpszClassName; //窗口类名;} WNDCLASS, *PWNDCLASS; 填充过上述窗口类的结构成员后,使用API函数::RegisterClass()在Windows中注册该窗口类,最后就可以使用API函数::CreateWindowEx()、::ShowWindow()来创建、显示该窗口了。::CreateWindowEx()函数的原型为:
HWND CreateWindowEx( DWORD dwExStyle, // 扩展的窗口类; LPCTSTR lpClassName, // 注册的窗口类名; LPCTSTR lpWindowName, // 窗口名; DWORD dwStyle, // 窗口类型; int x, // 窗口的水平位置; int y, // 窗口的垂直位置; int nWidth, // 窗口的宽度; int nHeight, // 窗口的高度; HWND hWndParent, // 父窗口句柄; HMENU hMenu, // 菜单句柄; HINSTANCE hInstance, // 应用程序句柄; LPVOID lpParam // 创建窗口的数据;); 在程序退出时,需要销毁创建的窗口,此时可以使用::DestroyWindow()、::UnregisterClass()来实现。 上面的只是创建了显示颜色表的窗口,关键的部分是要在窗口中显示各种颜色,动态的获取、设置颜色。为了显示各种颜色,例子中分成两个步骤来实现,第一步是处理窗口的WM_ERASEBKGND消息,显示颜色表的背景框架,用黑色的横线、竖线将显示颜色的区域分割成一个个小正方形;第二步是处理窗口的WM_PAINT消息,向各个小方格填充相应的颜色,同时使用CDC::DrawFocusRect()函数根据当前窗口的颜色方格的索引来显示用户选择的颜色方格。为了动态跟踪用户在操纵颜色窗口时选择的颜色,也就是确定当前用户选择的颜色方格的索引,需要处理WM_MOUSEMOVE,它的实现思路是根据鼠标的位置来得到索引值的和颜色值,其中使用了::WindowFromPoint()、GetPixel()、Crect::PtInRect()等关键的函数,它们的功能分别是:从当前鼠标位置得到窗口的句柄、从当前鼠标位置得到颜色值、判断当前鼠标位置是否在某个区域中。但如何得到色彩选择器颜色改变的通知呢? 将一个编辑控件绑定到相显示颜色的窗口很简单,只要在该类中定义个窗口句柄,用它来存放当前绑定到该类的编辑框的句柄就可以了。 在使用该类的过程中,按钮的BN_CLICKED的单击事件已经成了颜色改变的事件了。我们只要像添加按钮单击处理函数一样即可添加颜色改变处理函数。在处理函数里我们可以通过COLORREF CColorPicker::GetColor()函数得到COLORREF类型的颜色值,或者通过void CColorPicker::GetColor(CString& strColor)函数直接得到型如#FFFFFF样式的字符串。 下面就让我们来看看CColorPicker类的具体使用步骤吧! 二、编程步骤 1、启动Visual C 6.0,创建一个基于对话框的应用程序,该程序命名为ColorPickerDemo; 2、在项目代码中添加ColorPicker类; 3、利用资源编辑器在主对话框中加入ID为IDC_EDIT1的编辑框;添加ID为IDC_BUTTON1的按钮,在Style中设置其为Owner draw属性。在CColorPickerDemoDlg类中为IDC_BUTTON1添加Control类别的成员变量(Member Variables)m_btnColor1,然后在ColorPickerDemoDlg.h中将CButton m_btnColor1改为CColorPicker m_btnColor1,并在ColorPickerDemoDlg.h中加上#include "ColorPicker.h",同样的方法来此处理m_btnColor2、 m_btnColor3按钮,这些按钮分别用来在绑定编辑框上显示当前颜色、设置对话框的背景和显示字体色; 4、使用Class Wizard为主对话框添加按纽单击、重画背景等消息处理函数,为CcolorPickerDemoDlg类添加COLORREF m_clrBKColor、COLORREF m_clrTEXTColor成员变量,分别用来存放当前的背景、文本颜色; 5、添加代码,编译运行程序。共2页。 1 2 :
下载本文示例代码
VC实现类似Windows的颜色选择器VC实现类似Windows的颜色选择器VC实现类似Windows的颜色选择器VC实现类似Windows的颜色选择器VC实现类似Windows的颜色选择器VC实现类似Windows的颜色选择器VC实现类似Windows的颜色选择器VC实现类似Windows的颜色选择器VC实现类似Windows的颜色选择器VC实现类似Windows的颜色选择器VC实现类似Windows的颜色选择器VC实现类似Windows的颜色选择器VC实现类似Windows的颜色选择器VC实现类似Windows的颜色选择器VC实现类似Windows的颜色选择器
阅读(193) | 评论(0) | 转发(0) |