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('');
        ::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
"), 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

原文地址:https://www.cnblogs.com/Dincat/p/13456143.html