Click here to Skip to main content
15,890,282 members
Articles / Desktop Programming / MFC

GuiToolkit MFC Extension

Rate me:
Please Sign up or sign in to vote.
4.53/5 (167 votes)
16 Aug 20044 min read 2.2M   38.6K   384   625
A set of MFC GUI classes which allow you to build applications with the new Microsoft interface style
In this article, you will learn about GuiToolkit which is a complete set of classes based on MFC. It allows you to build applications with nice and sophisticated interfaces such as Visual Studio .NET, Office 2003, etc.

Image 1

Introduction

GuiToolkit is a complete set of classes based on MFC, that allows you to build applications with nice and sophisticated interfaces such as Visual Studio .NET, Office 2003, etc. The primary target is to have a complete free library that can be used without restrictions and suitable to user or programmers needs. This class set includes file management, connection through ADO, up to complex user's interface classes.

Guitoolkit was developed based on Paul Dilascia’s classes (father of almost all of this kind of libraries), including features like a Menu System and a floating bar (Thanks Paul for let me “ruin” all its wonderful code, hope you understand that I did it with sincerely my best intention); about the NewMenu Class (written by Bruno Podetti). I used “Hook” system. As a principal fact, I have tried to focus on code simplicity, in the way that you could isolate a class to understand it. Don’t expect to find in this library complex classes embedded into other, or sophisticated programming techniques.

I’ve tried to respect and preserve original class names of different authors, so every class that doesn’t begin with “Gui”, wasn’t written by me. As you could see, I’m the author of the 9x% of this classes.

GuiToolkit Users Guide

The code is free to use, except code that is not written by me, anyways you cannot take total or partial control of this code. This library is distributed in the hope that it will be useful, but without any warranty, without even the implied warranty of merchantability or fitness for a particular purpose.

Take your time to understand the given examples, and how to use the classes. In any case, I appreciate that someone wants to document this library. This library has a few or a lot of troubles, I hope that you can understand and forgive these human failures, like: There’s no documentation available, and there’s not tech support and some bugs in Windows 98.

You can use this library as you want and to demonstrate good or bad programming techniques, for your commercial application, to play, for improve it and share with us changes and to make me feel that my job gave you a plus making free code, in other words you don’t have to ask anybody for permissions this code is FREE in the way you respect author’s rights that let me use their code; and if you want to give me some credits (your welcome!), or you could show me, tell me and give the personal satisfaction of watching your own GuiToolkit built apps! “I appreciate it a lot”.

You can criticize the code being respectful, insults can freely direct to me but exclude Paul Dilascia, Bruno Podetti and other authors that I mention in credits section; they’re not guilty about my creation.

New Features

  • OneNote ® Style MDI tabs
  • Office ® XP/2003 look
  • Auto hide dockable bars
  • Docking tab colors
  • Visual Studio .NET look
  • And all components that you already know!

If you want the latest changes, visit the library web page http://www.beyondata.com/.

Some Examples

Image 2

Office menu bar XP styles provided:

Image 3

You can dispose of almost all controls in a dialog box using the CGuiStaticStandar class and obtain an interface such as next image.

Image 4

View more http://www.beyondata.com/.

What Comes Next?

Many things should be improved in the close future, errors, more controls, a text editor, to improve some classes, windows docking, autohidden functions, etc.

Credit

  • Thanks to Paul Dilascia VC++ MFC Guru, to allow using his class set for the menu management, thanks a lot I learned a huge things of his code.
  • Thanks to Bruno Podetti for your splendid menu class.
  • Thanks to David Yuheng Zhao for your VisualStylesXP class.
  • Thanks to Mohammad Ahmad Khaleel for your Cgradient class.

History

  • 31st July, 2002 - Updated source code
  • 20th August, 2002 - Updated source code
  • 10th January, 2003 - Updated source code
  • 18th August, 2004 - Updated source code

License

This article has no explicit license attached to it, but may contain usage terms in the article text or the download files themselves. If in doubt, please contact the author via the discussion board below.

A list of licenses authors might use can be found here.


Written By
Colombia Colombia
My name is Francisco Campos, A developer as you.I have the title of Engineer of Systems of the Universidad Autonoma de Colombia.My real Job Information Security officer, experience in security assessment, applications, and other related subjects.

Francisco.camposg@outlook.com

Comments and Discussions

 
Questiontoolbar with 24 bits bitmap? Pin
sundee27-Jul-05 7:39
sundee27-Jul-05 7:39 
AnswerYES: toolbar with 24 bits bitmap Pin
sundee27-Jul-05 21:22
sundee27-Jul-05 21:22 
QuestionHow to use it together with a CFormView class Pin
humorstar12-Jul-05 7:17
humorstar12-Jul-05 7:17 
AnswerRe: How to use it together with a CFormView class Pin
sundee27-Jul-05 7:32
sundee27-Jul-05 7:32 
GeneralRe: How to use it together with a CFormView class Pin
anand_study27-Jul-05 9:32
anand_study27-Jul-05 9:32 
GeneralRe: How to use it together with a CFormView class Pin
anand_study27-Jul-05 9:33
anand_study27-Jul-05 9:33 
GeneralGuiControlBar hide crash Pin
jjnz5-Jul-05 10:45
jjnz5-Jul-05 10:45 
GeneralGuiTabWnd - ALN_TOP, some improvements, minor bugs fixing Pin
Anar@1-Jul-05 0:25
Anar@1-Jul-05 0:25 
Hello,

Recently I found this great library, many thanks to Francisco Campos for it and also thanks for good examples.

I came across one problem. In my application I would like to use CGuiTabWnd class for multiple views and align tabs at the top of the window. Aligning tabs at the bottom was perfect but at the top... After looking to the source I found that aligning at the top was intended. So I tried to fix it. You can found the full listing of the source code below.

Also I've added a small feature, when user selects some tab the text in the caption of the tab becomes bold (like tabs in VS .NET). A bold caption is enabled by default, but you can disable it, just add the next line in any place of your code:

m_MyTabWindow.SetBoldText( FALSE );

To align tabs at the top of the window add this line:

m_MyTabWindow.SetALingTabs( CGuiTabWnd::ALN_TOP );

Changes:
Add the following to the GuiTabWnd.h

public:<br />
void	SetBoldText(BOOL bBold=TRUE);<br />
<br />
protected:<br />
BOOL			m_bBold;



