Click here to Skip to main content
15,880,469 members
Articles / Desktop Programming / WTL

WTL Helper

Rate me:
Please Sign up or sign in to vote.
4.92/5 (116 votes)
27 Aug 200713 min read 694.8K   8.8K   190  
Add-in for Microsoft VC++.NET 2003 that helps to insert message handlers for WTL.
#ifndef DSSI_COLORBUTTON_H
#define DSSI_COLORBUTTON_H

//-----------------------------------------------------------------------------
// 
// @doc
//
// @module	ColorButton.h - IO monitor main window |
//
// This module contains the definition of the io monitor window.
//
// Based on work by Chris Maunder, Alexander Bischofberger and James White.
// (See following original copyright statement)
//
// http://www.codetools.com/miscctrl/colorbutton.asp
// http://www.codetools.com/miscctrl/colour_picker.asp
//
// Copyright (c) 2000-2002 - Descartes Systems Sciences, Inc.
//
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without 
// modification, are permitted provided that the following conditions are 
// met:
// 
// 1. Redistributions of source code must retain the above copyright notice, 
//    this list of conditions and the following disclaimer. 
// 2. Neither the name of Descartes Systems Sciences, Inc nor the names of 
//    its contributors may be used to endorse or promote products derived 
//    from this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED 
// TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// --- ORIGINAL COPYRIGHT STATEMENT ---
//
// Written by Chris Maunder (chrismaunder@codeguru.com)
// Extended by Alexander Bischofberger (bischofb@informatik.tu-muenchen.de)
// Copyright (c) 1998.
//
// Updated 30 May 1998 to allow any number of colours, and to
//                     make the appearance closer to Office 97. 
//                     Also added "Default" text area.         (CJM)
//
//         13 June 1998 Fixed change of focus bug (CJM)
//         30 June 1998 Fixed bug caused by focus bug fix (D'oh!!)
//                      Solution suggested by Paul Wilkerson.
//
// ColourPopup is a helper class for the colour picker control
// CColourPicker. Check out the header file or the accompanying 
// HTML doc file for details.
//
// This code may be used in compiled form in any way you desire. This
// file may be redistributed unmodified by any means PROVIDING it is 
// not sold for profit without the authors written consent, and 
// providing that this notice and the authors name is included. 
//
// This file is provided "as is" with no expressed or implied warranty.
// The author accepts no liability if it causes any damage to you or your
// computer whatsoever. It's free, so don't hassle me about it.
//
// Expect bugs.
// 
// Please use and enjoy. Please let me know of any bugs/mods/improvements 
// that you have found/implemented and I will fix/incorporate them into this
// file. 
//
// @end
//
// $History: ColorButton.h $
//      
//      *****************  Version 3  *****************
//      User: Tim Smith    Date: 9/10/01    Time: 9:05a
//      Updated in $/Omni_V2/exe_cnf
//      
//      *****************  Version 2  *****************
//      User: Tim Smith    Date: 8/28/01    Time: 4:25p
//      Updated in $/Omni_V2/exe_cnf
//      Updated copyright dates.
//      
//      *****************  Version 1  *****************
//      User: Tim Smith    Date: 8/28/01    Time: 3:19p
//      Created in $/Omni_V2/exe_cnf
//
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//
// Instructions on how to add CColorButton to you application:
//
//   1. Copy CColorButton.h and CColorButton.cpp into you application directory.
//
//   2. Add the two files into your project.
//
//   3. Many little features will not be enabled unless you have WINVER
//		and _WIN32_WINNT defined properly.  You can defined these values
//		in your stdafx.h.
//
//		_WIN32_WINNT >= 0x0501	- Theme support, XP flat menu support, XP drop 
//								  shadow support.
//
//		WINVER >= 0x0500		- Multi-monitor support, XP menu highlight 
//								  color support.
//
//		WINVER >= 0x0501		- XP menu highlight color support.
//
//		For MOST applications, both _WIN32_WINNT and WINVER should be 
//		defined to be 0x0501.
//
//   4. If you want XP theme support, add "#include <atltheme.h>" to your 
//		stdafx.h file.  This should be added after all the other atl includes.
//
//   5. CColorButton makes heavy use of helper types from ATL.  You will need
//		to make sure that "atltypes.h" and "atlgdi.h" are being included 
//		in stdafx.h.
//
//	 6. Add a button to the dialog in question using the resource editor.
//		You don't have to make and style adjustments to the button.
//
//   7. Edit the class definition for the dialog box.  To the message map,
//		add "REFLECT_NOTIFICATIONS ()".
//
//	 8. Add "#include "ColorButton.h"" prior to the definition of the dialog
//		box class.
//
//	 9. Add a new member variable to the dialog.  The class will be 
//		"CColorButton" and give it any name you desire.  For this example,
//		we will call it "m_btnMyColor".
//
//  10. Inside your OnInitDialog for the dialog, add a line to subclass
//		the m_btnMyColor control.  It is important that is it subclassed
//		and not just assigned a window handle.
//
//		m_btnMyColor .SubclassWindow (GetDlgItem (IDC_MY_COLOR));
//
//	11. Compile and enjoy.
//
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//
// Required include files
//
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//
// Forward definitions
//
//-----------------------------------------------------------------------------

