Click here to Skip to main content
15,884,425 members
Articles / Desktop Programming / MFC

Style Toolkit - Use advanced graphics techniques to create a custom user interface

Rate me:
Please Sign up or sign in to vote.
4.97/5 (112 votes)
11 Aug 2008CPOL15 min read 227.6K   18.1K   403  
The Style Toolkit allows you to modernize the look of your programs using gradients, transparency, PNG images, and more.
//
// StyleEdit.cpp : Version 1.0 - see article at CodeProject.com
//
// Author:  Darren Sessions
//          
//
// Description:
//     StyleEdit is a CEdit derived control that uses the Style class
//	   and GDI+ to support different styles
//
// History
//		Version 1.1 - 2008 July 25
//		- Fixed incorrect string in OnNcPaint during some repaint operations
//
//		Version 1.0 - 2008 June 20
//		- Initial public release
//
// License:
//     This software is released under the Code Project Open License (CPOL),
//     which may be found here:  http://www.codeproject.com/info/eula.aspx
//     You are free to use this software in any way you like, except that you 
//     may not sell this source code.
//
//     This software is provided "as is" with no expressed or implied warranty.
//     I accept no liability for any damage or loss of business that this 
//     software may cause.
//
///////////////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "StyleEdit.h"

#include "colors.h"

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

/////////////////////////////////////////////////////////////////////////////
// StyleEdit

StyleEdit::StyleEdit()
	:m_EditRect(0,0,0,0)
{
	m_OffsetY = -1;
	m_HollowBrush.CreateStockObject(HOLLOW_BRUSH);
	m_TextColor = Black;
}

StyleEdit::~StyleEdit()
{
}

void StyleEdit::SetStack(Stack stack)
{
	Rect r(stack.Frame.frect);
	CRect cr(r.X, r.Y, r.X + r.Width, r.Y + r.Height);
	m_EditRect = cr;
	m_Style.AddStack(stack);
}
void StyleEdit::SetTextClr(COLORREF clr)
{
	m_TextColor = clr;
}

BEGIN_MESSAGE_MAP(StyleEdit, CEdit)
	ON_WM_CTLCOLOR_REFLECT()
	ON_WM_ERASEBKGND()
	ON_CONTROL_REFLECT(EN_UPDATE, OnUpdate)
	ON_WM_NCCALCSIZE()
	ON_WM_NCPAINT()
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// StyleEdit message handlers

HBRUSH StyleEdit::CtlColor(CDC* pDC, UINT nCtlColor) 
{
	pDC->SetBkMode(TRANSPARENT);
	pDC->SetTextColor(m_TextColor);
    return (HBRUSH)m_HollowBrush;
}

BOOL StyleEdit::OnEraseBkgnd(CDC* pDC) 
{
	m_Style.SetPosition(0, m_OffsetY);
	m_Style.PaintStyle(pDC, m_EditRect);
	return TRUE;
}

void StyleEdit::OnUpdate() 
{
	Invalidate(); 
}

// center text vertically
void StyleEdit::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS* lpncsp)
{
	CRect rectWnd, rectClient;
	
	//calculate client area height needed for a font
	CFont *pFont = GetFont();
	CRect rectText;
	rectText.SetRectEmpty();
	
	CDC *pDC = GetDC();
	
	CFont *pOld = pDC->SelectObject(pFont);
	pDC->DrawText(_T("Eb"), rectText, DT_CALCRECT | DT_LEFT);
	UINT uiVClientHeight = rectText.Height();
	
	pDC->SelectObject(pOld);
	ReleaseDC(pDC);
	
	//calculate NC area to center text.
	
	GetClientRect(rectClient);
	GetWindowRect(rectWnd);

	ClientToScreen(rectClient);

	UINT uiCenterOffset = (rectClient.Height() - uiVClientHeight) / 2;
	UINT uiCY = (rectWnd.Height() - rectClient.Height()) / 2;
	UINT uiCX = (rectWnd.Width() - rectClient.Width()) / 2;

	m_OffsetY = -(int)uiCenterOffset;

	lpncsp->rgrc[0].top +=uiCenterOffset;
	lpncsp->rgrc[0].bottom -= uiCenterOffset;

	lpncsp->rgrc[0].left +=uiCX;
	lpncsp->rgrc[0].right -= uiCY;
}

BOOL StyleEdit::OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pLResult)
{
	if(m_OffsetY == -1)
	{
		SetWindowPos(NULL, 0, 0, 0, 0, SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOMOVE | SWP_FRAMECHANGED);
	}

	return CEdit::OnChildNotify(message, wParam, lParam, pLResult);
}

void StyleEdit::OnNcPaint()
{
	Default();

	CWindowDC dc(this);

	CString str;
	GetWindowText(str);
	m_Style.SetPosition(0, 0);
	m_Style.PaintStyle(&dc, m_EditRect);
	SetWindowText(str);
}

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 The Code Project Open License (CPOL)


Written By
Software Developer (Senior)
United States United States
I am currently working as a consultant in Southern California.

I have worked as a Hardware Engineer, Firmware Engineer, Software Engineer and Applications Engineer.

I spent 13 years in the Disk Drive industry and the last 7 working in GPS.

Comments and Discussions