www.pudn.com > mod_rssim6.zip > ColorPickerCB.h
// ColorPickerCB.cpp
//
// (c) 1998 James R. Twine
//
// Based On Code That Was Found On www.codeguru.com, And Was
// © 1997 Baldvin Hansson
//
// Create A ComboBox (Drop List) And Set The
// "Owner Draw Fixed" And "Has Strings" Styles/Checkboxes, And
// Map This Class To It. See? Simple!
//
#if !defined(AFX_COLORPICKERCB_H__C74333B7_A13A_11D1_ADB6_C04D0BC10000__INCLUDED_)
#define AFX_COLORPICKERCB_H__C74333B7_A13A_11D1_ADB6_C04D0BC10000__INCLUDED_
#if _MSC_VER >= 1000
#pragma once
#endif // _MSC_VER >= 1000
//
// Constants...
//
#define CCB_MAX_COLORS 16 // Colors In List
#define CCB_MAX_COLOR_NAME 16 // Max Chars For Color Name - 1
//
// Internal Structure For Color/Name Storage...
//
struct SColorAndName
{
/**/ SColorAndName()
{
ZeroMemory( this, sizeof( SColorAndName ) ); // Init Structure
};
/**/ SColorAndName( COLORREF crColor, PCSTR cpColor )
{
ZeroMemory( this, sizeof( SColorAndName ) ); // Init Structure
m_crColor = crColor; // Set Color RGB Value
strncpy( m_cColor, cpColor, CCB_MAX_COLOR_NAME ); // Set Color Name
};
COLORREF m_crColor; // Actual Color RGB Value
char m_cColor[ CCB_MAX_COLOR_NAME ]; // Actual Name For Color
};
class CColorPickerCB : public CComboBox
{
// Construction
public:
CColorPickerCB();
// Attributes
private:
bool m_bInitialized; // Control Initialized?
CString m_sColorName; // Name Of Selected Color
static
SColorAndName ms_pColors[ CCB_MAX_COLORS ]; // Array Of Colors And Names
private:
void Initialize( void ); // Initialize Control/Colors
public:
COLORREF GetSelectedColorValue( void ); // Get Selected Color Value
CString GetSelectedColorName( void ); // Get Selected Color Name
void SetSelectedColorValue( COLORREF crClr );// Set Selected Color Value
void SetSelectedColorName( PCSTR cpColor ); // Set Selected Color Name
bool RemoveColor( PCSTR cpColor ); // Remove Color From List
bool RemoveColor( COLORREF crClr ); // Remove Color From List
int AddColor( PCSTR cpNam, COLORREF crClr );// Insert A New Color
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CColorPickerCB)
protected:
virtual void PreSubclassWindow();
//}}AFX_VIRTUAL
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
// Implementation
public:
virtual ~CColorPickerCB();
// Generated message map functions
protected:
//{{AFX_MSG(CColorPickerCB)
afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_COLORPICKERCB_H__C74333B7_A13A_11D1_ADB6_C04D0BC10000__INCLUDED_)
/*
I found it useful to add some custom DDX routines to aid get/set of dialog control values from/to member variables.
So here they are. Just add the declarations to ColorPickerCB.h, and the definitions to ColorPickerCB.cpp:
// DECLARATIONS
// Gets/sets color value from/to COLORREF member variable
void DDX_ColorPicker(CDataExchange* pDX_, int nIDC_, COLORREF& prgbColor_);
// Gets/sets color name from/to CString member variable
void DDX_ColorPicker(CDataExchange* pDX_, int nIDC_, CString& cName_);
// DEFINITIONS
void DDX_ColorPicker(CDataExchange* pDX_, int nIDC_, COLORREF& rgbColor_)
{
HWND hWndCtrl = pDX_->PrepareCtrl(nIDC_);
ASSERT(hWndCtrl);
CColorPickerCB* pPicker = (CColorPickerCB*) CWnd::FromHandle(hWndCtrl);
ASSERT(pPicker);
if (!pDX_->m_bSaveAndValidate)
{
pPicker->SetSelectedColorValue(rgbColor_);
}
else
{
rgbColor_ = pPicker->GetSelectedColorValue();
}
}
void DDX_ColorPicker(CDataExchange* pDX_, int nIDC_, CString& cName_)
{
HWND hWndCtrl = pDX_->PrepareCtrl(nIDC_);
ASSERT(hWndCtrl);
CColorPickerCB* pPicker = (CColorPickerCB*) CWnd::FromHandle(hWndCtrl);
ASSERT(pPicker);
if (!pDX_->m_bSaveAndValidate)
{
pPicker->SetSelectedColorName(cName_);
}
else
{
cName_ = pPicker->GetSelectedColorName();
}
}
Declare the following variables in the dialog header file:
CColorPickerCB m_cColorCtl; // Required to subclass combo
COLORREF m_rgbColor; // Optional - if want COLORREF value
CString m_szColor; // Optional - if want color name
And then modify DoDataExchange to look something like this:
void CMyDialog::DoDataExchange(CDataExchange* pDX_)
{
CDialog::DoDataExchange(pDX_);
//{{AFX_DATA_MAP(CMyDialog)
DDX_Control(pDX_, IDC_COLOR, m_cColorCtl); // Required to subclass combo
//}}AFX_DATA_MAP
DDX_ColorPicker(pDX_, IDC_COLOR, m_rgbColor); // Optional - Maps COLORREF to member variable m_rgbColor
DDX_ColorPicker(pDX_, IDC_COLOR, m_szColor); // Optional - Maps color name to member variable m_szColor
}
And thats it! It should be a mite easier to set-up your color dialog!
*/