zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    oc 基本基础类型之NSString
    oc 内存管理
    自定义的init方法和重写的init方法
    property属性
    iOS 开发朗读文字
    获取当前最顶层的ViewController
    二维码扫描的简单封装
    OC百度导航类的封装
    OC上传图片的封装(配合AFNetWorkiing)
    集成百度地图报错41个解决方法(转)
  • 原文地址:https://www.cnblogs.com/Dincat/p/13456143.html
Copyright © 2011-2022 走看看