在现代应用程序开发中,用户界面的美观和易用性是至关重要的。颜色选择器控件是用户界面中的一个重要组成部分,它允许用户从一组预定义的颜色中选择,或者自定义颜色。本文将介绍如何将一个基于Office XP设计的现代颜色选择器控件集成到WTL(Windows Template Library)应用程序中。
这个颜色选择器控件是由James White基于Chris Maunder的Office 97颜色选择器控件开发的。它为WTL应用程序提供了一个更新的颜色选择器,具有以下特点:
为了充分利用这个控件的功能,需要使用VS.NET/ATL7/WTL7。虽然它在ATL3/WTL3上未经测试,但由于主题支持是可选的,所以有很大的可能性它也能工作。
首先,将CColorButton.h和CColorButton.cpp文件复制到应用程序目录中。接下来,将这两个文件添加到项目中。为了启用许多小功能,需要正确定义WINVER和_WIN32_WINNT。可以在stdafx.h文件中定义这些值。
如果想支持XP主题,请在stdafx.h文件中添加以下代码:
#include
这应该放在所有其他ATL包含文件之后。
CColorButton大量使用了ATL的帮助类型。需要确保在stdafx.h中包含"atltypes.h"和"atlgdi.h"。
使用资源编辑器向对话框中添加一个按钮。不需要对按钮进行样式调整。
编辑对话框的类定义。在消息映射中,添加以下代码:
REFLECT_NOTIFICATIONS()
在对话框类的定义之前,添加以下代码:
#include "ColorButton.h"
在对话框类中添加一个新的成员变量,类将是"CColorButton",可以给它起任何喜欢的名字。
在对话框的OnInitDialog中,添加一行代码来子类化控件。重要的是,它必须被子类化,而不仅仅是分配一个窗口句柄。
以下是一个正确子类化控件的示例:
LRESULT CMainDlg::OnInitDialog(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
// center the dialog on the screen
CenterWindow();
m_btnMyColor1.SubclassWindow(GetDlgItem(IDC_COLOR_1));
m_btnMyColor2.SubclassWindow(GetDlgItem(IDC_COLOR_2));
m_btnMyColor3.SubclassWindow(GetDlgItem(IDC_COLOR_3));
m_btnMyColor2.SetDefaultText(_T(""));
m_btnMyColor2.SetCustomText(_T(""));
m_btnMyColor3.SetDefaultText(_T("My Default Text"));
m_btnMyColor3.SetCustomText(_T(""));
return TRUE;
}
颜色选择器支持三种类型的颜色:默认颜色、自定义颜色和调色板颜色。调色板颜色是显示给用户的颜色数组。默认颜色显示为顶部的大按钮,文本由应用程序提供。默认文本是"Automatic"。自定义颜色显示为底部的大按钮,文本由应用程序提供。默认文本是"Custom..."。
Chris最初实现颜色选择器的方式非常好,99%的操作对应用程序开发者来说是完全透明的。当应用程序与颜色选择器交互时,它只需要关心当前选择的颜色。这个颜色是一个标准的COLORREF,可以使用RGB(红、绿、蓝)宏轻松设置。当应用程序需要将颜色选择器设置为特定值时,只需将COLORREF值传递给SetColor方法。
当需要检索当前颜色时,只需调用GetColor方法。处理默认颜色除外。
默认颜色使用特殊的COLORREF值CLR_DEFAULT处理。当这个值传递给SetColor方法时,颜色按钮会识别它为一个特殊值。当实际选择器显示时,将突出显示默认选择。然而,当设置默认颜色时,颜色按钮必须知道按钮中显示什么颜色。这个颜色可以通过使用SetDefaultColor方法设置。如果这个值没有设置,那么颜色按钮将显示应用程序工作区背景的默认颜色。
当用户在颜色选择器中选择默认颜色时,GetColor方法将返回CLR_DEFAULT。这允许应用程序区分默认颜色被选择和调色板中选择的颜色与实际默认颜色的RGB值相匹配。
自定义颜色对应用程序开发者来说是完全透明的。不需要特殊编程。
以下是CColorButton的一些公共成员函数:
通知使用标准的WM_NOTIFY消息发送。以下是一些定义:
CPN_SELCHANGE在用户更改当前选择后发送给父窗口。它也会在用户在选择器窗口中跟踪不同的按钮时发送。如果用户在跟踪时取消选择器,CPN_SELCHANGE会在颜色恢复到显示选择器之前选择的颜色时发送给父窗口。当CPN_SELCHANGE作为跟踪的一部分发送时,通知结构的fColorValid元素设置为true,如果用户跟踪到一个有效的颜色选择。当为false时,用户已将鼠标移出选择器窗口。