2010-03-18 98 views
3

看来,通过Disabled属性禁用复选框也会隐藏标题。有谁知道如何保持标题启用,但禁用输入?如何使MFC复选框为只读但启用文本?

编辑

根据保罗的想法,我已经做了以下(现在我想通了,静态标签和复选框具有透明性)。

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

但是,这给了我很奇怪的结果。当我在标签上展开复选框时,即使它们都是透明的,它也会覆盖标签。再次,我是MFC的新手(我是C#人),所以也许我错过了一些东西。

+0

你为什么要担心一下标签,如果该复选框被禁用? – djeidot 2010-03-22 15:33:57

回答

2

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

为了获得更多的爱好者,您可以创建一个自定义控件来托管一个复选框和一个可以重用的标签。也可以更容易地使自定义复选框像最终用户的预期一样行事,例如,当点击标签时可以将复选框设置为选中或取消选中,以及复选框本身。 (简单的解决方案不会自动将标签和复选框相关联,您可以在表单中对其进行编码,但如果您倾向于重用范例,则可能会变得很难看)。复选框控件(有许多MFC UI库),但这可能是矫枉过正。

看到这个伪布局:

你有这样的:(孤独的复选框控制)

[x "checkbox text"] 

摊开来是这样的:(Label控件对准旁边的复选框)

[x][label: "label text"] 

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

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

这听起来很合理。在我现在工作的代码中,还有其他一些将标签和文本字段关联起来的类,这些类与我正在做的事情类似。看到下一个评论更多... – bsh152s 2010-03-19 14:26:08

+0

但是,我注意到减少复选框到广场的一件事是,用户现在必须点击广场。之前,带有标题的标签,他们可以点击标题,复选框将被更改。一个解决方案是保持复选框没有标题,并在其上放置标签。但是,那么你会陷入绘画问题。有没有一种方法来设置只有控件ID的复选框颜色透明?我看到了CButton类的子类,但我试图将更改保持在最低限度。 – bsh152s 2010-03-19 14:26:33

+0

编辑原来的问题与我已经尝试过没有运气。 – bsh152s 2010-03-19 14:57:06

0

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

3

只需重写onClick事件并将复选框切换回原来的样子。

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

只是取消了“Auto”属性。 点击它时,它会在按钮关闭时显示为灰色,但不会再次切换,因此基本上它将是只读的,但仍然可以很好地用作输出信号。

*复选框属性:样式 自动 创建一个复选框,该复选框在被选中时自动在已选状态和未被选中状态之间切换。如果在Dialog Data Exchange中使用一组复选框,则必须将此属性设置为True。

Type: BoolDefault: True. *

0
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); 
} 
+0

请提供代码的解释。 – 2012-11-05 12:42:35

+0

当它是只读的时,样式从AUTOCHECKBOX更改为CHECKBOX,因此如果用户点击它,则复选标记不会更改。当只读关闭时会发生相反的情况。问题在于“点击”消息仍然被发送。 – 2013-08-20 00:47:25