Click here to Skip to main content
15,894,017 members
Articles / Desktop Programming / MFC

CRulerRichEditCtrl - a complete RTF mini-editor

Rate me:
Please Sign up or sign in to vote.
4.92/5 (39 votes)
17 May 2005Public Domain7 min read 301.7K   18K   159  
A complete mini-editor with a formatting toolbar and a ruler with editable tab-positions.
/* ==========================================================================
	File :			RRECToolbar.cpp

	Class :			CRRECToolbar

	Author :		Johan Rosengren, Abstrakt Mekanik AB
					Iain Clarke

	Date :			2004-05-07

	Purpose :		This class encapsulates a toolbar that can be used with 
					"CRulerRichEditCtrl". The class is derived from "CToolBarCtrl", 
					and manages a formatting toolbar

	Description :	A "CToolBarCtrl"-derived class. Reads a toolbar resource 
					with the ID "TOOLBAR_CONTROL" and adds combo controls for 
					font name and -size, as well as a color picker at the 
					positions "FONT_NAME_POS", "FONT_SIZE_POS" and 
					"FONT_COLOR_POS" respectively.

	Usage :			Created by the rich edit mini-editor.

   ========================================================================*/

#include "stdafx.h"
#include "RRECToolbar.h"
#include "ids.h"

#include <tchar.h>

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

extern UINT urm_SETCURRENTFONTNAME;
extern UINT urm_SETCURRENTFONTSIZE;
extern UINT urm_SETCURRENTFONTCOLOR;

/////////////////////////////////////////////////////////////////////////////
// CRRECToolbar

CRRECToolbar::CRRECToolbar()
/* ============================================================
	Function :		CRRECToolbar::CRRECToolbar
	Description :	ctor
	Access :		Public
					
	Return :		void
	Parameters :	none

	Usage :			

   ============================================================*/
{
}

CRRECToolbar::~CRRECToolbar()
/* ============================================================
	Function :		CRRECToolbar::~CRRECToolbar
	Description :	dtor
	Access :		Public
					
	Return :		void
	Parameters :	none

	Usage :			

   ============================================================*/
{
}

