Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I make a group box's text bold but not the text of controls contained in it?

I went and created a tab containing a good amount of controls, most of which are contained within what I'll just call the top-level group box. Now I decide I'd like the text of the top-level group box to be bold, but nothing else. When I set the top-level group box's font to bold, however, all of the controls contained within it become bolded as well, which is what I don't want. I can set each individual control's bold property to false, but it seems like there should be an easier way to do this. Any ideas?

I'm probably missing something obvious, like a group box property that is staring me in the face--and apologize if this turns out to be the case.

Thanks in advance for any help.

like image 374
RobC Avatar asked Feb 17 '12 01:02

RobC


People also ask

How to make text bold?

Type the keyboard shortcut: CTRL+B.

How to bold text HTML?

The HTML <b> element defines bold text, without any extra importance.


2 Answers

You could bypass the problem by placing a label over the caption for the GroupBox, but I wouldn't necessarily recommend this.

A better solution emerges once you understand what is happening and why it is happening. The issue is that a control's font (among other things) is an ambient property, meaning that child controls inherit their parent/container control's properties. So if you set the GroupBox to use a bold font, all of its child controls automatically inherit the bold property by default.

The key there is, of course, by default. Ambient properties only apply if you don't explicitly set the properties of the children to something else. If you don't want the child controls to be bold, select them all and turn off bold. The settings of the parent/container will no longer override the new custom settings.

To make things even easier, you can add a Panel control to your GroupBox, dock/anchor it to fill the entire client area of the GroupBox control, and set it to use a standard, non-bold font. Then, the rules of ambient controls stipulate that the child controls you add to the Panel will not be bold by default. This way, you only have to change the font property of one control as opposed to every child control that you add to the GroupBox.

The reason that this is better than trying to add a Label control over the GroupBox caption is because a GroupBox is designed to contain controls. You can take advantage of the docking and anchoring properties to make sure that everything gets arranged correctly, and you won't have to fight the designer when doing so to make sure that your custom Label correctly covers up the default label drawn by the GroupBox control. Additionally, you won't run into Z order issues or have other redrawing problems rear their ugly heads at runtime when, for example, the Label control gets accidentally hidden behind the GroupBox and no one can see it (and a host of other potential snafus).

like image 109
Cody Gray Avatar answered Oct 11 '22 09:10

Cody Gray


I came across this old question when searching for the same, and realised it could be solved in code without adding a separate control just to overcome the ambience issue that Code Gray mentions in his answer.

Add an extensions in a module like so:

<Extension()>
Public Sub UnBold(Of T As Control)(cc As Control.ControlCollection)
    For Each c As Control In cc
        If Not TypeOf c Is T AndAlso c.GetType.GetProperty("Font") IsNot Nothing Then
            Dim RegularFont As New Font(c.Font.FontFamily, c.Font.Size, FontStyle.Regular)
            c.Font = RegularFont
        ElseIf c.HasChildren Then
            UnBold(Of T)(c.Controls)
        End If
    Next
End Sub

Then unbold all the controls in all the GroupBoxes on a form (including any child GroupBoxes) by using as follows in the form's OnLoad event:

Me.Controls.UnBold(Of GroupBox)()

Or for all controls in a single GroupBox (again, including any child GroupBoxes):

MySpecificGroupBox.UnBold(Of GroupBox)()

With the proviso that if you actually want control within the GroupBox to actually stay emboldened you will have to set that in code after calling the extension.

like image 36
Toby Avatar answered Oct 11 '22 08:10

Toby