通用“井”控件(ColorPicker,ArrowPicker等)





4.00/5 (9投票s)
2002 年 11 月 25 日
3分钟阅读

74670

1818
提供并演示了一个通用的“井”控件的使用,该控件可用于实现颜色拾取器、哈希风格的选择器等
引言
我需要一个颜色拾取器用于我正在开发的矢量绘图程序。 在尝试了 CodeGuru 和 CodeProject 的几个颜色拾取器示例后,我发现我真正需要的是一个通用的“井”控件。 它不仅可以作为颜色拾取器的基类,还可以作为其他控件的基类。 此外,我希望这个井控件既可以用作对话框或视图中的按钮,也可以用作弹出窗口。 我还认为,如果不需要自定义绘制,使用位图资源来绘制每个井会很好。
使用代码
将所有的 *.h 文件和 *.cpp 文件复制到您的项目中。 如果您想使用 Office 风格的颜色拾取器,请将对话框和位图的资源添加到您的项目中。 演示项目中有四个井控件: CSVizColorWell
, CSVizArrowWell
, CSVizLineStyleWell
, CSVizHatchWell.
由于颜色井不仅用于选择颜色,还用于选择填充图案(GD+ HatchBrush),因此您需要下载 Microsoft SDK 以支持 GDI+。 这四个井控件都派生自 CSVizWellCtrl.
如果您想实现自己的井控件,您可以将您的 CXXXWell
派生自 CSVizWellCtrl
。 在大多数情况下,您只需要重写以下三个虚函数和构造函数
virtual void Initialise (); virtual CString GetWellName (int nIndex) { return "well"; } virtual void DrawCellContent (CDC* pDC, int nIndex, CRect rect,BYTE state);
在 Initialise()
中,您定义井的默认大小、列数、行数以及井控件的外观。 目前,这个井控件只有两种外观,一种是常见的 Windows 控件外观,另一种是 Office 2000 风格。 GetWellName()
是一个非常简单的函数,用于返回当前选定井的名称。 该井控件的关键函数是 DrawCellContent()
,它绘制每个井的内容。
使用 CSVizWellCtrl
有两种情况。 一种是在弹出窗口中使用,另一种是在对话框中使用。 这四个示例井控件演示了这两种情况。 CSVizArrowWell
也是一个很好的示例代码,展示了如何在绘制单元格内容时使用位图资源。
-
要在弹出窗口中使用(例如
CSVizColorPopupWell
,CSVizArrowWell
),您必须使用辅助类来弹出井控件窗口。 对于CSVizColorWell
,它是CColorPikcer
,对于CSVizArrowWell
,它是CArrowPicker
。 您应该在CColorPikcer
和CArrowPicker
的OnClicked()
函数中创建井控件窗口。 在这种情况下,井控件的父窗口是辅助类窗口。new CSVizArrowWell(CPoint(rect.left, rect.bottom), // Point to display popup GetArrow(), // Selected arrow this , // parent WELL_STYLE_OFFICE | WELL_STYLE_AUTODELETE | WELL_STYLE_POPUP );
-
要用作按钮,您不需要在代码中创建该控件。 使用类向导或手动添加
DDX_Control(pDX, IDC_YOUR_WELLBTN, m_Yourwellbtn);
到对话框的
DoDataExchange(CDataExchange* pDX)
函数。 在这种情况下,井控件的父窗口是对话框类。
关注点
这个井控件派生自 CButton
而不是直接派生自 CWnd
。 当您在基于对话框的应用程序中使用它时,这很方便,因为您可以使用标准的 DDX_Control()
函数。 它也可以用作弹出窗口,就像 CSVizColorWell
那样。
使用位图资源,此井控件可以用作对话框中的工具栏,或者您可以在其中创建一个带有井控件的控件栏。
CSVizColorWell
本身可能对自定义 GDI+ 的填充画刷很有用。 它支持 GLinearGradientBrush
, PathGradientBrush
, TextureBrush
和 HatchBrush
的配置。
待办事项列表
- 在颜色井中记录自定义颜色
- 集成类似 Photoshop 和 FrontPage 2000 的颜色吸管
致谢
颜色拾取器和通用井控件的一些好主意来自 Chris Maunder、Alexander Bischofberger、Paul Wilkerson 和 Geir Arne Trillhus 的帖子。 所有感激的反馈都应传递给他们,投诉应传递给我。 那些贡献也可以在 CodeProject 中找到。
许可协议
此代码可以以编译形式以任何您希望的方式使用(包括商业用途)。 该代码可以未经修改地重新分发,但前提是它不能用于营利目的,而作者没有书面同意,并且该通知以及作者的姓名和所有版权声明保持不变。
本软件“按原样”提供,不提供任何明示或暗示的保证。 请自担风险使用!