Click here to Skip to main content
15,886,362 members
Articles / Programming Languages / C++
Article

Collapsed groupbox

Rate me:
Please Sign up or sign in to vote.
4.35/5 (17 votes)
9 Oct 2009CPOL2 min read 50.8K   3.1K   41   17
A variant for collapsed groupbox class
Image 1

Introduction

First of all, sorry for my English, I'm from Ukraine. :)
The main idea was to make a collapsed groupbox. I found a large number of C# groupboxes I needed, but none in C++. And I had no time to create it from the beginning, so I used the class described here by JackCa. After fixing some bugs and writing several functions, I got a nice variant of collapsed groupbox.

How To Use It

You have to include a class header in your dialog h file:

C++
#include "CollapseGroupBox.h"

Then change the base class of your groupbox variables from CStatic or CButton to CollapseGroupBox.
For example:

C++
// before
CStatic m_st1;
CStatic m_st2;
CStatic m_st3;
CStatic m_st4;

change to:

C++
//after
CollapseGroupBox m_st1;
CollapseGroupBox m_st2;
CollapseGroupBox m_st3;
CollapseGroupBox m_st4;

If you don't have groupbox's variables, use class wizard to create them. Select "Control" category for them.

Using the Code

First of all, if your groupbox has a caption string and you like caption's right alignment, and your dialog isn't scalable, you have to do nothing at all to get good results. Nonetheless, I'll give you a brief description of how to use this class.
Let's talk about caption.
Caption variants are SS_LEFT, SS_CENTER, SS_RIGHT:

C++
BOOL CGBdemoDlg::OnInitDialog()
{
...
// default caption alignment is RIGHT. To change it follow code above
	m_st2.SetAlignment(SS_LEFT); // left caption alignment
	m_st4.SetAlignment(SS_CENTER); // center caption alignment
...
}	

My dialog has 4 groupboxes. And groupbox 1 and 3 will have right caption alignment.

You also have the possibility to change box visualization as you want. These functions allow to modify colors:

C++
SetBorderColor(COLORREF clrBorder);
SetCatptionTextColor(COLORREF clrText);
SetBackgroundColor(COLORREF clrBKTilte);

And these - to modify caption string and its visualization:

C++
SetText(LPCTSTR lpszTitle);
SetFontBold(BOOL bBold);
SetFontName(const CString& strFont, BYTE byCharSet = ANSI_CHARSET);
SetFontUnderline(BOOL bSet);
SetFontItalic(BOOL bSet);
SetFontSize(int nSize);
SetFont(LOGFONT lf);
SetAlignment(DWORD dwType);

Also if your dialog BGColor isn't COLOR_BTNFACE, use function setBGColor(COLORREF bgColor); for nice background visualization.

Now, let's talk about collapsing.

C++
std::vector<cwnd* /> intoElements; 	// vector of groupbox's components
bool m_frameMinimized; 	// Header-Only Style flag
BOOL IsInGroupBox(CWnd* pCtrl) const;
void GetGroupBoxElements();
void ShowElements(bool bShow);

As you see, we have a vector of elements located inside in groupbox. Function IsInGroupBox tells us about location of one element, and function GetGroupBoxElements check the location of everything in the dialog and fills our vector. But if you want, you may fill it by your own hands. :)

C++
intoElements.push_back(GetDlgItem(ELEMENT_ID));

And now the most interesting thing. In my dialog, box4 is in box3. And, without this code, collapsing works incorrectly:

C++
BOOL CGBdemoDlg::OnCommand(WPARAM wParam, LPARAM lParam)
{
	if (wParam == UM_UPDATEFORM)
	{// groupbox changed his state (Header-Only Style / Full State)
		if (lParam == (LPARAM)m_st3.m_hWnd)
		{
			if (m_st3.m_frameMinimized == false)
				m_st4.SetFrameExpand(m_st4.m_frameMinimized);
		}
	}
	if (wParam == UM_MOUSELEAVE)
	{// mouse leaves groupbox
	}
	if (wParam == UM_MOUSEENTRY)
	{// mouse comes to groupbox
	}

	return CDialog::OnCommand(wParam, lParam);
}

