Click here to Skip to main content
15,881,863 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.4K   18.1K   403  
The Style Toolkit allows you to modernize the look of your programs using gradients, transparency, PNG images, and more.
//
// MemDC.h : Version 1.0 
//
// Author:  Darren Sessions
//          
//
// Description:
//      MemDC is a memory DC class based on the one written by Keith Rule.  The primary 
//		difference is the copy first option and the storage option.  Copy first should be set 
//		to true when working with objects that have transparency.  The storage type DC is 
//		defined but not created until the Create function is called.  The storage type does
//		not attempt to copy anything on destruction.
//
// History
//     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.
//
///////////////////////////////////////////////////////////////////////////////

#pragma once

#define ENABLE_GDIP_FUNTION

class MemDC : public CDC 
{

private:
	CDC*		m_pDC;			// CDC of passed in constructor
	CRect		m_rect;			// Rectangle of drawing area.
	BOOL		m_bPrintDC;		// True if printing
	BOOL		m_bCopyFirst;	// Copy existing on construction
	BOOL		m_bStorageDC;	// True if used for storing a bitmap
	CBitmap*	m_pOld;			// passed DC's bitmap
	CBitmap		m_bitmap;		// Offscreen bitmap
	BOOL		m_bCreated;		// TRUE after creation

public:

	// default constructor - requires subsequent create call
	MemDC() { m_bStorageDC = TRUE; m_bPrintDC = FALSE; m_bCreated = FALSE; };

	// constructor 
	MemDC(CDC* pDC, CRect rect, BOOL bCopyFirst = FALSE) 
		: CDC(), m_pDC(pDC), m_rect(rect), m_bCopyFirst(bCopyFirst)
	{
		// NULL dc not allowed
		ASSERT(m_pDC != NULL); 
		m_bStorageDC = FALSE;
		Init();
	}

	// create a MemDC and copy the data
	void Create(CDC* pDC, CRect rect)
	{
		// NULL dc not allowed
		ASSERT(pDC != NULL); 
		m_pDC = pDC;
		m_rect = rect;
		m_bCopyFirst = TRUE;
		m_bStorageDC = TRUE;

		Init();
	}
	
	void Init()
	{
		// true if printing
		m_bPrintDC = m_pDC->IsPrinting();
		
		if(!m_bPrintDC)
		{
			// Create a compatible DC
			CreateCompatibleDC(m_pDC);

			// create a compatible bitmap
			m_bitmap.CreateCompatibleBitmap(m_pDC, m_rect.Width(), m_rect.Height());

			// select bitmap into dc
			m_pOld = SelectObject(&m_bitmap);

			// set window origin
			SetWindowOrg(m_rect.left, m_rect.top);	

			// needed for transparency support
			if(m_bCopyFirst)
			{
				this->BitBlt(m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
						m_pDC, m_rect.left, m_rect.top, SRCCOPY);
			}
		} 
		else 
		{
			// Make a copy of the relevent parts of the current DC for printing
			m_bPrinting = m_pDC->m_bPrinting;
			m_hAttribDC = m_pDC->m_hAttribDC;
			m_hDC		= m_pDC->m_hDC;
		}

		m_bCreated = TRUE;
	}
	
#ifdef ENABLE_GDIP_FUNTION
	Bitmap* GetBitmap() {	CPalette* pPalette = m_pDC->GetCurrentPalette();
							return	Bitmap::FromHBITMAP((HBITMAP)m_bitmap.GetSafeHandle(), 
									(HPALETTE)pPalette->GetSafeHandle()); 
						}
#endif

	// destructor
	~MemDC()
	{
		if(!m_bPrintDC && !m_bStorageDC) 
		{
			// Copy the offscreen bitmap onto the screen
			m_pDC->BitBlt(	m_rect.left, m_rect.top, m_rect.Width(), m_rect.Height(),
								this, m_rect.left, m_rect.top, SRCCOPY );

			// Swap back the original bitmap.
			SelectObject(m_pOld);
		} 
		else if(m_bPrintDC)
		{
			// All we need to do is replace the DC with an illegal value,
			// this keeps us from accidently deleting the handles associated with
			// the CDC that was passed to the constructor.
			m_hDC = m_hAttribDC = NULL;
		}
	}

	// pointer operators
	MemDC* operator->()	{ return this; }
	operator MemDC*()		{ return this; }
};


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