BOOL CRRECToolbar::Create( CWnd* parent, CRect& rc )
/* ============================================================
	Function :		CRRECToolbar::Create
	Description :	Creates the toolbar control
	Access :		Public
					
	Return :		BOOL			-	"TRUE" if success
	Parameters :	CWnd* parent	-	Parent editor
					CRect& rc		-	Rectangle to place 
										toolbar in.

	Usage :			Called from the parent editor

   ============================================================*/
{

	BOOL result = FALSE;

	HINSTANCE hInstance = AfxFindResourceHandle( MAKEINTRESOURCE( TOOLBAR_CONTROL ), RT_TOOLBAR );
	if(!hInstance)
		return FALSE;

	HRSRC hRsrc = ::FindResource( hInstance, MAKEINTRESOURCE( TOOLBAR_CONTROL ), RT_TOOLBAR );
	if( !hRsrc )
		return FALSE;

	HGLOBAL hGlobal = LoadResource( hInstance, hRsrc );
	if (hGlobal == NULL)
		return FALSE;

	CToolBarData* pData = ( CToolBarData* ) LockResource( hGlobal );
	if (pData == NULL)
		return FALSE;

	ASSERT( pData->wVersion == 1 );

	TBBUTTON tb, tbSep;
	memset ( &tb, 0, sizeof( tb ) );
	memset ( &tbSep, 0, sizeof( tbSep ) );

	result = CToolBarCtrl::Create( WS_VISIBLE | WS_CHILD, rc, parent, TOOLBAR_CONTROL );

	if( result )
	{
		SetButtonStructSize( sizeof ( tb ) );

		CSize sz ( pData->wWidth, pData->wHeight );
		SetBitmapSize( sz );
		sz.cx += 4;
		sz.cy += 4;
		SetButtonSize( sz );

		// Loop through adding buttons.
		tb.fsState = TBSTATE_ENABLED;
		tb.fsStyle = TBSTYLE_BUTTON;
		tb.iString = -1;
		tb.iBitmap = 0;

		tbSep.iString = -1;
		tbSep.fsStyle = TBSTYLE_SEP;

		for( WORD w = 0; w < pData->wItemCount; w++ )
		{
			if ( pData->items()[ w ] == 0 )
				AddButtons( 1, &tbSep );
			else
			{
				tb.idCommand = pData->items()[ w ];
				AddButtons( 1, &tb );
				tb.iBitmap++;
			}
		}

		HBITMAP	hBitmap = (HBITMAP) ::LoadImage( hInstance, MAKEINTRESOURCE( TOOLBAR_CONTROL ), IMAGE_BITMAP, 0,0, LR_LOADMAP3DCOLORS );
		if( !hBitmap )
			return FALSE;

		BITMAP bm;
		memset( &bm, 0, sizeof ( bm ) );
		::GetObject( hBitmap, sizeof ( bm ), &bm );
		AddBitmap( bm.bmWidth / pData->wWidth, CBitmap::FromHandle ( hBitmap ) );

		UnlockResource( hGlobal );
		FreeResource( hGlobal );

		/////////////////////////////////////
		// Map in combo boxes
		//

		CRect rect;

		TBBUTTONINFO tbi;
		tbi.cbSize = sizeof( TBBUTTONINFO );
		tbi.cx = FONT_COMBO_WIDTH;
		tbi.dwMask = TBIF_SIZE | 0x80000000;  // By index

		SetButtonInfo( FONT_NAME_POS, &tbi );
		GetItemRect( FONT_NAME_POS, &rect );
		rect.bottom += COMBO_HEIGHT;

		// The font name combo
		if( m_font.Create( WS_CHILD | 
							WS_VSCROLL |
							WS_VISIBLE |
							CBS_AUTOHSCROLL | 
							CBS_DROPDOWN | 
							CBS_SORT | 
							CBS_HASSTRINGS, 
							rect, this, DROPDOWN_FONT ) )
		{

			m_font.SetFont( CFont::FromHandle( ( HFONT ) ::GetStockObject( ANSI_VAR_FONT ) ) );
			m_font.FillCombo();

			tbi.cx = COMBO_WIDTH;
			SetButtonInfo( FONT_SIZE_POS, &tbi );
			GetItemRect( FONT_SIZE_POS, &rect );
			rect.bottom += COMBO_HEIGHT;

			// The font size combo
			if( m_size.Create( WS_CHILD | 
								WS_VISIBLE | 
								CBS_AUTOHSCROLL | 
								CBS_DROPDOWNLIST | 
								CBS_HASSTRINGS, 
								rect, this, DROPDOWN_SIZE ) )
			{

				m_size.SetFont( CFont::FromHandle( ( HFONT ) ::GetStockObject( ANSI_VAR_FONT ) ) );
				m_size.FillCombo();
				CString color;
				CString defaultText;
				CString customText;
				color.LoadString( STRING_COLOR );
				defaultText.LoadString( STRING_DEFAULT );
				customText.LoadString( STRING_CUSTOM );

				tbi.cx = COLOR_WIDTH;
				SetButtonInfo( FONT_COLOR_POS, &tbi );
				GetItemRect( FONT_COLOR_POS, &rect );

				// The color picker
				if( m_color.Create( color,
									WS_VISIBLE|
									WS_CHILD,
									rect, this, BUTTON_COLOR ) )
				{

					m_color.SetDefaultText( defaultText );
					m_color.SetCustomText( customText );
					m_color.SetSelectionMode( CP_MODE_TEXT );
					m_color.SetBkColour( RGB( 255, 255, 255 ) );

					m_color.SetFont( CFont::FromHandle( ( HFONT ) ::GetStockObject( ANSI_VAR_FONT ) ) );
					result = TRUE;

				}

			}

		}

	}

	return result;

}

BEGIN_MESSAGE_MAP(CRRECToolbar, CToolBarCtrl)
	//{{AFX_MSG_MAP(CRRECToolbar)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	ON_CBN_SELCHANGE(DROPDOWN_FONT, OnSelchangeFont)
	ON_CBN_SELCHANGE(DROPDOWN_SIZE, OnSelchangeSize)
	ON_MESSAGE(CPN_SELENDOK, OnColorButton)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CRRECToolbar message handlers

