// MainDlg.h
#pragma once
class CMainDlg : public CDialogImpl<CMainDlg>, public COwnerDraw<CMainDlg>
{
public:
enum { IDD = IDD_MAINDLG };
BEGIN_MSG_MAP(CMainDlg)
MSG_WM_INITDIALOG(OnInitDialog)
COMMAND_ID_HANDLER_EX(IDOK, OnOK)
COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel)
CHAIN_MSG_MAP(COwnerDraw<CMainDlg>) // COwnerDrawへチェイン
END_MSG_MAP()
void DrawItem(LPDRAWITEMSTRUCT lpdis){
if(lpdis->CtlType == ODT_BUTTON){
switch(lpdis->CtlID){
case IDC_BUTTON_BLUE:
DrawButton(lpdis, RGB(255, 255, 255), RGB(0, 0, 255));
break;
case IDC_BUTTON_RED:
DrawButton(lpdis, RGB(255, 255, 255), RGB(255, 0, 0));
break;
default:
break;
}
}
}
void DrawButton(LPDRAWITEMSTRUCT lpdis, COLORREF clrText, COLORREF clrBg){
CDCHandle dc = lpdis->hDC;
dc.SaveDC();
// キャプション表示領域を初期化
CRect rcCaptionArea = lpdis->rcItem;
rcCaptionArea.OffsetRect(0, -1);
// 背景色描画
CBrush brushBg;
brushBg.CreateSolidBrush(clrBg);
dc.FillRect(&lpdis->rcItem, brushBg);
// 3D縁描画
if(lpdis->itemState & ODS_SELECTED){
dc.DrawEdge(&lpdis->rcItem, EDGE_SUNKEN, BF_RECT);
// キャプション矩形調整
rcCaptionArea.OffsetRect(1, 1);
}else{
dc.DrawEdge(&lpdis->rcItem, EDGE_RAISED, BF_RECT);
}
// フォーカス矩形描画
if(lpdis->itemState & ODS_FOCUS){
CRect rcFocus = lpdis->rcItem;
rcFocus.DeflateRect(4, 4);
dc.DrawFocusRect(rcFocus);
}
// キャプション描画
dc.SetTextColor(clrText);
dc.SetBkMode(TRANSPARENT);
dc.DrawText(_T("オーナードローボタン"), -1,
rcCaptionArea, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
dc.RestoreDC(-1);
}
BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam){
// スクリーンの中央に配置
CenterWindow();
// 大きいアイコン設定
HICON hIcon = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,
::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON));
SetIcon(hIcon, TRUE);
// 小さいアイコン設定
HICON hIconSmall = AtlLoadIconImage(IDR_MAINFRAME, LR_DEFAULTCOLOR,
::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON));
SetIcon(hIconSmall, FALSE);
return TRUE;
}
void OnOK(UINT uNotifyCode, int nID, CWindow wndCtl){
EndDialog(nID);
}
void OnCancel(UINT uNotifyCode, int nID, CWindow wndCtl){
EndDialog(nID);
}
};
|