And here is a full GuiTabWnd.cpp:
<br />
#include "stdafx.h"<br />
<br />
#include "GuiTabWnd.h"<br />
#include "GuiBasetab.h"<br />
#include "resource.h"<br />
<br />
<br />
#ifdef _DEBUG<br />
#define new DEBUG_NEW<br />
#undef THIS_FILE<br />
static char THIS_FILE[] = __FILE__;<br />
#endif<br />
<br />
/////////////////////////////////////////////////////////////////////////////<br />
// CGuiTabWnd<br />
<br />
#define  SPACE_TAB		4<br />
#define  DEFAULT_FLAT	18<br />
<br />
CGuiTabWnd::CGuiTabWnd()<br />
{<br />
	m_rectCliente.SetRectEmpty();<br />
	m_rectTab.SetRectEmpty();<br />
	m_ActualVar=0;<br />
	m_Numtabs=0;<br />
	m_iSelectTab=0;<br />
	m_sizeImag=CSize(15,15);<br />
	m_pArray.RemoveAll();<br />
	m_iMinValRec=0;  //minimo valor requerido para mostrar toda las carpetas<br />
	m_cfont.CreateFont(-11,0,0,0,400,0,0,0,RUSSIAN_CHARSET ,1,2,1,34,"MS Sans Serif");<br />
	m_cfontBold.CreateFont(-11,2,0,0,FW_BOLD,0,0,0,RUSSIAN_CHARSET,1,2,1,34,"MS Sans Serif");<br />
	m_style=S3D;<br />
	m_ActualTitle=TRUE;<br />
	m_alnTab=ALN_BOTTOM;<br />
	m_TypeTab=TYPE_NORMAL;<br />
	m_StyleDisplay=GUISTYLE_XP;<br />
	m_bBold = TRUE;<br />
}<br />
<br />
CGuiTabWnd::~CGuiTabWnd()<br />
{<br />
	m_pArray.RemoveAll();<br />
}<br />
<br />
<br />
BEGIN_MESSAGE_MAP(CGuiTabWnd, CWnd)<br />
	//{{AFX_MSG_MAP(CGuiTabWnd)<br />
	ON_WM_ERASEBKGND()<br />
	ON_WM_PAINT()<br />
	ON_WM_CREATE()<br />
	ON_WM_SIZE()<br />
	ON_WM_LBUTTONDOWN()<br />
	ON_WM_SYSCOLORCHANGE()<br />
	ON_WM_RBUTTONDOWN()<br />
	//}}AFX_MSG_MAP<br />
	ON_WM_DESTROY()<br />