//-----------------------------------------------------------------------------
//
// Test for themes
//
//-----------------------------------------------------------------------------
#include <atltheme.h>

#if !defined (COLORBUTTON_NOTHEMES) && !defined (__ATLTHEME_H__)
#define COLORBUTTON_NOTHEMES
#endif

//-----------------------------------------------------------------------------
//
// Notification messages
//
//-----------------------------------------------------------------------------

#define CPN_SELCHANGE        0x8000	/* Colour Picker Selection change */
#define CPN_DROPDOWN         0x8001	/* Colour Picker drop down */
#define CPN_CLOSEUP          0x8002	/* Colour Picker close up */
#define CPN_SELENDOK         0x8003	/* Colour Picker end OK */
#define CPN_SELENDCANCEL     0x8004	/* Colour Picker end (cancelled) */

struct NMCOLORBUTTON
{
	NMHDR		hdr;
	BOOL		fColorValid;
	COLORREF	clr;
};

//-----------------------------------------------------------------------------
//
// Class definition
//
//-----------------------------------------------------------------------------

class CColorButton :
	public CWindowImpl <CColorButton>
#if !defined (COLORBUTTON_NOTHEMES)
	, public CThemeImpl <CColorButton>
#endif
{
// @access Types and enumerations
public:

	struct ColorTableEntry
	{
		COLORREF	clrColor;
		LPCTSTR		pszName;
	};

// @access Construction and destruction
public:

	// @cmember General constructor

	CColorButton ();

	// @cmember General destructor

	~CColorButton ();

// @access Public inline methods
public:

	// @cmember Subclass the window

	BOOL SubclassWindow (HWND hWnd);

	// @cmember Get the current color

	COLORREF GetColor (void) const
	{
		return m_clrCurrent;
	}

	// @cmember Set the current color

	void SetColor (COLORREF clrCurrent)
	{
		m_clrCurrent = clrCurrent;
		if (IsWindow ())
			InvalidateRect (NULL);
	}

	// @cmember Get the default color

	COLORREF GetDefaultColor (void) const
	{
		return m_clrDefault;
	}

	// @cmember Set the default color

	void SetDefaultColor (COLORREF clrDefault)
	{
		m_clrDefault = clrDefault;
	}

	// @cmember Set the custom text

	void SetCustomText (LPCTSTR pszText)
	{
		if (m_pszCustomText)
			free (m_pszCustomText);
		if (pszText)
			m_pszCustomText = _tcsdup (pszText);
		else
			m_pszCustomText = NULL;
	}

	// @cmember Set the custom text via a resource string

	void SetCustomText (UINT nID)
	{
		if (nID == 0)
			SetCustomText ((LPCTSTR) NULL);
		else
		{
			TCHAR szText [256];
#if (_ATL_VER >= 0x0700)
			if (LoadString (_AtlModule .GetResourceInstance (),
#else
			if (LoadString (_Module .GetResourceInstance (),
#endif
				nID, szText, sizeof (szText) / sizeof (szText [0])) == 0)
				return;
			SetCustomText (szText);
		}
	}

	// @cmember Set the default text

	void SetDefaultText (LPCTSTR pszText)
	{
		if (m_pszDefaultText)
			free (m_pszDefaultText);
		if (pszText)
			m_pszDefaultText = _tcsdup (pszText);
		else
			m_pszDefaultText = NULL;
	}

	// @cmember Set the default text via a resource string

	void SetDefaultText (UINT nID)
	{
		if (nID == 0)
			SetDefaultText ((LPCTSTR) NULL);
		else
		{
			TCHAR szText [256];
#if (_ATL_VER >= 0x0700)
			if (LoadString (_AtlModule .GetResourceInstance (),
#else
			if (LoadString (_Module .GetResourceInstance (),
#endif
				nID, szText, sizeof (szText) / sizeof (szText [0])) == 0)
				return;
			SetDefaultText (szText);
		}
	}

	// @cmember Get the tracking flag

	BOOL GetTrackSelection (void) const
	{
		return m_fTrackSelection;
	}

	// @cmember Set the tracking flag

	void SetTrackSelection (BOOL fTrack)
	{
		m_fTrackSelection = fTrack;
	}

	// @cmember Set both strings from a resource

	void SetText (UINT nDefault, UINT nCustom)
	{
		SetDefaultText (nDefault);
		SetCustomText (nCustom);
	}

	// @cmember Do we have custom text

	BOOL HasCustomText () const
	{
		return m_pszCustomText && m_pszCustomText [0] != 0;
	}

	// @cmember Do we have default text

	BOOL HasDefaultText () const
	{
		return m_pszDefaultText && m_pszDefaultText [0] != 0;
	}

// @access ATL window support
public:

	BEGIN_MSG_MAP (CColorButton)
		if (CTheme::IsThemingSupported())
		{
			CHAIN_MSG_MAP (CThemeImpl <CColorButton>)	// should be here, not at bottom
		}

		MESSAGE_HANDLER (WM_MOUSEMOVE, OnMouseMove);
		MESSAGE_HANDLER (WM_MOUSELEAVE, OnMouseLeave);

	    MESSAGE_HANDLER (OCM__BASE + WM_DRAWITEM, OnDrawItem)

	    REFLECTED_COMMAND_CODE_HANDLER (BN_CLICKED, OnClicked)

		ALT_MSG_MAP (1)

		MESSAGE_HANDLER (WM_PAINT, OnPickerPaint);
		MESSAGE_HANDLER (WM_QUERYNEWPALETTE, OnPickerQueryNewPalette);
		MESSAGE_HANDLER (WM_PALETTECHANGED, OnPickerPaletteChanged);
	END_MSG_MAP ()

// @access ATL Message handlers
protected:

	// @cmember Handle draw item

	LRESULT OnDrawItem (UINT uMsg, 
		WPARAM wParam, LPARAM lParam, BOOL &bHandled);

	// @cmember Handle mouse move

	LRESULT OnMouseMove (UINT uMsg, 
		WPARAM wParam, LPARAM lParam, BOOL &bHandled);

	// @cmember Handle mouse leave

	LRESULT OnMouseLeave (UINT uMsg, 
		WPARAM wParam, LPARAM lParam, BOOL &bHandled);

	// @cmember Handle key down for picker

	LRESULT OnPickerKeyDown (UINT uMsg, 
		WPARAM wParam, LPARAM lParam, BOOL &bHandled);

	// @cmember Handle button up event for picker

	LRESULT OnPickerLButtonUp (UINT uMsg, 
		WPARAM wParam, LPARAM lParam, BOOL &bHandled);

	// @cmember Handle mouse move for picker

	LRESULT OnPickerMouseMove (UINT uMsg, 
		WPARAM wParam, LPARAM lParam, BOOL &bHandled);

	// @cmember Handle paint for picker

	LRESULT OnPickerPaint (UINT uMsg, 
		WPARAM wParam, LPARAM lParam, BOOL &bHandled);

	// @cmember Handle palette query for picker

	LRESULT OnPickerQueryNewPalette (UINT uMsg, 
		WPARAM wParam, LPARAM lParam, BOOL &bHandled);

	// @cmember Handle palette change for picker

	LRESULT OnPickerPaletteChanged (UINT uMsg, 
		WPARAM wParam, LPARAM lParam, BOOL &bHandled);

// @access Notification handlers
public:

	// @cmember Handle on click

	LRESULT OnClicked (WORD wNotifyCode, WORD wID, 
		HWND hWndCtl, BOOL& bHandled);

// @access Protected methods
protected:

	// @cmember Display the picker popup

	BOOL Picker ();

	// @cmember Set the window size of the picker control

	void SetPickerWindowSize ();

	// @cmember Create the picker tooltips

	void CreatePickerToolTips (CToolTipCtrl &sToolTip);

	// @cmember Get the rect of a given cell

	BOOL GetPickerCellRect (int nIndex, RECT *pRect) const;

	// @cmember Set the selected color from the given color

	void FindPickerCellFromColor (COLORREF clr);

	// @cmember Set a new selection

	void ChangePickerSelection (int nIndex);

	// @cmember End the picker selection process

	void EndPickerSelection (BOOL fOked);

	// @cmember Draw a cell

	void DrawPickerCell (CDC &dc, int nIndex);

	// @cmember Send notification message

	void SendNotification (UINT nCode, COLORREF clr, BOOL fColorValid);

	// @cmember Do a hit test

	int PickerHitTest (const POINT &pt);

// @access Protected static methods
protected:

	// @cmember Draw an arrow

	static void DrawArrow (CDC &dc, const RECT &rect,
		int iDirection = 0, COLORREF clrArrow = RGB (0, 0, 0));

// @access Protected members
protected:

	//
	// THE FOLLOWING variables control the actual button
	//

	// @cmember Current color

	COLORREF				m_clrCurrent;

	// @cmember default color

	COLORREF				m_clrDefault;

	// @cmember Default text

	LPTSTR					m_pszDefaultText;

	// @cmember Custom text

	LPTSTR					m_pszCustomText;

	// @cmember True if popup active override

	BOOL					m_fPopupActive;

	// @cmember True if tracking selection

	BOOL					m_fTrackSelection;

	// @cmember True if the mouse is over

	BOOL					m_fMouseOver;

	//
	// THE FOLLOWING variables control the popup
	//

	// @cmember The contained picker control

	CContainedWindow		m_wndPicker;

	// @cmember Array of colors for the popup

    static ColorTableEntry	gm_sColors [];

	// @cmember Number of columns in the picker

	int						m_nNumColumns;

	// @cmember Number of rows in the picker

    int						m_nNumRows;

	// @cmember Total number of colors in the color array
    
	int						m_nNumColors;

	// @cmember Font used on the picker control

    CFont					m_font;

	// @cmember Pallete used on the picker control

	CPalette				m_palette;

	// @cmember Current picker color

	COLORREF				m_clrPicker;

	// @cmember Margins for the picker

	CRect					m_rectMargins;

	// @cmember Rectangle of the custom text

    CRect					m_rectCustomText;

	// @cmember Rectangle of the default text

	CRect					m_rectDefaultText;

	// @cmember Rectangle of the boxes

	CRect					m_rectBoxes;

	// @cmember If true, menu is flat

	BOOL					m_fPickerFlat;

	// @cmember Size of the color boxes 

	CSize					m_sizeBox;

	// @cmember Picker current selection

    int						m_nCurrentSel;

	// @cmember The original user selection

    int						m_nChosenColorSel;

	// @cmember If true, the picker was OK, and no canceled out

	BOOL					m_fOked;

	// @cmember Color used to draw background

	COLORREF				m_clrBackground;

	// @cmember Color used for highlight border

	COLORREF				m_clrHiLightBorder;

	// @cmember Color used for highlight 

	COLORREF				m_clrHiLight;

	// @cmember Color used for low-light

	COLORREF				m_clrLoLight;

	// @cmember Color used for highlight text

	COLORREF				m_clrHiLightText;

	// @cmember Color used for normal text

	COLORREF				m_clrText;
};

#endif // DSSI_COLORBUTTON_H

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 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
Web Developer
Belarus Belarus
I am a software developer for 3 years.

Comments and Discussions