分类: C/C++
2008-09-14 21:15:45
This control is a simple modification to the "Office 97 style Colour Picker" control by Chris Maunder. You may refer to that for futher details. The new code is dependant on the CColourPopup
class from that article (though it is included in the source and demo downloads) with one small modification to its code that asserted the parent class was a CColourPicker
.
I was hoping to capture the appearance of the color button that appears in some Windows dialogs including the Display Properties|Appearance property page. The code is very straightforward, borrows from the original CColourPicker
when possible, and introduces new drawing code to match as closely as possible the Windows color picker.
Like the original control, this button can be used in place of any dialog or window button control, and supports direct creation or subclassing though DDX_Control
. It also includes a DDX_ColorButton
routine for setting and retreiving the COLORREF
value in DoDataExchange
.
CColorButton
has the following public members:
//*********************************************************************** // Name: CColorButton // Description: Default constructor. // Parameters: None. // Return: None. // Notes: None. //*********************************************************************** CColorButton(void); //*********************************************************************** // Name: CColorButton // Description: Destructor. // Parameters: None. // Return: None. // Notes: None. //*********************************************************************** virtual ~CColorButton(void); //*********************************************************************** //** Property Accessors ** //*********************************************************************** __declspec(property(get=GetColor,put=SetColor)) COLORREF Color; __declspec(property(get=GetDefaultColor,put=SetDefaultColor)) COLORREF DefaultColor; __declspec(property(get=GetTrackSelection,put=SetTrackSelection)) BOOL TrackSelection; __declspec(property(put=SetCustomText)) LPCTSTR CustomText; __declspec(property(put=SetDefaultText)) LPCTSTR DefaultText; //*********************************************************************** // Name: GetColor // Description: Returns the current color selected in the control. // Parameters: void // Return: COLORREF // Notes: None. //*********************************************************************** COLORREF GetColor(void) const; //*********************************************************************** // Name: SetColor // Description: Sets the current color selected in the control. // Parameters: COLORREF Color // Return: None. // Notes: None. //*********************************************************************** void SetColor(COLORREF Color); //*********************************************************************** // Name: GetDefaultColor // Description: Returns the color associated with the 'default' selection. // Parameters: void // Return: COLORREF // Notes: None. //*********************************************************************** COLORREF GetDefaultColor(void) const; //*********************************************************************** // Name: SetDefaultColor // Description: Sets the color associated with the 'default' selection. // The default value is COLOR_APPWORKSPACE. // Parameters: COLORREF Color // Return: None. // Notes: None. //*********************************************************************** void SetDefaultColor(COLORREF Color); //*********************************************************************** // Name: SetCustomText // Description: Sets the text to display in the 'Custom' selection of the // CColourPicker control, the default text is "More Colors...". // Parameters: LPCTSTR tszText // Return: None. // Notes: None. //*********************************************************************** void SetCustomText(LPCTSTR tszText); //*********************************************************************** // Name: SetDefaultText // Description: Sets the text to display in the 'Default' selection of the // CColourPicker control, the default text is "Automatic". If // this value is set to "", the 'Default' selection will not // be shown. // Parameters: LPCTSTR tszText // Return: None. // Notes: None. //*********************************************************************** void SetDefaultText(LPCTSTR tszText); //*********************************************************************** // Name: SetTrackSelection // Description: Turns on/off the 'Track Selection' option of the control // which shows the colors during the process of selection. // Parameters: BOOL bTrack // Return: None. // Notes: None. //*********************************************************************** void SetTrackSelection(BOOL bTrack); //*********************************************************************** // Name: GetTrackSelection // Description: Returns the state of the 'Track Selection' option. // Parameters: void // Return: BOOL // Notes: None. //*********************************************************************** BOOL GetTrackSelection(void) const;
The table below lists the messages generated by the CColorButton
class. They are identical to the CColourPicker
messages.
Message | Description | lParam | wParam |
---|---|---|---|
CPN_SELCHANGE | Colour Picker Selection change | Color | Control ID |
CPN_DROPDOWN | Colour Picker drop down | Color | Control ID |
CPN_CLOSEUP | Colour Picker close up | Color | Control ID |
CPN_SELENDOK | Colour Picker end OK | Color | Control ID |
CPN_SELENDCANCEL | Colour Picker end (cancelled) | Color | Control ID |
In order to handle the messages generated by the CColorButton
control, you will need to manually add ON_MESSAGE(CPN_XXX, MessageFn)
handlers to your message map. The handler function will take the form of a standard Windows message handler as shown below.
BEGIN_MESSAGE_MAP(CMyDialog, CDialog) //{{AFX_MSG_MAP(CMyDialog) ON_MESSAGE(CPN_SELENDOK, OnSelEndOK) ON_MESSAGE(CPN_SELENDCANCEL, OnSelEndCancel) ON_MESSAGE(CPN_SELCHANGE, OnSelChange) ON_MESSAGE(CPN_CLOSEUP, OnCloseUp) ON_MESSAGE(CPN_DROPDOWN, OnDropDown) //}}AFX_MSG_MAP END_MESSAGE_MAP() LONG CMyDialog::OnSelEndOK(UINT /*lParam*/, LONG /*wParam*/) { TRACE0("Selection ended OK\n"); return TRUE; } LONG CMyDialog::OnSelEndCancel(UINT /*lParam*/, LONG /*wParam*/) { TRACE0("Selection cancelled\n"); return TRUE; } LONG CMyDialog::OnSelChange(UINT /*lParam*/, LONG /*wParam*/) { TRACE0("Selection changed\n"); return TRUE; } LONG CMyDialog::OnCloseUp(UINT /*lParam*/, LONG /*wParam*/) { TRACE0("Colour picker close up\n"); return TRUE; } LONG CMyDialog::OnDropDown(UINT /*lParam*/, LONG /*wParam*/) { TRACE0("Colour picker drop down\n"); return TRUE; }
The included source is a minor alteration of the already great code supplied by Chris Maunder, who had help from Alexander Bischofberger, Paul Wilkerson, and Geir Arne Trillhus. All appreciative feedback should be passed to them, complaints to me.