END_MESSAGE_MAP()<br />
<br />
/////////////////////////////////////////////////////////////////////////////<br />
// CGuiTabWnd message handlers<br />
<br />
BOOL CGuiTabWnd::PreTranslateMessage(MSG* pMsg) <br />
{<br />
	// TODO: Add your specialized code here and/or call the base class<br />
	if (pMsg->message == WM_MOUSEMOVE)<br />
		CToolTip.RelayEvent(pMsg);<br />
<br />
	return CWnd::PreTranslateMessage(pMsg);<br />
}<br />
<br />
//****************************************************************************<br />
void CGuiTabWnd::OnSysColorChange( )<br />
{<br />
	CWnd::OnSysColorChange( );<br />
	<br />
}<br />
<br />
void CGuiTabWnd::SetTypeTab(TypeTab Type)<br />
{<br />
	m_TypeTab=Type;<br />
}<br />
//****************************************************************************<br />
BOOL CGuiTabWnd::OnEraseBkgnd(CDC* pDC) <br />
{<br />
	// TODO: Add your message handler code here and/or call default<br />
	if (m_Numtabs == 0)<br />
	{<br />
		CBrush cbr;<br />
		cbr.CreateSysColorBrush(GuiDrawLayer::GetRGBColorFace(m_StyleDisplay));<br />
		CRect m_rect;<br />
		GetClientRect(m_rect);<br />
		pDC->FillRect(m_rect,&cbr);<br />
		cbr.DeleteObject();<br />
		<br />
	}<br />
	return TRUE;<br />
}<br />
<br />
void CGuiTabWnd::SetActualTitle(BOOL bActual)<br />
{<br />
	m_ActualTitle=bActual;<br />
}<br />
<br />
void CGuiTabWnd::SetALingTabs(AlingTab alnTab)<br />
{<br />
	m_alnTab=alnTab;<br />
	Invalidate();<br />
	UpdateWindow();<br />
}<br />
<br />
void CGuiTabWnd::OnPaint() <br />
{<br />
<br />
	CPaintDC dc(this); // device context for painting<br />
	if (m_Numtabs <=0) return;<br />
	CBrush cbr;<br />
	CRect m_rectDraw;<br />
	CGuiTab* ct=(CGuiTab*) m_pArray[m_iSelectTab];<br />
<br />
//	if (m_alnTab!=ALN_TOP)<br />
		cbr.CreateSolidBrush((GuiDrawLayer::m_Style== GUISTYLE_XP)?GuiDrawLayer::GetRGBColorTabs(): ct->m_clrHtab);<br />
//	else<br />
//		cbr.CreateSolidBrush((GuiDrawLayer::m_Style== GUISTYLE_XP)?GuiDrawLayer::GetRGBColorTabs(): ct->m_clrHtab);<br />
//		cbr.CreateSolidBrush(GuiDrawLayer::m_Style == GUISTYLE_XP?GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style):ct->m_clrHtab);<br />
	GetClientRect(m_rectCliente);<br />
	m_rectTab=m_rectCliente;<br />
	m_rectDraw=m_rectCliente;<br />
	if (m_alnTab==ALN_BOTTOM)<br />
	{<br />
		m_rectDraw.bottom=m_rectCliente.bottom-(m_sizeImag.cy+SPACE_TAB+2);	<br />
	}<br />
	else<br />
	{<br />
		m_rectDraw.top=m_rectCliente.top+(m_sizeImag.cy+SPACE_TAB+2);<br />
	}<br />
	<br />
/*	if (m_style != S3D) //si son carpetas estilo excel o tabbed como devstudio 7<br />
	{<br />
		if (m_alnTab==ALN_BOTTOM)<br />
		{<br />
			m_rectCliente.bottom=m_rectCliente.bottom-(DEFAULT_FLAT);<br />
			m_rectTab.top=m_rectCliente.bottom+2;<br />
		}<br />
		else<br />
		{<br />
			m_rectTab.bottom=m_rectCliente.top+(DEFAULT_FLAT)+3;<br />
		}<br />
	}<br />
*/<br />
//	if (m_alnTab!=ALN_TOP)<br />
//	{<br />
		dc.FillRect(m_rectTab,&cbr);<br />
		m_rectDraw.left+=1;<br />
		dc.Draw3dRect(m_rectDraw,GuiDrawLayer::GetRGBColorShadow(GuiDrawLayer::m_Style),GuiDrawLayer::GetRGBColorShadow(GuiDrawLayer::m_Style));<br />
		if (GuiDrawLayer::m_Style!= GUISTYLE_XP)<br />
		{<br />
			//eliminar la linea inferior<br />
			m_rectDraw.top=m_rectDraw.bottom-1;<br />
			m_rectDraw.left+=1;<br />
			m_rectDraw.right-=1;<br />
			dc.Draw3dRect(m_rectDraw,ct->m_clrHtab,ct->m_clrHtab);<br />
<br />
		}<br />
		m_rectDraw.left-=1;<br />
/*	}<br />
	else<br />
	{<br />
		CRect rc=m_rectDraw;<br />
		for (int i=0; i< 2; i++)<br />
		{<br />
			dc.Draw3dRect(rc,GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style),GuiDrawLayer::GetRGBColorFace(GuiDrawLayer::m_Style));<br />
			rc.DeflateRect(1,1);<br />
		}<br />
	<br />
		rc.InflateRect(3,3);<br />
		dc.Draw3dRect(m_rectDraw,GuiDrawLayer::GetRGBColorShadow(GuiDrawLayer::m_Style),GuiDrawLayer::GetRGBColorShadow(GuiDrawLayer::m_Style));<br />
		rc=m_rectDraw;<br />
		rc.bottom=rc.top+3;<br />
		dc.FillRect(rc,&cbr);<br />
	}<br />
*/	<br />
	cbr.DeleteObject ();<br />
	Drawtabs(&dc);<br />
}<br />
<br />
<br />
<br />
BOOL CGuiTabWnd::Create(DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID) <br />
{<br />
	// TODO: Add your specialized code here and/or call the base class<br />
	pParent= pParentWnd;<br />
	return CWnd::Create(NULL, _T(""), dwStyle |WS_CLIPSIBLINGS|WS_CLIPCHILDREN, rect, pParentWnd, nID);<br />
}<br />
<br />
int CGuiTabWnd::OnCreate(LPCREATESTRUCT lpCreateStruct) <br />
{<br />
	if (CWnd::OnCreate(lpCreateStruct) == -1)<br />
		return -1;<br />
	CToolTip.Create(this,TTS_ALWAYSTIP);<br />
	CToolTip.Activate(TRUE);<br />
	CToolTip.BringWindowToTop();<br />
	// TODO: Add your specialized creation code here<br />
	<br />
	return 0;<br />
}<br />
<br />
<br />
void CGuiTabWnd::RecalLayout()<br />
{<br />
	GetClientRect(m_rectCliente);<br />
	m_rectCliente.DeflateRect(1,1);<br />
<br />
	if (m_style == S3D)<br />
	{<br />
//		m_rectCliente.bottom=m_rectCliente.bottom-(m_sizeImag.cy+SPACE_TAB+1);<br />
		if (m_alnTab==ALN_BOTTOM)<br />
			m_rectCliente.bottom=m_rectCliente.bottom-(m_sizeImag.cy+SPACE_TAB+1);<br />
		else<br />
		{<br />
//			m_rectCliente.top+=DEFAULT_FLAT;<br />
			m_rectCliente.top=m_rectCliente.top+(m_sizeImag.cy+SPACE_TAB+2);<br />
			m_rectCliente.bottom=m_rectCliente.bottom-(DEFAULT_FLAT+4);//(DEFAULT_FLAT+4);<br />
		}<br />
<br />
	}<br />
	else<br />
	{<br />
		if (m_alnTab==ALN_BOTTOM)<br />
//			m_rectCliente.bottom=m_rectCliente.bottom-(DEFAULT_FLAT);<br />
			m_rectCliente.bottom=m_rectCliente.bottom-(m_sizeImag.cy+SPACE_TAB+1);<br />
		else<br />
		{<br />
			m_rectCliente.top+=DEFAULT_FLAT;<br />
			m_rectCliente.bottom=m_rectCliente.bottom-(DEFAULT_FLAT+4);//(DEFAULT_FLAT+4);<br />
//			m_rectCliente.bottom=m_rectCliente.bottom-(DEFAULT_FLAT+4);<br />
		}<br />
	}<br />
<br />
	for (int iCont=0; iCont< m_Numtabs;iCont++)<br />
	{<br />
		CGuiTab* ct=(CGuiTab*) m_pArray[iCont];<br />
		CWnd* m_tempWin= ct->pParent;<br />
		ASSERT_VALID(m_tempWin);<br />
		if (m_style == S3D)<br />
		{<br />
			   m_tempWin->SetWindowPos(NULL,m_rectCliente.left+(SPACE_TAB-2),<br />
			   m_rectCliente.top+(SPACE_TAB/2),m_rectCliente.right-(SPACE_TAB+1),<br />
			   m_rectCliente.bottom-(SPACE_TAB+(m_alnTab==ALN_BOTTOM?2:0)),SWP_NOACTIVATE|SWP_NOZORDER);<br />
//			   m_rectCliente.bottom-(SPACE_TAB+2),SWP_NOACTIVATE|SWP_NOZORDER);<br />
		}<br />
		else<br />
		{<br />
			if (m_alnTab==ALN_BOTTOM)<br />
			{<br />
//			   m_tempWin->SetWindowPos(NULL,m_rectCliente.left+(SPACE_TAB-3),<br />
//			   m_rectCliente.top+1,m_rectCliente.right-2,<br />
//			   m_rectCliente.bottom+1,SWP_NOACTIVATE|SWP_NOZORDER);<br />
			   m_tempWin->SetWindowPos(NULL,m_rectCliente.left+(SPACE_TAB-2),<br />
			   m_rectCliente.top+(SPACE_TAB/2),m_rectCliente.right-(SPACE_TAB+1),<br />
			   m_rectCliente.bottom-(SPACE_TAB+2),SWP_NOACTIVATE|SWP_NOZORDER);<br />
			}<br />
			else<br />
			{ <br />
				if (m_TypeTab == TYPE_NORMAL)<br />
				{<br />
//				  m_tempWin->SetWindowPos(NULL,m_rectCliente.left+(SPACE_TAB-3),<br />
//				  m_rectCliente.top+3,m_rectCliente.right-2,<br />
//				  m_rectCliente.bottom,SWP_NOACTIVATE|SWP_NOZORDER);<br />
				   m_tempWin->SetWindowPos(NULL,m_rectCliente.left+(SPACE_TAB-2),<br />
				   m_rectCliente.top+(SPACE_TAB+2),m_rectCliente.right-(SPACE_TAB+1),<br />
				   m_rectCliente.bottom-SPACE_TAB,SWP_NOACTIVATE|SWP_NOZORDER);<br />
				}<br />
			}<br />
		}<br />
	}<br />
	AjustTabs();<br />
	Invalidate();<br />
	UpdateWindow();<br />
}<br />
<br />
<br />
void CGuiTabWnd::AjustTabs()<br />
{<br />
	int m_iSizeAct=0;<br />
	m_iMinValRec=4;<br />
	CClientDC dc(this);<br />
	GetClientRect(m_rectCliente);<br />
	if (m_alnTab==ALN_BOTTOM)<br />
		m_rectCliente.bottom=m_rectCliente.bottom-(m_sizeImag.cy+SPACE_TAB+1);<br />
	else<br />
		m_rectCliente.bottom=m_rectCliente.top+(m_sizeImag.cy+SPACE_TAB+1);<br />
<br />
	CFont* m_fontOld;<br />
//	CFont* m_fontOld=dc.SelectObject(&m_cfont);<br />
	for (int iCont=0; iCont< m_Numtabs;iCont++)<br />
	{<br />
		CGuiTab* ct=(CGuiTab*) m_pArray[iCont];<br />
<br />
		if (iCont != m_iSelectTab || m_bBold == FALSE )<br />
			m_fontOld=dc.SelectObject(&m_cfont);<br />
		else<br />
			m_fontOld=dc.SelectObject(&m_cfontBold);<br />
<br />
		CRect m_Arect;<br />
		CSize m_sChar=dc.GetTextExtent(ct->lpMsg);<br />
		m_Arect.left=m_iMinValRec+1;<br />
//		m_iMinValRec+=m_alnTab!=ALN_TOP?m_sizeImag.cx+2+m_sChar.cx+14:m_sChar.cx+14;<br />
		m_iMinValRec += m_sizeImag.cx+2+m_sChar.cx+14;<br />
		if(m_alnTab==ALN_BOTTOM)<br />
		{<br />
			m_Arect.top=m_rectCliente.bottom;<br />
			m_Arect.right=m_iMinValRec;<br />
			m_Arect.bottom=m_rectCliente.bottom+4+m_sizeImag.cy;<br />
		}<br />
		else<br />
		{<br />
//			m_Arect.top=m_rectCliente.top;<br />
			m_Arect.top=m_rectCliente.top+3;<br />
//			m_Arect.right=m_iMinValRec+ (iCont ==m_iSelectTab?10:0);<br />
			m_Arect.right=m_iMinValRec;<br />
//			m_Arect.bottom=m_rectCliente.top+4+m_sizeImag.cy;<br />
			m_Arect.bottom=m_rectCliente.top+6+m_sizeImag.cy;<br />
		}<br />
		ct->rect= m_Arect;<br />
		dc.SelectObject(m_fontOld);<br />
	}<br />
//	dc.SelectObject(m_fontOld);<br />
	//si el espacio requerido es mayor que el disponible<br />
	//se debe proporcionar cada tab solo si es 3d<br />
//	if (m_style== S3D)<br />
//	{<br />
		int m_NewResize=4;<br />
		if (m_iMinValRec > m_rectCliente.Width()-4)<br />
		{<br />
			m_iSizeAct=(m_rectCliente.Width()-12)/m_Numtabs;<br />
			for (int iCont=0; iCont< m_Numtabs;iCont++)<br />
			{<br />
				CGuiTab* ct=(CGuiTab*) m_pArray[iCont];<br />
				CRect m_Arect;<br />
				m_Arect.left=m_NewResize;<br />
				if(m_alnTab==ALN_BOTTOM)<br />
				{<br />
					m_Arect.right=m_NewResize+m_iSizeAct;<br />
					m_Arect.top=m_rectCliente.bottom;<br />
					m_Arect.bottom=m_rectCliente.bottom+4+m_sizeImag.cy;<br />
				}<br />
				else<br />
				{<br />
					m_Arect.right=m_NewResize+m_iSizeAct;<br />
					m_Arect.top=m_rectCliente.top + 3;<br />
					m_Arect.bottom=m_rectCliente.top+6+m_sizeImag.cy;<br />
				}<br />
				m_NewResize+=m_iSizeAct+1;<br />
				ct->rect= m_Arect;<br />
			}	<br />
		}<br />
//	}<br />
<br />
}<br />
<br />
void CGuiTabWnd::Drawtabs(CDC* dc)<br />
{<br />
	CPen light(PS_SOLID,1,GetSysColor(COLOR_BTNHIGHLIGHT));<br />
	CPen Dark(PS_SOLID,1,GuiDrawLayer::GetRGBColorShadow(m_StyleDisplay));<br />
	CPen Black(PS_SOLID,1,GetSysColor(BLACK_PEN));	<br />
	CPen pPress(PS_SOLID,1,GuiDrawLayer::GetRGBCaptionXP());<br />
	CRect rectText;<br />
	CFont* m_fontOld;<br />
//	CFont* m_fontOld=dc->SelectObject(&m_cfont);<br />
	CPen* oldPen= dc->SelectObject(&light);<br />
	CString szStrPoints=_T("...");<br />
	CRect rcClient;<br />
	GetClientRect(rcClient);<br />
	m_rectTab = rcClient;<br />
	if(m_StyleDisplay== GUISTYLE_2003)<br />
	{<br />
		CGuiTab* ct=(CGuiTab*) m_pArray[m_iSelectTab];<br />
<br />
		CGradient M( CSize( m_rectTab.Width(),ct->rect.Height()+(m_alnTab==ALN_BOTTOM?1:2) ) );	<br />
		M.PrepareReverseVertTab(dc,m_StyleDisplay);<br />
		if( m_alnTab==ALN_BOTTOM )<br />
			M.Draw(dc,0,m_rectTab.bottom-ct->rect.Height(),0,0,<br />
					m_rectTab.Width(),ct->rect.Height(),SRCCOPY);<br />
		else<br />
			M.Draw(dc,0,0,0,0,<br />
					m_rectTab.Width(),m_rectTab.Height()+2,SRCCOPY);<br />
		dc->LineTo(m_rectTab.left, m_rectTab.bottom+3);<br />
		dc->MoveTo(m_rectTab.right, m_rectTab.bottom+3);<br />
	}<br />
	for (int iCont=0; iCont< m_Numtabs;iCont++)<br />
	{<br />
		CGuiTab* ct=(CGuiTab*) m_pArray[iCont];<br />
	<br />
		if ( iCont !=m_iSelectTab || m_bBold == FALSE )<br />
			m_fontOld=dc->SelectObject(&m_cfont);<br />
		else<br />
			m_fontOld=dc->SelectObject(&m_cfontBold);<br />
		<br />
		//si es la carpeta seleccionada, se debe <br />
		//eliminar las lineas oscuras de encima<br />
		if(m_StyleDisplay== GUISTYLE_2003)<br />
		{<br />
			CRect  m_rectTabAux=ct->rect;<br />
			CGradient M(CSize(m_rectTabAux.Width(),m_rectTabAux.Height()));	<br />
			if( m_alnTab==ALN_BOTTOM )<br />
			{<br />
				M.PrepareReverseColorTab(dc,GUISTYLE_2003,ct->m_clrHtab,ct->m_clrLTab);	//M.PrepareTabs(dc,ct->m_clrTab); //ojo este es para pintar a color<br />
				M.Draw(dc,m_rectTabAux.left+1,m_rectTabAux.top,0,0,m_rectTabAux.Width()-1,m_rectTabAux.Height()-1,SRCCOPY);<br />
			}<br />
			else<br />
			{<br />
				M.PrepareReverseColorTab( dc, GUISTYLE_2003, ct->m_clrLTab, ct->m_clrHtab );	//M.PrepareTabs(dc,ct->m_clrTab); //ojo este es para pintar a color<br />
				M.Draw(dc,m_rectTabAux.left+1,m_rectTabAux.top,0,0,m_rectTabAux.Width()-1,m_rectTabAux.Height(),SRCCOPY);<br />
			}<br />
			CPen* pOldPen=dc->SelectObject(&Dark);<br />
			if(iCont ==0)<br />
			{<br />
				dc->MoveTo(m_rectTabAux.left, m_rectTabAux.top);<br />
				if( m_alnTab==ALN_BOTTOM )<br />
				{<br />
					dc->LineTo(m_rectTabAux.left, m_rectTabAux.bottom-2);<br />
		<br />
					dc->SetPixel(rcClient.left+1, m_rectTabAux.top-2, GuiDrawLayer::GetRGBColorShadow(m_StyleDisplay) );<br />
				}<br />
				else<br />
					dc->LineTo(m_rectTabAux.left, m_rectTabAux.bottom);<br />
			}<br />
			if( m_alnTab==ALN_BOTTOM )<br />
			{<br />
				dc->MoveTo(m_rectTabAux.left, m_rectTabAux.bottom-2);<br />
				dc->LineTo(m_rectTabAux.left+1, m_rectTabAux.bottom-1);<br />
			<br />
				dc->MoveTo(m_rectTabAux.left+1, m_rectTabAux.bottom-1);<br />
				dc->LineTo(m_rectTabAux.right-2,m_rectTabAux.bottom-1 );<br />
			<br />
				dc->MoveTo(m_rectTabAux.right-2,m_rectTabAux.bottom-1  );<br />
				dc->LineTo(m_rectTabAux.right, m_rectTabAux.bottom-3);<br />
<br />
				dc->MoveTo(m_rectTabAux.right, m_rectTabAux.bottom-3);<br />
				dc->LineTo(m_rectTabAux.right, m_rectTabAux.top-1);<br />
			}<br />
			else<br />
			{<br />
				dc->MoveTo( m_rectTabAux.left+1, m_rectTabAux.top-1 );	// top line<br />
				dc->LineTo( m_rectTabAux.right-1,m_rectTabAux.top-1 );<br />
<br />
				dc->MoveTo(m_rectTabAux.right, m_rectTabAux.bottom-1 );	// right line<br />
				dc->LineTo(m_rectTabAux.right, m_rectTabAux.top );<br />
<br />
				dc->MoveTo(m_rectTabAux.right-2,m_rectTabAux.top-1  );	// right angle<br />
				dc->LineTo(m_rectTabAux.right+1, m_rectTabAux.top+2);<br />
<br />
				if ( iCont )<br />
				{<br />
					dc->MoveTo(m_rectTabAux.left, m_rectTabAux.top );	// left angle<br />
					dc->LineTo(m_rectTabAux.left+1, m_rectTabAux.top-1 );<br />
				}<br />
			}<br />
			if (iCont == m_iSelectTab)<br />
			{<br />
				if( m_alnTab==ALN_BOTTOM )<br />
				{<br />
					dc->MoveTo(rcClient.left+1, m_rectTabAux.top-1);<br />
					dc->LineTo(m_rectTabAux.left, m_rectTabAux.top-1);<br />
					dc->MoveTo(m_rectTabAux.right, m_rectTabAux.top-1);<br />
					dc->LineTo(rcClient.right, m_rectTabAux.top-1);<br />
				}<br />
				else<br />
				{<br />
					CPen pBott(PS_SOLID,1,ct->m_clrHtab);<br />
					CPen* pOldPen2 = dc->SelectObject( &pBott );<br />
					dc->MoveTo( m_rectTabAux.left+(iCont!=0?0:1), m_rectTabAux.bottom );<br />
					dc->LineTo( m_rectTabAux.right, m_rectTabAux.bottom );<br />
					dc->SelectObject( pOldPen2 );<br />
				}<br />
			}<br />
			dc->SelectObject(pOldPen);<br />
		}<br />
<br />
		if(m_StyleDisplay== GUISTYLE_XP)<br />
		{<br />
			if (iCont ==m_iSelectTab)<br />
			{<br />
				CBrush cbr;<br />
				CRect  m_rectTabAux=ct->rect;<br />
				m_rectTabAux.DeflateRect(1,1);<br />
				m_rectTabAux.top-=4;	<br />
				m_rectTabAux.bottom=m_rectTabAux.top+4;<br />
				cbr.CreateSysColorBrush(COLOR_BTNFACE);<br />
				<br />
				if( m_alnTab==ALN_TOP )<br />
				{<br />
					ct->rect.bottom += 2;<br />
					ct->rect.right -= 1;<br />
				}<br />
				dc->FillRect(ct->rect,&cbr);<br />
				dc->MoveTo(ct->rect.left,ct->rect.top-3);<br />
				dc->LineTo(ct->rect.left,ct->rect.bottom/*-1*/);<br />
				dc->FillRect(m_rectTabAux,&cbr);<br />
				if( m_alnTab==ALN_TOP )<br />
				{<br />
					ct->rect.bottom -= 2;<br />
					ct->rect.right += 1;<br />
				}<br />
<br />
				dc->SelectStockObject(BLACK_PEN);<br />
				if( m_alnTab==ALN_BOTTOM )<br />
				{<br />
					dc->MoveTo(ct->rect.left,ct->rect.bottom-1);<br />
					dc->LineTo(ct->rect.right,ct->rect.bottom-1);<br />
				}<br />
				else<br />
				{<br />
					CPen* pOldPen2 = dc->SelectObject( &light );<br />
					dc->MoveTo(ct->rect.left,ct->rect.top-3);<br />
					dc->LineTo(ct->rect.right,ct->rect.top-3);<br />
					dc->SelectObject( pOldPen2 );<br />
				}<br />
				<br />
				//linea derecha observe que se pinta dos veces para<br />
				//dar el efecto de redondeada en la puntas<br />
<br />
				dc->SelectStockObject(BLACK_PEN);<br />
				if( m_alnTab==ALN_BOTTOM )<br />
				{<br />
					dc->MoveTo(ct->rect.right-1,ct->rect.top-1);<br />
					dc->LineTo(ct->rect.right-1,ct->rect.bottom-1);<br />
				}<br />
				else<br />
				{<br />
					dc->MoveTo(ct->rect.right-1,ct->rect.top-2/*1*/);<br />
					dc->LineTo(ct->rect.right-1,ct->rect.bottom);<br />
				}<br />
				cbr.DeleteObject();<br />
<br />
			}<br />
			else<br />
			{<br />
				<br />
				if(m_StyleDisplay== GUISTYLE_XP)<br />
				{<br />
					if ((iCont+1) != m_iSelectTab)<br />
					{<br />
						CPen* pOldPen=dc->SelectObject(&Dark);<br />
						dc->MoveTo(ct->rect.right-1,ct->rect.top+2);<br />
						dc->LineTo(ct->rect.right-1,ct->rect.bottom-2);<br />
						dc->SelectObject(pOldPen);<br />
					}<br />
				}<br />
				<br />
			}				<br />
		}<br />
		//se dibuja el icono<br />
		int nMode = dc->SetBkMode(TRANSPARENT);<br />
		CSize m_sChar=dc->GetTextExtent(ct->lpMsg,strlen(ct->lpMsg));<br />
		COLORREF clrtext;<br />
		if (iCont !=m_iSelectTab)<br />
			clrtext=dc->SetTextColor(GuiDrawLayer::GetRGBColorGrayText());<br />
		<br />
		if (m_sizeImag.cx+m_sChar.cx < ct->rect.Width()-8)  <br />
		{<br />
			Image.Draw(dc,ct->uIcon,CPoint(ct->rect.left+3,ct->rect.top/*+2*/),ILD_TRANSPARENT);<br />
			rectText=ct->rect;<br />
			rectText.top -= 2;<br />
			rectText.left+=m_sizeImag.cx+8;<br />
			rectText.right-=2;<br />
			dc->DrawText(ct->lpMsg,rectText,DT_SINGLELINE|DT_LEFT|DT_VCENTER);<br />
			CToolTip.SetToolRect(this,iCont+1,CRect(0,0,0,0));<br />
		}<br />
		else<br />
		{<br />
			//verificamos si se puede poner algun texto o<br />
			//por lo memos el icono<br />
			if (m_sizeImag.cx < ct->rect.Width())<br />
			{<br />
				Image.Draw(dc,ct->uIcon,CPoint(ct->rect.left+3,ct->rect.top/*+2*/),ILD_TRANSPARENT);<br />
				rectText=ct->rect;<br />
				rectText.top -= 2;<br />
				rectText.left+=m_sizeImag.cx+8;<br />
				rectText.right-=5;<br />
				CString m_cadBreak=ct->lpMsg;<br />
				int c=0;<br />
				int cont=m_cadBreak.GetLength();<br />
				while(cont > 1 )<br />
				{<br />
					CString m_scadtemp=m_cadBreak+szStrPoints;<br />
					CSize coor=dc->GetTextExtent(m_scadtemp,m_scadtemp.GetLength());<br />
					if(coor.cx > rectText.Width())<br />
						m_cadBreak=m_cadBreak.Left(m_cadBreak.GetLength()-1);<br />
					else<br />
						break;<br />
					cont--;<br />
				}<br />
				m_cadBreak+=szStrPoints;<br />
				rectText.right+=3;<br />
			<br />
				dc->DrawText(m_cadBreak,rectText,DT_SINGLELINE|DT_LEFT|DT_VCENTER);<br />
				CToolTip.SetToolRect(this,iCont+1,&ct->rect);<br />
			}<br />
		}<br />
		if (iCont !=m_iSelectTab)<br />
				dc->SetTextColor(clrtext);<br />
		dc->SetBkMode(nMode);<br />
		dc->SelectObject(m_fontOld);<br />
	}	<br />
	dc->SelectObject(oldPen);<br />
//	dc->SelectObject(m_fontOld);<br />
}<br />
<br />
void CGuiTabWnd::SetImageList(UINT nBitmapID, int cx, int nGrow, COLORREF crMask)<br />
{<br />
	CBitmap cbmp;<br />
	BITMAP bmp;<br />
	Image.Create(nBitmapID,cx,nGrow,crMask);<br />
	cbmp.LoadBitmap(nBitmapID);<br />
	cbmp.GetBitmap(&bmp);<br />
	Image.Add(&cbmp,crMask);<br />
	m_sizeImag=CSize(cx,bmp.bmHeight);	<br />
}<br />
<br />
CWnd* CGuiTabWnd::GetActiveWnd () const<br />
{<br />
		return m_Numtabs == -1 ? NULL : <br />
		((CGuiTab*) m_pArray [m_Numtabs])->pParent;<br />
}<br />
<br />
BOOL CGuiTabWnd::FindItem(HWND hWnd)<br />
{<br />
	for (int iCont=0; iCont< m_Numtabs;iCont++)<br />
	{<br />
		CGuiTab* ct=(CGuiTab*) m_pArray[iCont];<br />
		if (ct->pParent->GetSafeHwnd() == hWnd)<br />
		    return TRUE;<br />
	}<br />
	return FALSE;<br />
<br />
}<br />
<br />
CWnd*  CGuiTabWnd::GetNumWnd(int m_numtab) const<br />
{<br />
        if (m_numtab > m_Numtabs)<br />
			return NULL;<br />
		else<br />
		{<br />
			if (m_pArray.GetSize() < 1) return NULL;<br />
			CWnd* pw=((CGuiTab*) m_pArray [m_numtab])->pParent;<br />
			if (HIWORD(pw)== NULL) return NULL;<br />
			else<br />
			  return ((CGuiTab*) m_pArray [m_numtab])->pParent;<br />
		}<br />
}<br />
<br />
void CGuiTabWnd::UpdateCaption(CWnd* pWnd,CString m_Title)<br />
{<br />
	for (int iCont=0; iCont< m_Numtabs;iCont++)<br />
	{<br />
		CGuiTab* ct=(CGuiTab*) m_pArray[iCont];<br />
		if (ct->pParent->GetSafeHwnd() == pWnd->GetSafeHwnd())<br />
		{<br />
			CString x=ct->lpMsg;<br />
			if(x!=m_Title)<br />
			{<br />
				ct->lpMsg=m_Title;<br />
				GetParentFrame()->SendMessage(WM_SIZE);<br />
				RecalLayout();<br />
				Invalidate();<br />
				UpdateWindow();<br />
			}<br />
			break;<br />
		}<br />
	}<br />
	<br />
}<br />
void CGuiTabWnd::ShowTitle(CString m_Caption)<br />
{<br />
	if (m_ActualTitle==TRUE)<br />
	{<br />
		CWnd* pParent=GetParent();<br />
		pParent->SetWindowText(m_Caption);<br />
		pParent->SendMessage(WM_COMMAND,WM_SHOWTITLE);<br />
	}<br />
}<br />
<br />
<br />
void CGuiTabWnd::Addtab(CWnd *pParent, CString lpMsg, UINT uIcon)<br />
{<br />
	ASSERT_VALID(pParent);<br />
	m_pArray.SetAtGrow(m_Numtabs,new CGuiTab(pParent,lpMsg,uIcon));<br />
	if (m_alnTab!=ALN_TOP || m_TypeTab == TYPE_NORMAL)<br />
	{<br />
		if (m_Numtabs==0)<br />
			pParent->ShowWindow(SW_SHOW);<br />
		else<br />
			pParent->ShowWindow(SW_HIDE);<br />
		m_iSelectTab=0;<br />
	}<br />
	else<br />
		m_iSelectTab=m_Numtabs;<br />
<br />
	m_Numtabs++;<br />
	//assign color<br />
	CGuiTab* ctn=(CGuiTab*) m_pArray[m_Numtabs-1]; 	<br />
	GuiDrawLayer::GetNextColor(m_Numtabs,ctn->m_clrLTab,ctn->m_clrHtab);<br />
	<br />
	if (m_alnTab==ALN_TOP && m_TypeTab != TYPE_NORMAL)<br />
	{<br />
		pParent->ShowWindow(SW_SHOWMAXIMIZED);<br />
	}<br />
	<br />
	if (m_style == S3D)<br />
		CToolTip.AddTool(this,lpMsg,CRect(0,0,0,0),m_Numtabs);<br />
	RecalLayout();<br />
}<br />
<br />
<br />
void CGuiTabWnd::DeleteTab(int m_numtab)<br />
{<br />
	if (m_numtab < m_Numtabs)<br />
	{<br />
		CGuiTab* ctn=(CGuiTab*) m_pArray[m_numtab]; 	<br />
		if (m_alnTab!=ALN_TOP)<br />
			ASSERT_VALID(ctn->pParent);<br />
		if (ctn)<br />
			delete ctn;<br />
		m_Numtabs--;<br />
		m_pArray.RemoveAt(m_numtab,1);<br />
		if (m_Numtabs >0)<br />
		{<br />
			if (m_iSelectTab == m_numtab)<br />
			{<br />
				m_iSelectTab=m_iSelectTab-1;<br />
				if (m_iSelectTab< 0) m_iSelectTab=0;<br />
				CGuiTab* ctn =(CGuiTab*) m_pArray[m_iSelectTab];<br />
				CWnd* pParentNew=ctn->pParent;<br />
				ASSERT_VALID(pParentNew);<br />
				pParentNew->ShowWindow(SW_SHOW);<br />
			}<br />
			else<br />
			{<br />
				if (m_iSelectTab > m_numtab)<br />
				{<br />
					m_iSelectTab--;<br />
				}<br />
			}<br />
			RecalLayout();<br />
		}<br />
	}<br />
}<br />
<br />
void CGuiTabWnd::OnSize(UINT nType, int cx, int cy) <br />
{<br />
	CWnd::OnSize(nType, cx, cy);<br />
	if (m_Numtabs > 0)<br />
		RecalLayout();<br />
}<br />
<br />
<br />
void CGuiTabWnd::SetCurtab(int m_numtab)<br />
{<br />
	if (m_numtab < m_Numtabs && m_numtab != m_iSelectTab )<br />
	{<br />
		CGuiTab* ctn=(CGuiTab*) m_pArray[m_numtab]; <br />
		CWnd* pParentNew= ctn->pParent;<br />
		CGuiTab* ct =(CGuiTab*) m_pArray[m_iSelectTab];<br />
		CWnd* pParentActual=ct->pParent;<br />
		ASSERT_VALID(pParentNew);<br />
		ASSERT_VALID(pParentActual);<br />
		if (m_alnTab==ALN_TOP && m_TypeTab != TYPE_NORMAL)	<br />
		{<br />
			pParentNew->BringWindowToTop();<br />
		}<br />
		else<br />
		{<br />
			pParentActual->ShowWindow(SW_HIDE);<br />
			pParentNew->ShowWindow(SW_SHOW);<br />
		}<br />
		<br />
		m_iSelectTab=m_numtab;<br />
//		if (m_alnTab==ALN_TOP)<br />
			AjustTabs();<br />
		Invalidate();<br />
		UpdateWindow();<br />
	}<br />
}<br />
<br />
int CGuiTabWnd::GetCurtab()<br />
{<br />
	return m_iSelectTab;<br />
}<br />
<br />
<br />
void CGuiTabWnd::OnLButtonDown(UINT nFlags, CPoint point) <br />
{<br />
	// TODO: Add your message handler code here and/or call default<br />
	CWnd::OnLButtonDown(nFlags, point);<br />
	for (int iCont=0; iCont< m_Numtabs;iCont++)<br />
	{<br />
		CGuiTab* ct=(CGuiTab*) m_pArray[iCont];<br />
		if (ct->rect.PtInRect(point) != 0)<br />
		{<br />
            SetCurtab(iCont);<br />
			ShowTitle(ct->lpMsg);<br />
			m_InTab=TRUE;<br />
			return;<br />
		}<br />
	}<br />
}<br />
<br />
void CGuiTabWnd::OnRButtonDown(UINT nFlags, CPoint point)<br />
{<br />
	// TODO: Add your message handler code here and/or call default<br />
	m_InTab=FALSE;<br />
	OnLButtonDown(nFlags,point); <br />
	<br />
	if (((CGuiTab*)m_pArray[m_iSelectTab])->nMenu > 0 && m_InTab==TRUE)<br />
	{<br />
		CMenu m_menu;<br />
		m_menu.LoadMenu(((CGuiTab*)m_pArray[m_iSelectTab])->nMenu);<br />
		CMenu* m_SubMenu = m_menu.GetSubMenu(0);<br />
		CRect rc=((CGuiTab*)m_pArray[m_iSelectTab])->rect;<br />
		ClientToScreen(&point);<br />
		m_SubMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL,<br />
				point.x, point.y, AfxGetMainWnd(), &rc);<br />
	}<br />
}<br />
<br />
//Thanks to Ernesto Garcia<br />
void CGuiTabWnd::SetStyle(Style estyle)<br />
{<br />
	m_style=estyle;<br />
}<br />
<br />
void CGuiTabWnd::OnDestroy()<br />
{<br />
	// Libera la memoria<br />
    for( int i=0; i<m_Numtabs; i++ )<br />
    {<br />
    CGuiTab *pTab = (CGuiTab*)m_pArray.GetAt(i);<br />
    if( pTab )<br />
        delete pTab;<br />
    }<br />
	CWnd::OnDestroy();<br />
<br />
	// TODO: Add your message handler code here<br />
}<br />
<br />
// daniel_h<br />
void CGuiTabWnd::SetTabsTitle(int iTabNr, CString sNewTitle)<br />
{<br />
	CGuiTab* ct=(CGuiTab*) m_pArray[iTabNr];<br />
	if (ct!=NULL)<br />
	{<br />
		ct->lpMsg=sNewTitle;<br />
		m_pArray[iTabNr]=ct;<br />
		AjustTabs();<br />
		Invalidate();<br />
	}<br />
}<br />
<br />
void  CGuiTabWnd::SetTabMenu(UINT nMENU,int nNumTab)<br />
{<br />
	if (m_Numtabs >0)<br />
			((CGuiTab*)m_pArray[(nNumTab==0?m_Numtabs-1:nNumTab)])->AddMenu(nMENU);<br />
}<br />
<br />
<br />
BOOL CGuiTabWnd::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)<br />
{<br />
	// TODO: Add your specialized code here and/or call the base class<br />
	CWnd::OnNotify(wParam,lParam,pResult);<br />
	CWnd* pParent= GetParent();<br />
	<br />
	if (pParent->GetSafeHwnd())<br />
		pParent->SendMessage(WM_NOTIFY, wParam, lParam);<br />
	<br />
	return TRUE;<br />
}<br />
<br />
void CGuiTabWnd::SetBoldText(BOOL bBold)<br />
{<br />
	m_bBold = bBold;<br />
	Invalidate();<br />
}

