颜色分量编辑器控件






4.93/5 (10投票s)
2002年4月3日
5分钟阅读

80833

2740
此控件允许您像在 Paint Shop Pro 中一样编辑颜色的 RGB 或 HSL 分量。
引言
在编辑颜色值时,互联网上提供了各种免费的自定义控件。大多数时候它们是颜色选择器、列表框、带有系统颜色和 HTML 颜色的属性表等。它们通常使用 RGB 分量,有时也使用 HSL 模型。我们觉得基于编辑器的颜色编辑器有所欠缺,于是我们决定模仿 Jasc Software 在 Paint Shop Pro 中使用的控件之一,以便逐个组件地在 RGB(红、绿、蓝)和 HSL(色相、饱和度、亮度)模型中编辑颜色值。
您可以在本文的顶部看到 PSP 中熟悉的颜色对话框的屏幕截图。
目标是开发一个具有相同行为和完全相同外观的控件。为什么?因为我们喜欢这个控件,并且觉得它应该自然地作为 MFC 类出现,成为一种标准。我们知道这段代码不是什么革命性的,但我们确信你们中的一些人会发现它对自己的项目很有价值。
那么,让我们先看看本文中介绍的类的对象设计。
设计
我们的框架由四个 GUI 类和两个实用类组成。像往常一样,对于自定义控件,我们将主类 GWCColorComponentEditCtrl
(名字相当长)从 CWnd
派生。这样做将允许客户端在设计时(因为我们还将定义一个窗口类)或在任何窗口中动态地将控件集成到 Cdialog
中。
这个主类链接到三个内部组件:
- 一个
CEdit
实例:用户必须能够直接在键盘上输入值。 - 一个
CspinButtonCtrl
实例:通过单击这些小箭头修改值也很方便。 - 一个名为
GWCGradientColorWnd
的静态窗口:这个弹出窗口可以通过鼠标从允许的最小值(0)拖动到最大值(255)来轻松查看颜色变化。
这是显示所有这些元素之间链接的类图。
您可以看到另一个名为 GWCColorComponentSet
的类。这是我们上面提到的实用类之一。我们创建它的原因是:大多数时候,您不会单独使用 GWCColorComponentEditCtrl
。相反,您将创建三个来编辑颜色的三个分量(RGB 或 HSL)。正如您在 PSP 屏幕截图中看到的,它们甚至显示了两种模型,共有六个控件。GWCColorComponentSet
允许链接所有这些组件,以便跟踪编辑的颜色,并在其中一个组件更改时通知组。它使客户端代码和使用此框架的努力降至最低。
另一个实用类 GWCColorFunc
是一个提供颜色转换实用函数的静态类。
另外请注意编辑控件下方的彩色线条。这是一种通过快速拖动鼠标来更改值的便捷方法。这种效果没有底层窗口。相反,该条由 GWCColorComponentEditCtrl
绘制。
安装
我们已准备好将代码作为库包含。只需将源包解压缩到一个目录中。打开工作区并编译所有所需的配置(混合了 release/debug/lib/dll/Unicode)。所有 lib 和 dll 文件都生成在名为 bin 的子目录中。
在 Visual C++ 中(工具 -> 选项 -> 目录选项卡),将 bin 目录添加到库目录列表中,并将其父目录添加到包含目录列表中。您可以将 bin 目录添加到您的路径中,或者将 dll 复制到 /windows/system32,这取决于您。
源代码已完整注释,因此我们不再详细介绍。让我们看看如何在对话框中使用它。这非常简单。
在您的 stdafx.h 文件中,添加以下行:
#include <GWCCCEInc.h>
您无需在项目中插入库文件,因为它将通过此包含的头文件自动完成。但是,在以下情况下,您必须在项目设置中添加一个预处理器变量:
- 如果您想将此控件用作静态库,请定义
_GWCCCECTRL_STATIC_
。 - 如果您想将此控件用作 DLL,并在您的某个 MFC DLL 中使用,请定义
_GWCCCECTRL_IN_OTHER_DLL
。
当然,您必须在代码中的某处有一个 COLORREF
变量(m_myColor
)来存储您的颜色。
创建
创建 GWCColorComponentSet
实例来保存我们将要创建的控件。
GWCColorComponentSet m_compSet;
在对话框编辑器中,创建任意数量的自定义控件,并将其窗口类设置为“ColorCompEditCtrl
”。它们的高度应与标准编辑控件相同。在对话框头文件中创建相应的变量。
GWCColorComponentEditCtrl m_myComponent;
创建的另一个步骤是,在您的对话框 DoDataExchange
方法中,为您的每个控件添加以下行:
DDX_Control(pDX, IDC_MYCOMPONENT, m_myComponent);
当控件在窗口中动态创建而不是在对话框中创建时,请使用以下方法:
为所有需要的 GWCColorComponentEditCtrl
实例分配内存并调用它们的 Create
方法。为标准外观使用 23 像素的高度。
初始化
现在您必须初始化每个控件,并告知它代表哪种分量。基本上,您在 OnInitDialog
中执行此操作:
m_myComponent.SetType(GWCColorComponentEditCtrl::RED);
您可以选择 RED
之外的 GREEN, BLUE, HUE, SAT, LIGHT
。
完成后,您将在 GWCColorComponentSet
实例中链接所有组件,并设置初始颜色。
m_compSet.RegisterComponentCtrl(m_myComponent); m_compSet.SetColor(m_myColor);
动态
当其中一个组件更改时,您的窗口或对话框可以收到通知。要执行此操作,您必须编写一个注册消息的处理程序。
在头文件中,在您的消息映射中添加此内容:
afx_msg LRESULT OnColorCompChanged(WPARAM wParam, LPARAM lParam);
在主体中添加此内容:
// In your message map : ON_REGISTERED_MESSAGE(WM_GWCCOLORCOMPEDIT_CHANGED, OnColorCompChanged) LRESULT CMyDialog::OnColorCompChanged(WPARAM wParam, LPARAM lParam) { m_myColor = m_compSet.GetColor(); return (LRESULT)0; }
wParam
包含分量的值(0 到 255),lParam
包含发送此消息的控件的窗口标识符。
免责声明
本软件、源代码和示例按“原样”提供。Aircom Software 对软件的质量、安全或适用性不作任何明示或暗示的陈述或保证,包括但不限于任何适销性、特定用途适用性或不侵权的暗示保证。