Our groupbox sends three variants of messages:

  • mouse leaves groupbox
  • mouse comes to groupbox
  • groupbox changed its state

So, we can control everything we need. For example, in my application (not in this demo) I use UM_UPDATEFORM to size dialog vertically for hiding free space.

A few words about dynamic creation... try this:

C++
m_boxMain.Create(_T("Caption"),WS_CHILD | WS_VISIBLE | 
	BS_GROUPBOX,CRect(xxx,xxx,xxx,xxx),this,ELEMENT_ID);

About one of the most popular questions "I can't see any controls in groupbox".
The simplest answer is Open dialog in editor, select groupbox, Ctrl+C, Del, Ctrl+V and everything will be OK. :)
Or you can add private function for changing Z-order or elements in vector intoElements and put it at the end of GetGroupBoxElements.

History

  • 8th October, 2009: Initial version

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer
Ukraine Ukraine
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionChange header? Pin
Andornot17-Apr-19 20:56
Andornot17-Apr-19 20:56 
AnswerRe: Change header? Pin
Andornot19-Apr-19 12:08
Andornot19-Apr-19 12:08 
QuestionHeader disappears on MoveWindow? Pin
dstrombe24-Jul-15 5:31
dstrombe24-Jul-15 5:31 
AnswerRe: Header disappears on MoveWindow? Pin
Nick Gorlov26-Jul-15 20:56
Nick Gorlov26-Jul-15 20:56 
GeneralRe: Header disappears on MoveWindow? Pin
dstrombe27-Jul-15 3:17
dstrombe27-Jul-15 3:17 
QuestionOrder of controls Pin
Octopod20-Jan-12 3:21
Octopod20-Jan-12 3:21 
GeneralMy vote of 1 Pin
Octopod19-Jan-12 23:02
Octopod19-Jan-12 23:02 
GeneralCrash:because not getting the control handle Pin
samal.subhashree1-Nov-09 20:34
samal.subhashree1-Nov-09 20:34 
GeneralRe: Crash:because not getting the control handle Pin
Nick Gorlov2-Nov-09 4:09
Nick Gorlov2-Nov-09 4:09 
GeneralFantastic job Pin
samal.subhashree31-Oct-09 1:32
samal.subhashree31-Oct-09 1:32 
QuestionI like it, so what's the best way to use it? Pin
Grump12-Oct-09 23:25
Grump12-Oct-09 23:25 
AnswerRe: I like it, so what's the best way to use it? [modified] Pin
Nick Gorlov13-Oct-09 2:02
Nick Gorlov13-Oct-09 2:02 
GeneralI was intrigued - Group Boxes disappearing bug Pin
c-sharp9-Oct-09 4:42
c-sharp9-Oct-09 4:42 
I was intrigued enough to run the provided sample. I experimented with the collapse/expand functionality and while I liked what I saw, I sort of expected the nested group boxes to resize automatically [probably beyond the scope of this article].
I did however find a display bug.
If you start by clicking in the edit control within Box 1 and then proceed with pressing [TAB] to keyboard navigate, ALL of the group boxes will disappear immediately after the first [TAB] press. They reappear after the 5th press OR after moving the mouse to cause each group box to "visually" activate/highlight.

Nice Start [I have not reviewed the code or studied the article's content].
GeneralRe: I was intrigued - Group Boxes disappearing bug Pin
Nick Gorlov11-Oct-09 20:04
Nick Gorlov11-Oct-09 20:04 
GeneralRe: I was intrigued - Group Boxes disappearing bug Pin
c-sharp12-Oct-09 1:55
c-sharp12-Oct-09 1:55 
GeneralRe: I was intrigued - Group Boxes disappearing bug Pin
LazyDave12-Oct-09 11:15
professionalLazyDave12-Oct-09 11:15 
GeneralRe: I was intrigued - Group Boxes disappearing bug Pin
Nick Gorlov12-Oct-09 20:02
Nick Gorlov12-Oct-09 20:02 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.