VC实现类似Windows颜色选择器
时间: 2006-04-01 来自:天极开发
用过Windwos朋友都知道Windows系统在需要设置颜色地方都提供了个颜色选择器通过它用户可以选择自己喜爱颜色来设定应用界面例如在设置字体时候我们就可以通过颜色选择器来设置所要显示字体颜色为了在自己开发软件Software中实现颜色选择功能本例封装了个称为CColorPicker类它实现了上述选择颜色功能为了演示该类使用方法本例子在个对话框中添加了 3个颜色选择按钮其中两个颜色选择按钮分别用来让用户选择对话框背景颜色、对话框上字体颜色另外个颜色选择按钮和个编辑框绑定在起当用户选择颜色后编辑框Control控件显示当前颜色值编译运行后界面效果如图所示:
图、颜色选择器界面效果图
、实现思路方法
CColorPicker类是从CButton派生可以像般按钮样使用它考虑到封装性和使用方便其中鼠标光标和色彩对话框都采用动态建立该类提供自动绑定功能当选择颜色改变后立即将当前颜色值显示到绑定编辑Control控件上
要得到如上图所示界面效果CColorPicker类就要重载CButton类OnEraseBkgnd(CDC* pDC)重画背景在该中首先得到按钮区域尺寸使用CDC::Draw3dRect()、CDC::FillSolidRect()等来设置区域效果 然后为设备上下文CDC对象添加特定画笔对象在按钮区域使用CDC::MoveTo()、CDC::LineTo()等画上边缘线得到至于按钮上等黑色小 3角也是用通过类似思路来实现
当用户点击按钮后要创建个显示各种色彩窗口该窗口创建是通过设置WNDCLASS 对象实现该WNDCLASS结构如下:
typedef struct _WNDCLASS {
UINT style; //窗体类型;
WNDPROC lpfnWndProc; //该窗体对应处理发往该窗体消息都在此中处理;
cbClsExtra; //窗体类扩展;
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, // 窗口类型;
x, // 窗口水平位置;
y, // 窗口垂直位置;
nWidth, // 窗口宽度;
nHeight, // 窗口高度;
HWND hWndParent, // 父窗口句柄;
HMENU hMenu, // 菜单句柄;
HINSTANCE hInstance, // 应用句柄;
LPVOID lpParam // 创建窗口数据;
);
在退出时需要销毁创建窗口此时可以使用::DestroyWindow()、::UnregisterClass()来实现
上面只是创建了显示颜色表窗口关键部分是要在窗口中显示各种颜色动态获取、设置颜色为了显示各种颜色例子中分成两个步骤来实现第步是处理窗口WM_ERASEBKGND消息显示颜色表背景框架用黑色横线、竖线将显示颜色区域分割成个个小正方形;第 2步是处理窗口WM_PAINT消息向各个小方格填充相应颜色同时使用CDC::DrawFocusRect()根据当前窗口颜色方格索引来显示用户选择颜色方格为了动态跟踪用户在操纵颜色窗口时选择颜色也就是确定当前用户选择颜色方格索引需要处理WM_MOUSEMOVE它实现思路是根据鼠标位置来得到索引值和颜色值其中使用了::WindowFromPo()、GetPixel()、Crect::PtInRect()等关键它们功能分别是:从当前鼠标位置得到窗口句柄、从当前鼠标位置得到颜色值、判断当前鼠标位置是否在某个区域中但如何得到色彩选择器颜色改变通知呢?
将个编辑Control控件绑定到相显示颜色窗口很简单只要在该类中定义个窗口句柄用它来存放当前绑定到该类编辑框句柄就可以了
在使用该类过程中按钮BN_CLICKED单击事件已经成了颜色改变事件了我们只要像添加按钮单击处理样即可添加颜色改变处理在处理里我们可以通过COLORREF CColorPicker::GetColor得到COLORREF类型颜色值或者通过void CColorPicker::GetColor(CString& strColor)直接得到型如#FFFFFF样式串
下面就让我们来看看CColorPicker类具体使用步骤吧!
2、编程步骤
1、启动Visual C6.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中加上# \"ColorPicker.h\"同样思路方法来此处理m_btnColor2、 m_btnColor3按钮这些按钮分别用来在绑定编辑框上显示当前颜色、设置对话框背景和显示字体色;
4、使用Class Wizard为主对话框添加按纽单击、重画背景等消息处理,为CcolorPickerDemoDlg类添加COLORREF m_clrBKColor、COLORREF m_clrTEXTColor成员变量分别用来存放当前背景、文本颜色;
5、添加代码编译运行
最新评论