// SampleProjectDialog.h
#pragma once
class CSampleProjectDialog :
public CAppStdDialogImpl<CSampleProjectDialog>,
public CUpdateUI<CSampleProjectDialog>,
public CMessageFilter, public CIdleHandler,
public COwnerDraw<CSampleProjectDialog>
{
public:
DECLARE_APP_DLG_CLASS(NULL, IDR_MAINFRAME, L"Software\\WTL")
enum { IDD = IDD_MAINDLG };
virtual BOOL PreTranslateMessage(MSG* pMsg){
return CWindow::IsDialogMessage(pMsg);
}
virtual BOOL OnIdle(){
return FALSE;
}
BEGIN_UPDATE_UI_MAP(CSampleProjectDialog)
END_UPDATE_UI_MAP()
BEGIN_MSG_MAP(CSampleProjectDialog)
MSG_WM_INITDIALOG(OnInitDialog)
MSG_WM_DESTROY(OnDestroy)
CHAIN_MSG_MAP(CUpdateUI<CSampleProjectDialog>)
CHAIN_MSG_MAP(CAppStdDialogImpl<CSampleProjectDialog>)
CHAIN_MSG_MAP(COwnerDraw<CSampleProjectDialog>) // 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();
// ボタン描画
CPen pen;
CBrush brushBg;
if(lpdis->itemState & ODS_SELECTED){
pen.CreatePen(PS_SOLID, 4, RGB(0, 0, 0));
brushBg.CreateSolidBrush(RGB(0, 0, 0));
}else if(lpdis->itemState & ODS_FOCUS){
pen.CreatePen(PS_SOLID, 4, RGB(0, 0, 0));
brushBg.CreateSolidBrush(clrBg);
}else{
pen.CreatePen(PS_SOLID, 2, RGB(0, 0, 0));
brushBg.CreateSolidBrush(clrBg);
}
HPEN hOldPen = dc.SelectPen(pen);
HBRUSH hOldBrush = dc.SelectBrush(brushBg);
dc.Rectangle(&lpdis->rcItem);
dc.SelectBrush(hOldBrush);
dc.SelectPen(hOldPen);
// キャプション描画
dc.SetTextColor(clrText);
dc.SetBkMode(TRANSPARENT);
dc.DrawText(_T("オーナードローボタン"), -1,
&lpdis->rcItem, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
dc.RestoreDC(-1);
}
BOOL OnInitDialog(CWindow wndFocus, LPARAM lInitParam){
AtlCreateEmptyMenuBar(m_hWnd);
// メッセージループにメッセージフィルタとアイドルハンドラを追加
CMessageLoop* pLoop = _Module.GetMessageLoop();
pLoop->AddMessageFilter(this);
pLoop->AddIdleHandler(this);
SetMsgHandled(false);
return TRUE;
}
void OnDestroy(){
// メッセージループからメッセージフィルタとアイドルハンドラを削除
CMessageLoop* pLoop = _Module.GetMessageLoop();
pLoop->RemoveMessageFilter(this);
pLoop->RemoveIdleHandler(this);
}
};
|