EnableGroupboxControls -一个非mfc函数,用于启用或禁用groupbox中的所有控件
介绍 EnableGroupboxControls是我在几个项目中使用的一个函数, 我想要启用/禁用groupbox中的所有控件。 在CodeProject - I上还有其他一些解决这个问题的方法 这里有一个列表。 然而,这些东西都没有我想要的东西: 能够用于MFC或非MFC项目-因为我花了很多时间 为了维护旧的Windows应用程序,我需要一个非常轻量级的解决方案。 能够在不实例化类的情况下使用——这一点很重要, 因为我必须尽量减少对现有代码的影响。 无需重新编码或重新定义现有控件即可使用 变量,原因和前面一样。 能够容纳嵌套的groupbox -许多对话框 在应用程序中,我维护的不是琐碎的,因为应用程序本身是 高度的技术。嵌套groupbox是一种应对方法 使用复杂的用户界面。 EnableGroupboxControls API 下面是EnableGroupboxControls函数: 隐藏,收缩,复制Code
//=============================================================================
//
// EnableGroupboxControls()
//
// Purpose: This function enables/disables all the controls that are
// completely contained with a groupbox.
//
// Parameters: hWnd - HWND of groupbox control
// bEnable - TRUE = enable controls within groupbox
//
// Returns: int - number of controls enabled/disabled. If zero is
// returned, it means that no controls lie within the
// rect of the groupbox.
//
int EnableGroupboxControls(HWND hWnd, BOOL bEnable)
{
int rc = 0;
if (::IsWindow(hWnd))
{
// get class name
TCHAR szClassName[MAX_PATH];
szClassName[0] = _T('\0');
::GetClassName(hWnd, szClassName, sizeof(szClassName)/sizeof(TCHAR)-2);
// get window style
LONG lStyle = ::GetWindowLong(hWnd, GWL_STYLE);
if ((_tcsicmp(szClassName, _T("Button")) == 0) &&
((lStyle & BS_GROUPBOX) == BS_GROUPBOX))
{
// this is a groupbox
RECT rectGroupbox;
::GetWindowRect(hWnd, &rectGroupbox);
// get first child control
HWND hWndChild = 0;
HWND hWndParent = ::GetParent(hWnd);
if (IsWindow(hWndParent))
hWndChild = ::GetWindow(hWndParent, GW_CHILD);
while (hWndChild)
{
RECT rectChild;
::GetWindowRect(hWndChild, &rectChild);
// check if child rect is entirely contained within groupbox
if ((rectChild.left >= rectGroupbox.left) &&
(rectChild.right <= rectGroupbox.right) &&
(rectChild.top >= rectGroupbox.top) &&
(rectChild.bottom <= rectGroupbox.bottom))
{
//TRACE(_T("found child window 0x%X\n"), hWndChild);
::EnableWindow(hWndChild, bEnable);
rc++;
}
// get next child control
hWndChild = ::GetWindow(hWndChild, GW_HWNDNEXT);
}
// if any controls were affected, invalidate the parent rect
if (rc && IsWindow(hWndParent))
{
::InvalidateRect(hWndParent, NULL, FALSE);
}
}
}
return rc;
}
EnableGroupboxControls演示 EnableGroupboxControls演示应用程序展示了控件如何在groupbox内 可以启用/禁用: 当未选中groupbox 1的复选框时,groupbox 1中的所有控件都将被选中 和groupbox 2被禁用: 下面是管理这些嵌套组框的代码: 隐藏,复制Code
void CEnableGroupboxControlsTestDlg::OnCheck1()
{
UpdateData(TRUE);
EnableGroupboxControls(::GetDlgItem(m_hWnd, IDC_GROUPBOX_1), m_bCheck1);
// enable controls within embedded groupbox
OnCheck2();
}
void CEnableGroupboxControlsTestDlg::OnCheck2()
{
UpdateData(TRUE);
EnableGroupboxControls(::GetDlgItem(m_hWnd, IDC_GROUPBOX_2), m_bCheck1 && m_bCheck2);
}
请注意,复选框和组框之间没有链接 除了你在上面的代码中看到的。属性中创建的两个组框 对话框模板带有空格字段(而不是文本)。然后复选框 创建并覆盖在groupbox上,因此视觉外观是 复选框“控制”的groupbox。下面是对话框模板 对于演示应用程序,两个复选框/组合框对突出显示: 用复选框覆盖groupbox头部将只在以下情况下工作 知道诀窍:groupbox必须按tab顺序位于复选框前面。 选项卡顺序就是控件在对话框模板中出现的顺序。 如果groupbox出现在复选框之后,它会覆盖复选框, 复选框对用户是不可见的。事情是这样的 因为对话框模板中控件的顺序也是顺序 在其中创建并在运行时显示控件。 您可以在Visual Studio中设置选项卡顺序,但要使用重叠控件 这并不是完全直接的。下面是对话框模板的样子 与VS2005一样,通过使选项卡顺序标签可见 菜单命令格式| Tab顺序: 用红色标注的两个groupbox标题是已经被标记的 覆盖了复选框。由于制表符顺序分别为1和2,以及8和9, 显示在彼此之上,是很难设置标签的顺序吗 VS IDE。但是,像往常一样,这里有一个技巧:暂时移动复选框 在groupbox的上面或下面,然后编辑选项卡顺序。当你 完成,将复选框移回来。 当然,没有必要在groupbox头中设置复选框, 为了使用EnableGroupboxControls。按钮标签 禁用Groupbox 3就是这样做的一个例子。 如何使用 步骤1 -添加文件 要将EnableGroupboxControls集成到应用程序中,首先需要 添加以下文件到您的项目: EnableGroupboxControls.cpp EnableGroupboxControls.h cpp文件应该设置为不使用预编译头 在Visual Studio。否则,您将得到错误 隐藏,复制Code
fatal error C1010: unexpected end of file while looking for precompiled header directive
步骤2 -添加头文件到源模块 在您希望使用EnableGroupboxControls的模块中, 包括头文件EnableGroupboxControls.h。 步骤3 -添加代码 当用户单击复选框(或进行某种选择)时。 添加如上面所示的代码,以调用EnableGroupboxControls 函数。 参考文献 下面是一些讨论管理控件的其他文章 groupbox内: 最简单的可检查的Groupbox类 与刘明的groupbox相关联的复选框 CGroupCheckBox控件由RancidCrabtree 集团控制保罗S.维克里 CGroup -一个由David Msika控制的强大的团队 修订历史 版本1.0 - 2008年4月9日 首次公开发行 使用 这个软件被发布到公共领域。你可以自由使用它 以您喜欢的任何方式,除了您不能出售此源代码。如果你 修改或扩展它,请考虑张贴新的代码在这里为每个人 与你分享。本软件是“按原样”提供的,没有任何明示或暗示 保修。我不承担任何损害或损失的业务 此软件可能导致。 本文转载于:http://www.diyabc.com/frontweb/news845.html

浙公网安备 33010602011771号