void CRRECToolbar::OnSelchangeFont() 
/* ============================================================
	Function :		CRRECToolbar::OnSelchangeFont
	Description :	Changes the font of the selected text in 
					the editor.
	Access :		Protected
					
	Return :		void
	Parameters :	none

	Usage :			Called from MFC when the selection changes 
					in the font name combo.

   ============================================================*/
{

	CString font;
	int index = m_font.GetCurSel();
	if( index != CB_ERR )
	{
		m_font.GetLBText( index, font );
		GetParent()->SendMessage( urm_SETCURRENTFONTNAME, ( WPARAM ) ( LPCTSTR ) font, 0 );

	}	
}

void CRRECToolbar::OnSelchangeSize() 
/* ============================================================
	Function :		CRRECToolbar::OnSelchangeSize
	Description :	Changes the size of the selected text in 
					the editor.
	Access :		Protected
					
	Return :		void
	Parameters :	none

	Usage :			Called from MFC when the selection changes 
					in the font size combo.

   ============================================================*/
{
	int size = 0;
	int index = m_size.GetCurSel();
	if( index != CB_ERR )
	{

		CString sz;
		m_size.GetLBText( index, sz );
		size = _ttoi( ( LPCTSTR ) sz );

		GetParent()->SendMessage( urm_SETCURRENTFONTSIZE, 0, ( LPARAM ) size );

	}
	
}

LRESULT CRRECToolbar::OnColorButton( WPARAM, LPARAM ) 
/* ============================================================
	Function :		CRRECToolbar::OnColorButton
	Description :	Mapped to the color picker defined 
					"CPN_SELENDOK" message, sent when the color 
					is changed in the picker.
	Access :		Protected
					
	Return :		LRESULT	-	Not used
	Parameters :	WPARAM	-	Not used
					LPARAM	-	Not used

	Usage :			Called from MFC.

   ============================================================*/
{

	COLORREF color = RGB( 0, 0, 0 );
	color = m_color.GetColour();

	GetParent()->SendMessage( urm_SETCURRENTFONTCOLOR, 0, ( LPARAM ) color );
	
	return 0;
}

/////////////////////////////////////////////////////////////////////////////
// CRRECToolbar UI updaters

void CRRECToolbar::SetFontName( const CString& font )
/* ============================================================
	Function :		CRRECToolbar::SetFontName
	Description :	Selects the font name "font" in the font 
					name combo on the toolbar.
	Access :		Public
					
	Return :		void
	Parameters :	none

	Usage :			Call to set the selected font name

   ============================================================*/
{

	if( m_font.m_hWnd )
		m_font.SelectFontName( font );

}

void CRRECToolbar::SetFontSize( int size )
/* ============================================================
	Function :		CRRECToolbar::SetFontSize
	Description :	Selects the font size "size" in the font 
					size combo on the toolbar.
	Access :		Public
					
	Return :		void
	Parameters :	none

	Usage :			Call to set the selected font size

   ============================================================*/
{

	if( m_size.m_hWnd )
		m_size.SelectSize( size );

}

void CRRECToolbar::SetFontColor( COLORREF color )
/* ============================================================
	Function :		CRRECToolbar::SetFontColor
	Description :	Selects the font color "color" in the font 
					color picker on the toolbar.
	Access :		Public
					
	Return :		void
	Parameters :	none

	Usage :			Call to set the color picker color

   ============================================================*/
{

	if( m_color.m_hWnd )
		m_color.SetColour( color );

}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under A Public Domain dedication


Written By
Software Developer (Senior) Abstrakt Mekanik AB
Sweden Sweden
45 years old, married, three kids.

Started with computers more than 20 years ago on a CBM-64.

Read Theoretical Philosophy at the University of Lund.

Working as a C++ consultant developer.

Science-fiction freak. Enjoy vintage punkrock.

Comments and Discussions