工具箱控件实现指南

工具箱控件是一种在图形用户界面中常见的组件,它通常以树形结构展示命令按钮,允许用户进行选择和操作。本文将介绍如何在MFC(Microsoft Foundation Classes)框架中创建和使用这种控件。

工具箱控件概述

工具箱控件可以用于多种场景,例如作为主程序窗口内容选择的侧边栏,或者在设置窗口中选择当前页面。此外,它在不同的编辑器中也非常实用,可以用于选择工作工具或组件,并且可以通过鼠标拖拽到编辑器区域。

控件的创建和使用

工具箱控件是从CWnd类派生的,是一种基于MFC的通用控件,可以放置在任何窗口上,如主框架、对话框等。以下是创建控件并添加元素的步骤:

#include "ToolBoxCtrl.h" ToolBoxCtrlEx<ToolBoxCtrlStyle_base_system> m_ToolBox; if (!m_ToolBox.Create(this, WS_VISIBLE, CRect(10, 10, 100, 200), ID_ToolBoxCtrl)) return -1; // error // 加载组的图片 m_ToolBox.CreateImages(ToolBoxCtrl::ImageGroup, NULL, ID_PNG_GROUP_IMAGES, true, 11); // 加载项目的图片 m_ToolBox.CreateImages(ToolBoxCtrl::ImageItem, NULL, ID_PNG_ITEM_IMAGES, true, 16); // 添加组和项目 m_ToolBox.AddGroup(_T("Group 1")); m_ToolBox.AddItem(0, 1, _T("Item 1.1"), _T("Description for 'Item 1.1'"), 0); m_ToolBox.AddItem(0, 2, _T("Item 1.2"), _T("Description for 'Item 1.2'"), 1); m_ToolBox.AddGroup(_T("Group 2")); m_ToolBox.AddItem(1, 3, _T("Item 2.1"), _T("Description for 'Item 2.1'"), -1); m_ToolBox.AddItem(1, 4, _T("Item 2.2"), _T("Description for 'Item 2.2'"), 2); m_ToolBox.AddItem(1, 5, _T("Item 2.3"), _T("Description for 'Item 2.3'"), 3); // 从注册表加载状态 if (!m_ToolBox.LoadState(AfxGetApp(), _T("ToolBoxCtrl"), _T("State"))) m_ToolBox.CollapseGroup(1); // 一些默认状态 m_ToolBox.Update(true);

在上述代码中,首先包含了工具箱控件的头文件,并定义了一个控件实例。然后,创建了控件实例,并为其设置了可见性、位置和大小。接下来,加载了组和项目的图片资源,并添加了组和项目。最后,从注册表加载了控件的状态,并更新了控件以显示其状态。

自定义绘制和布局

ToolBoxCtrl类本身不执行任何渲染操作,而是调用ToolBoxCtrl::Draw接口的函数来进行绘制。要绘制ToolBoxCtrl,需要创建一个从ToolBoxCtrl::Draw类派生的类,实现其函数,并将ToolBoxCtrl::Draw指针传递给ToolBoxCtrl,使用ToolBoxCtrl::SetDrawManager函数调用。

同样,ToolBoxCtrl::IRecalc接口用于指定ToolBoxCtrl区域之间的间距。ToolBoxCtrl::ToolTip接口可以帮助为项目创建工具提示。还有一个ToolBoxCtrl::Notify类用于通知ToolBoxCtrl中的事件。这些接口的实现必须在整个控件运行期间存在。

ToolBoxCtrl::Draw和ToolBoxCtrl::IRecalc接口一起定义了控件的外观,它们的实现可以被称为风格。ToolBoxCtrl.cpp/ToolBoxCtrl.h文件包括四个预定义的风格类:ToolBoxCtrlStyle_base_system、ToolBoxCtrlStyle_classic_system、ToolBoxCtrlStyle_base_orange和ToolBoxCtrlStyle_classic_orange。前两个类使用系统颜色来绘制ToolBoxCtrl。如果只使用一种风格,那么使用模板类ToolBoxCtrlEx。风格类的名称被指定为模板参数,例如:

ToolBoxCtrlEx<ToolBoxCtrlStyle_base_system> m_ToolBox;

用户可以通过两种方式之一与ToolBoxCtrl交互:

当将ActivateModeClick值传递给ToolBoxCtrl::SetActivateMode函数时,树形项目的行为就像常规按钮。当点击它们时,会调用Notify::OnClickItem函数。

当使用ActivateModeDrag值时,树形项目必须通过鼠标拖动,例如,拖动到旁边的编辑器区域。在拖动开始时,会调用Notify::OnDragItemStart函数。有关此机制在程序中可能的实现的更多信息,请参阅Dialog.cpp文件中的OnDragItemStart、OnMouseMove、OnLButtonUp、OnCaptureChanged函数。

树形元素可以随时通过调用ToolBoxCtrl::CheckItem和ToolBoxCtrl::EnableItem进行检查和/或禁用。此外,控件本身能够发送请求以更新其中项目的的状态。为此,它会在短间隔内调用Notify::OnUpdateItemState函数。通过调用ToolBoxCtrl::EnableDynamicItemsUpdate(true)启用此模式。Notify::OnUpdateItemState函数可以单独为每个可见项目调用,也可以一次为所有项目调用。这由传递给ToolBoxCtrl::SetUpdateMode函数的值决定。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485