【问题标题】:How do I make MFC checkbox read-only but keep text enabled?如何使 MFC 复选框只读但保持启用文本?
【发布时间】:2010-03-18 19:33:44
【问题描述】:

似乎通过 Disabled 属性禁用复选框也会使标题变灰。有谁知道如何保持字幕启用但禁用输入?

编辑

基于 Paul 的想法,我做了以下事情(现在我发现静态标签和复选框具有透明属性)。

  1. 添加了几个复选框。
  2. 将复选框标题设置为空。
  3. 将复选框透明属性设置为 true。
  4. 在复选框旁边添加几个标签。
  5. 将标签的透明属性更改为 true。
  6. 扩展复选框以包含标签(因此单击标签将触发复选框更改)。

但是,这给了我非常奇怪的结果。当我在标签上展开复选框时,即使两者都是透明的,它也会覆盖标签。再说一次,我是 MFC 的新手(我是 C# 人),所以我可能遗漏了一些东西。

【问题讨论】:

  • 如果复选框被禁用,您为什么还要担心点击标签?

标签: visual-c++ layout checkbox mfc readonly


【解决方案1】:

只需覆盖 onClick 事件并将复选框切换回之前的状态。

void CMyDialog::OnBnClickedMyCheckBox()
{
    m_myCheckBox.SetCheck(!m_myCheckBox.GetCheck());    
}

【讨论】:

    【解决方案2】:

    只需使用Auto 属性,不要选中它。

    当点击它时,它不会再切换了,所以基本上它是只读的,但仍然可以作为输出正常工作。

    复选框属性:样式 自动 创建一个复选框,当 选中,自动在选中和未选中状态之间切换。 如果您使用一组检查,则必须将此属性设置为 True 对话框数据交换框。

    Type: Bool, Default: True.

    【讨论】:

      【解决方案3】:

      快速简单的解决方法是不使用复选框的文本成员(将其设置为“”),将复选框缩小到仅可点击的方块,然后在复选框旁边放置一个标签。

      为了更有趣,您可以创建一个自定义控件,其中包含一个复选框和一个可以重用的标签。使自定义复选框的行为符合最终用户的预期也是一种更简单的方法,例如能够在单击标签以及复选框本身时将复选框设置为选中或未选中。 (简单的解决方案不会自动关联标签和复选框。您可以在表单中对其进行编码,但如果您倾向于重用范例,这可能会很快变得丑陋。)

      您也可以四处寻找第 3 方复选框控件(那里有许多 MFC UI 库),但这可能有点过头了。

      查看这个伪布局:

      你有这个:(单独的复选框控件)

      [x "checkbox text"]
      

      像这样布置它:(标签控件在复选框旁边对齐)

      [x][label: "label text"]
      

      用类似的方式处理标签的点击事件:

      void OnLabelClick(...) {
          if (checkBox.Enabled)
              checkBox.Checked = !checkBox.Checked;
      }
      

      【讨论】:

      • 这听起来很合理。在我现在正在使用的代码中,还有其他将标签和文本字段关联起来的类,这些类和我正在做的事情相似。有关更多信息,请参阅下一条评论...
      • 但是,我注意到将复选框缩小到正方形的一件事是用户现在必须单击正方形。以前,使用带标题的标签,他们可以单击标题,然后复选框将被更改。一种解决方案是使复选框保持展开而没有标题,并在其顶部放置一个标签。但是,然后您会遇到绘图问题。有没有办法只用控件ID设置复选框颜色透明?我看到了 CButton 类的子类选项,但我试图将更改保持在最低限度。
      • 用我没有运气的尝试编辑了原始问题。
      • 你把事情弄得太复杂了。使复选框变小(不要拉伸文本部分),在复选框旁边放一个标签,当点击标签时(处理标签的点击事件)反转相关复选框的值。不要弄乱任何覆盖或透明度的东西。没必要。
      • 谢谢,有时候我确实想得太难了。
      【解决方案4】:

      除非存在其他条件,否则您可以取消选择单击功能中的框。

      【讨论】:

        【解决方案5】:
        void SetCheckBoxReadOnly(CButton* i_checkBox, bool i_readOnly)
        {
            if (!i_checkBox)
            {
                return;
            }
        
            // Clear/set "Auto" property
            if (i_readOnly)
            {
                i_checkBox->ModifyStyle(BS_AUTOCHECKBOX, BS_CHECKBOX);
            }
            else
            {
                i_checkBox->ModifyStyle(BS_CHECKBOX, BS_AUTOCHECKBOX);
            }
        
            // Set a grey background for check square - looks like disabled :)
            i_checkBox->SetState(i_readOnly ? TRUE : FALSE);
        }
        

        【讨论】:

        • 只读时,样式由AUTOCHECKBOX变为CHECKBOX,所以如果用户点击,勾号不会改变。关闭只读时会发生相反的情况。问题是仍然发送“点击”消息。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-30
        • 2013-11-12
        • 1970-01-01
        • 2021-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多