colorbtn.hの全インプリメンテーション
//////////////////////////////////////////////////////////////////// // // CLASS : CColorButton // FILE : colorbtn.h // FUNCTION: カラーボタンを実装するクラス(定義部) // //////////////////////////////////////////////////////////////////// #ifndef ___CCOLORBTN_H_ #define ___CCOLORBTN_H_ class CColorButton : public CButton { DECLARE_DYNAMIC(CColorButton) private: COLORREF coltext; // キャプションカラー(通常時) COLORREF colbackground; // 背景色 COLORREF coldisabled; // ボタンが無効時のキャプションカラー public: // コンストラクタ・デストラクタ CColorButton(); virtual ~CColorButton(); // メンバ関数 BOOL AutoLoad(const UINT nID, CWnd* pParent); // ボタンをCColorButtonにアタッチ void SetTextColor(const COLORREF color){coltext = color;} // キャプションカラー設定 void SetBackGroundColor(const COLORREF color){colbackground = color;} // 背景色設定 void SetTextColor(const COLORREF color){coltext = color;} // キャプションカラー設定 void SetDisabledColor(const COLORREF color){coldisabled = color;} // ボタン無効時のキャプションカラー設定 COLORREF GetTextColor() { return coltext; } // キャプションカラー取得 COLORREF GetBackGroundColor() { return colbackground; } // 背景色取得 void SetTextColor(const COLORREF color){coltext = color;} // キャプションカラー設定 COLORREF GetDisabledColor() { return coldisabled; } // ボタン無効時のキャプションカラー取得 protected: virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS); // ボタンのオーナー描画 void DrawBkGround(CDC *pDC, CRect rect,const COLORREF color); // 背景色描画 void DrawCaption(CDC *pDC, CRect rect,const COLORREF color,const CString& str); // キャプション描画 }; #endif
colorbtn.cppの全インプリメンテーション
//////////////////////////////////////////////////////////////////// // // CLASS : CColorButton // FILE : colorbtn.h // FUNCTION: カラーボタンを実装するクラス(実現部) // //////////////////////////////////////////////////////////////////// #include "stdafx.h" #include "colorbtn.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif IMPLEMENT_DYNAMIC(CColorButton, CButton) CColorButton::CColorButton() { // ディフォルトカラー coltext = RGB(0, 0, 0); // #0x00,0x00,0x00 colbackground = RGB(192, 192, 192); // #0xC0,0xC0,0xC0 coldisabled = RGB(128, 128, 128); // #0x80,0x80,0x80 } CColorButton::~CColorButton() { } // ボタンをCColorButtonアタッチにする BOOL CColorButton::AutoLoad(const UINT nID, CWnd* pParent) { // ダイナミックサブクラス化 if (!SubclassDlgItem(nID, pParent)) return false; return true; } // オーナー描画する void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDIS) { CDC* pDC = CDC::FromHandle(lpDIS->hDC); CString strCaption; UINT nState = lpDIS->itemState; CRect focusRect, btnRect; focusRect.CopyRect(&lpDIS->rcItem); btnRect.CopyRect(&lpDIS->rcItem); // フォーカス矩形領域の作成 focusRect.left += 4; focusRect.right -= 4; focusRect.top += 4; focusRect.bottom -= 4; // ボタンのキャプションを取得 GetWindowText(strCaption); // ボタンの描画(背景色、エッジ、キャプション) DrawBkGround(pDC, btnRect, GetBackGroundColor()); DrawCaption(pDC, btnRect, GetTextColor(),strCaption); pDC->DrawEdge(btnRect,EDGE_RAISED,BF_RECT); // フォーカスを得たときや選択されているとき if (nState & ODS_FOCUS) { if (nState & ODS_SELECTED) { pDC->DrawEdge(btnRect,EDGE_SUNKEN,BF_RECT); } pDC->DrawFocusRect(focusRect); }// ボタンが無効であるとき else if(nState & ODS_DISABLED) { DrawCaption(pDC, btnRect, GetDisabledColor(), strCaption); } } // 背景色描画 void CColorButton::DrawBkGround(CDC *pDC, CRect rect,const COLORREF color) { CBrush brush(color); pDC->FillRect(rect, &brush); } // キャプション描画 void CColorButton::DrawCaption(CDC *pDC, CRect rect,const COLORREF color,const CString& str) { COLORREF oldcolor = pDC->SetTextColor(color); pDC->SetBkMode(TRANSPARENT); pDC->DrawText(str,rect,DT_CENTER|DT_VCENTER|DT_SINGLELINE); pDC->SetTextColor(oldcolor); }