.h文件
// ecolorbtn.h : ヘッダー ファイル
//
#ifndef _ECOLOR_BUTTON_
#define _ECOLOR_BUTTON_
class EColorBtn : public CButton
{
// コンストラクション
public:
EColorBtn( );
~EColorBtn( );
// アトリビュート
public:
void SetColor(COLORREF rgbColor,BOOL bActive);
void ESetDrawPal( CPalette *pPal );
COLORREF GetColor();
protected:
COLORREF m_rgbColor;
COLORREF m_rgbActive;
BOOL m_bActive;
CPalette *m_pDrawPal;
// オペレーション
public:
// オーバーライド
// ClassWizard は仮想関数を生成しオーバーライドします。
//{{AFX_VIRTUAL(EColorBtn)
public:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct);
virtual BOOL Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext = NULL);
//}}AFX_VIRTUAL
// インプリメンテーション
public:
// 生成されたメッセージ マップ関数
protected:
//{{AFX_MSG(EColorBtn)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
public:
};
#endif
.cpp文件
// ecolorbtn.cpp : インプリメンテーション ファイル
//
#include "stdafx.h"
#include "ecolorbtn.h"
#include "./ecolorbtn.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// EColorBtn
EColorBtn::EColorBtn()
{
m_pDrawPal = NULL;
}
EColorBtn::~EColorBtn()
{
}
BEGIN_MESSAGE_MAP(EColorBtn, CButton)
//{{AFX_MSG_MAP(EColorBtn)
//}}AFX_MSG_MAP
// ON_WM_DRAWITEM()
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// EColorBtn メッセージ ハンドラ
void EColorBtn::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
CDC *cdc = GetDC();
BYTE byR, byG, byB;
CPalette *pOldPal = NULL;
if ( m_pDrawPal != NULL ){
pOldPal = cdc->SelectPalette( m_pDrawPal, FALSE );
cdc->RealizePalette( );
}
byR = GetRValue( m_rgbColor );
byG = GetGValue( m_rgbColor );
byB = GetBValue( m_rgbColor );
CBrush brush( PALETTERGB( byR, byG, byB ) );
CRect rect;
GetClientRect(&rect);
cdc->FillRect( &rect, &brush );
if(m_bActive == TRUE){ //Active
CBrush Framebrush(PALETTERGB(255-GetRValue(m_rgbColor),255-GetGValue(m_rgbColor),
255-GetBValue(m_rgbColor)));
cdc->FrameRect( &rect, &Framebrush );
}
if ( pOldPal != NULL ){
cdc->SelectPalette( pOldPal, FALSE );
}
ReleaseDC(cdc);
}
void EColorBtn::SetColor(COLORREF rgbColor,BOOL bActive)
{
m_rgbColor = rgbColor;
m_bActive = bActive;
Invalidate();
}
COLORREF EColorBtn::GetColor()
{
return m_rgbColor;
}
BOOL EColorBtn::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
m_rgbColor = RGB(0,255,0);
m_rgbActive = RGB(0,0,255);
m_bActive = FALSE;
return CWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, nID, pContext);
}
void EColorBtn::ESetDrawPal( CPalette *pPal )
{
m_pDrawPal = pPal;
}
应用例子:
CColorDialog _colDlg;
INT_PTR _response = _colDlg.DoModal();
if(_response == IDOK)
{
_color = _colDlg.GetColor();
_colorBtn.SetColor(_color, TRUE);
}