GeneralRe: GuiTabWnd - ALN_TOP, some improvements, minor bugs fixing Pin
lflybear19-Jul-10 1:07
lflybear19-Jul-10 1:07 
QuestionIs A bug or not? Pin
benjamin_zong13-Jun-05 23:11
benjamin_zong13-Jun-05 23:11 
QuestionWhat exactly to do when you change a Menu? Pin
tim6358-Jun-05 23:13
tim6358-Jun-05 23:13 
GeneralCGuiPanelAccess as a controlbar/dialogbar Pin
tim63530-May-05 2:47
tim63530-May-05 2:47 
QuestionToolbar Error??? Pin
gunias22-May-05 10:55
gunias22-May-05 10:55 
AnswerRe: Toolbar Error??? Pin
LJMiller15-Jun-05 16:46
LJMiller15-Jun-05 16:46 
GeneralRe: Toolbar Error??? Pin
gunias20-Jun-05 19:43
gunias20-Jun-05 19:43 
GeneralCGuiContainer question Pin
Andrew Novikov20-May-05 23:10
sussAndrew Novikov20-May-05 23:10 
Generallittle bug Pin
yuelinniao20-May-05 11:59
yuelinniao20-May-05 11:59 
GeneralA bug in CGuiMiniTool Pin
freedem15-May-05 5:17
freedem15-May-05 5:17 
GeneralCGuiPanelAccess & CGuiFolder repaint problem Pin
tim63525-Apr-05 21:53
tim63525-Apr-05 21:53 
GeneralRe: CGuiPanelAccess & CGuiFolder repaint problem Pin
tim63526-Apr-05 22:17
tim63526-Apr-05 22:17 
GeneralLinker errors Pin
sonawane ajay25-Apr-05 19:06
sonawane ajay25-Apr-05 19:06 
GeneralGreat job! Pin
Vinicius Pontes12-Apr-05 5:37
Vinicius Pontes12-Apr-05 5:37 
GeneralSDI tabbing Pin
Patrik Mueller6-Apr-05 0:21
Patrik Mueller6-Apr-05 0:21 
GeneralRe: SDI tabbing Pin
Patrik Mueller13-Apr-05 20:10
Patrik Mueller13-Apr-05 20:10 
Generalcreating menu with these styles without using a menu resource Pin
tim6354-Apr-05 21:59
tim6354-Apr-05 21:59 

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.