Click here to Skip to main content
Licence CPOL
First Posted 9 Oct 2009
Views 11,943
Downloads 600
Bookmarked 33 times

Collapsed groupbox

By | 9 Oct 2009 | Article
A variant for collapsed groupbox class

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:

#include "CollapseGroupBox.h"

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

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

change to:

//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:

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:

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

And these - to modify caption string and its visualization:

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.

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. :)

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:

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:

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)

About the Author

Nick Gorlov

Software Developer

Ukraine Ukraine

Member



Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
QuestionOrder of controls PinmemberOctopod3:21 20 Jan '12  
GeneralMy vote of 1 PinmemberOctopod23:02 19 Jan '12  
GeneralCrash:because not getting the control handle Pinmembersamal.subhashree20:34 1 Nov '09  
GeneralRe: Crash:because not getting the control handle PinmemberNick Gorlov4:09 2 Nov '09  
GeneralFantastic job Pinmembersamal.subhashree1:32 31 Oct '09  
QuestionI like it, so what's the best way to use it? PinmemberGrump23:25 12 Oct '09  
AnswerRe: I like it, so what's the best way to use it? [modified] PinmemberNick Gorlov2:02 13 Oct '09  
GeneralI was intrigued - Group Boxes disappearing bug Pinmemberc-sharp4:42 9 Oct '09  
GeneralRe: I was intrigued - Group Boxes disappearing bug PinmemberNick Gorlov20:04 11 Oct '09  
GeneralRe: I was intrigued - Group Boxes disappearing bug Pinmemberc-sharp1:55 12 Oct '09  
GeneralRe: I was intrigued - Group Boxes disappearing bug PinmemberLazyDave11:15 12 Oct '09  
GeneralRe: I was intrigued - Group Boxes disappearing bug PinmemberNick Gorlov20:02 12 Oct '09  

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

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

Permalink | Advertise | Privacy | Mobile
Web01 | 2.5.120517.1 | Last Updated 9 Oct 2009
Article Copyright 2009 by Nick Gorlov
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid