介绍 CGroupControl是一个派生的按钮类,它帮助使用组框。,带有BS_GROUPBOX样式的按钮)。CGroupControl可以方便地启用/禁用、显示/隐藏或移动组。组的父控件中不需要任何代码,因为当组控件本身被启用/禁用、显示/隐藏或移动时,这将自动完成。控件还包括一种机制,允许您对组中的每个控件执行任何操作。 如何使用它 使用CGroupControl类非常简单。按照以下步骤向现有项目中添加一个。 将源文件(GroupControl.cpp和GroupControl.h)放入您希望使用它们的目录之后,将这些文件添加到您的Visual Studio项目中。 在资源编辑器中,在您希望的地方添加一个组框,并给它一个ID,而不是默认的IDC_STATIC。 在类向导中,为您的组框控件添加一个成员变量,从“类别”列表中选择“控件”,从“变量类型”列表中选择“CGroupControl”。(如果CGroupControl没有出现在列表中,您可能需要删除类向导文件(.clw)并重新生成它。) 这就是您要利用启用、显示和移动功能所需要做的全部工作。 文档 控件有一个函数,该函数迭代它的兄弟控件,以查看它们是否位于group box控件的边界内。然后使用回调函数对这些项进行操作。包括的功能是为WM_ENABLE, WM_SHOWWINDOW,和wm_windowposchange的处理程序,但这可以很容易地扩展来执行任何操作。确定控件是否属于某个组的方法如下所述,后面是对回调机制的描述。 迭代 为了确定一个控件是否属于一个组,组控件遍历它的兄弟控件,获取它们的位置,并简单地测试它们是否位于组框的边界内。关于这一点有几个选择: 是否包含只在组内部分的控件,即。,重叠。 是查看所有控件,还是仅查看选项卡顺序将其放置在组框之后的控件。 默认情况下,该控件将不包括重叠的控件,并将查看所有兄弟控件。为了改变这种行为,可以使用以下两个函数:复制Code
void SetAllowOverlap(BOOL bAllowOverlap = TRUE); void SetUseTabOrder(BOOL bUseTabOrder = TRUE);
如果设置了UseTabOrder选项,那么该组将首先查看它的第一个兄弟控件,并在发现第一个控件不在其边界内时停止迭代。这将会稍微快一点,但是要依赖于正确设置了选项卡的顺序。 控制行动 回调函数签名为:Hide 复制Code
BOOL GroupControlActionFunc(CWnd*, LPARAM);
这是对GROUPCONTROLACTIONFUNC的类型定义。 用于遍历控件的函数是:Hide 复制Code
BOOL DoGroupControlAction(GROUPCONTROLACTIONFUNC pfnGCAF, LPARAM lParam = 0)
调用此函数(传递回调函数的地址)将遍历组的控件并调用每个控件的回调函数,传递一个指向控件的CWnd指针,以及传递给DoGroupControlAction的lParam。lParam用于将任何相关信息传递给回调函数。 例如,下面的代码是用来实现启用/禁用组控件的回调函数:复制Code
static BOOL GroupControlActionFunc_Enable(CWnd* pCtrl, LPARAM lParam) { if (pCtrl == NULL) return TRUE; BOOL bEnable = (BOOL)lParam; pCtrl->EnableWindow(bEnable); return TRUE; }
这是通过下面对DoGroupControlAction的调用调用的:Hide复制Code
DoGroupControlAction(GroupControlActionFunc_Enable, bEnable);
在这里,lParam仅用于指定是启用还是禁用控件。 通过调用IgnoreControls()函数并传入TRUE,可以将组控件设置为忽略它的控件并不对它们执行任何操作。这使得控制组作为一个正常的控制组。如果其他的子控件移动了它们所有的兄弟姐妹,这就特别有用,就像Peter Mares的CKCSideBannerWnd横幅控件一样。 功能 类中的公共函数如下: CGroupControl (); 标准的空构造函数 创建(LPCTSTR lpszCaption, DWORD dwStyle, const RECT & RECT, CWnd *pParentWnd, UINT nID); 创建控件。这与CButton::Create()相同,只是增加了检查组框的样式是否正确的功能。 布尔系,布尔系bOverlapped); 可用于确定任何控件是否属于某个组。如果控件的任何部分都在组的边界内,则函数返回TRUE。如果只有部分控件在组中,那么bOverlapped被设置为TRUE。 BOOL DoGroupControlAction(GROUPCONTROLACTIONFUNC pfnGCAF, LPARAM LPARAM = 0); 此函数可用于遍历组的控件,并对每个项执行操作。pfnGCAF是为每一项调用的回调函数,它传递一个表示控件的CWnd指针。lParam是传递到回调函数的应用程序定义值。注意,如果组控件被设置为忽略其co,那么调用此函数对控件没有影响技术特点。 (BOOL bUseTabOrder = TRUE); 如果bUseTabOrder为真,则将导致该组遍历控件,从该组之后的第一个同级控件开始,并以该组边界内的最后一个控件结束。如果bUseTabOrder为假,则该组将查看所有兄弟控件。 void SetAllowOverlap(BOOL bAllowOverlap = TRUE); 如果bAllowOverlap为真,那么如果控件的任何部分都在该组的边界内,则该组将认为该控件属于该组。如果bAllowOverlap为假,则整个控件必须位于该组的边界内才能属于该组。这只适用于遍历控件时。 BOOL GetUseTabOrder (); 返回迭代是否使用控制选项卡顺序。 BOOL GetAllowOverlap (); 返回重叠控件是否被认为属于该组。 void IgnoreControls(BOOL bIgnore = TRUE); 使组作为一个正常的组框,而不对组内的控件进行操作。注意,这对IsInGroup()函数的行为没有影响。 BOOL ControlsIgnored()常量; 返回组是否设置为忽略其控件。 历史 版本1.1 - 2005年2月17日 添加了“IgnoreControls”方法来允许组框被移动/调整大小等,而不需要组内的控件做同样的事情。,使组控制成为正常的组控制。如果其他的子控件像Peter Mares的CKCSideBannerWnd横幅控件那样移动它们的兄弟姐妹,这是很有用的。 版本1 - 2002年7月24日-第一版。 本文转载于:http://www.diyabc.com/frontweb/news511.html