ColorButton.h
class CColorButton : public CButton {
DECLARE_DYNAMIC(CColorButton)
private:
int m_check; // チェック状態は自分で管理
public:
CColorButton();
virtual ~CColorButton();
afx_msg void OnClicked();
protected:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS); // ボタンのオーナー描画
DECLARE_MESSAGE_MAP()
};
#endif // _ColorButton_h_
--------------------------------------------------------------------------
ColorButton.cpp
#include "stdafx.h"
#include "ColorButton.h"
IMPLEMENT_DYNAMIC(CColorButton, CButton)
BEGIN_MESSAGE_MAP(CColorButton, CButton)
ON_CONTROL_REFLECT(BN_CLICKED, OnClicked)
END_MESSAGE_MAP()
CColorButton::CColorButton()
{
m_check = 0;
}
CColorButton::~CColorButton()
{
}
void CColorButton::OnClicked()
{
if (m_check == 0) m_check = BST_CHECKED;
else m_check = BST_UNCHECKED;
}
// ボタンのオーナー描画
void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
CDC* pDC = CDC::FromHandle(lpDIS->hDC);
CString capt;
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(capt);
// ボタンの描画(背景色、エッジ、キャプション)
if (m_check == BST_CHECKED) color = RGB(255, 0, 0);
else color = RGB(0, 0, 255);
CBrush brush(color);
// チェックされているとき
if (m_check == BST_CHECKED) {
pDC->DrawEdge(btnRect,EDGE_BUMP,BF_RECT);
} else {
pDC->DrawEdge(btnRect,EDGE_RAISED,BF_RECT);
}
pDC->FillRect(btnRect, &brush);
pDC->SetTextColor(RGB(255, 255, 255));
pDC->DrawText(capt, btnRect, DT_CENTER|DT_VCENTER);
// フォーカスを得たときや選択されているとき
if (nState & ODS_FOCUS) {
if (nState & ODS_SELECTED) {
pDC->DrawEdge(btnRect,EDGE_SUNKEN,BF_RECT);
}
pDC->DrawFocusRect(focusRect);
}
else if (nState & ODS_CHECKED) {
pDC->DrawEdge(btnRect,EDGE_BUMP,BF_RECT);
}
}
class CColorButton : public CButton {
DECLARE_DYNAMIC(CColorButton)
private:
int m_check; // チェック状態は自分で管理
public:
CColorButton();
virtual ~CColorButton();
afx_msg void OnClicked();
protected:
virtual void DrawItem(LPDRAWITEMSTRUCT lpDIS); // ボタンのオーナー描画
DECLARE_MESSAGE_MAP()
};
#endif // _ColorButton_h_
--------------------------------------------------------------------------
ColorButton.cpp
#include "stdafx.h"
#include "ColorButton.h"
IMPLEMENT_DYNAMIC(CColorButton, CButton)
BEGIN_MESSAGE_MAP(CColorButton, CButton)
ON_CONTROL_REFLECT(BN_CLICKED, OnClicked)
END_MESSAGE_MAP()
CColorButton::CColorButton()
{
m_check = 0;
}
CColorButton::~CColorButton()
{
}
void CColorButton::OnClicked()
{
if (m_check == 0) m_check = BST_CHECKED;
else m_check = BST_UNCHECKED;
}
// ボタンのオーナー描画
void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
CDC* pDC = CDC::FromHandle(lpDIS->hDC);
CString capt;
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(capt);
// ボタンの描画(背景色、エッジ、キャプション)
if (m_check == BST_CHECKED) color = RGB(255, 0, 0);
else color = RGB(0, 0, 255);
CBrush brush(color);
// チェックされているとき
if (m_check == BST_CHECKED) {
pDC->DrawEdge(btnRect,EDGE_BUMP,BF_RECT);
} else {
pDC->DrawEdge(btnRect,EDGE_RAISED,BF_RECT);
}
pDC->FillRect(btnRect, &brush);
pDC->SetTextColor(RGB(255, 255, 255));
pDC->DrawText(capt, btnRect, DT_CENTER|DT_VCENTER);
// フォーカスを得たときや選択されているとき
if (nState & ODS_FOCUS) {
if (nState & ODS_SELECTED) {
pDC->DrawEdge(btnRect,EDGE_SUNKEN,BF_RECT);
}
pDC->DrawFocusRect(focusRect);
}
else if (nState & ODS_CHECKED) {
pDC->DrawEdge(btnRect,EDGE_BUMP,BF_RECT);
}
}