65.9K
CodeProject 正在变化。 阅读更多。
Home

颜色分量编辑器控件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.93/5 (10投票s)

2002年4月3日

5分钟阅读

viewsIcon

80833

downloadIcon

2740

此控件允许您像在 Paint Shop Pro 中一样编辑颜色的 RGB 或 HSL 分量。

Sample Image - colors.jpg

引言

在编辑颜色值时,互联网上提供了各种免费的自定义控件。大多数时候它们是颜色选择器、列表框、带有系统颜色和 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 对软件的质量、安全或适用性不作任何明示或暗示的陈述或保证,包括但不限于任何适销性、特定用途适用性或不侵权的暗示保证。

© . All rights reserved.