| オーナードローボタンの作成 |
ここからは実際の描画処理について、下図のようにダイアログと異なる配色を持ったボタンの作成を例として説明する。
// 現在のボタンコントロールの状態を取得 UINT nState = lpDrawItemStruct->itemState;ボタンの状態を取得したら、その状態によって処理を分岐させる必要がある。 ボタンの各状態はフラグとしてnStateに設定されているので、このフラグがONかどうかを調べればよい。 例えばフォーカスがある場合はODS_FOCUSフラグが、 また選択されている(ボタンが押されている)場合はODS_SELECTEDフラグがONになっている。
if( nState & ODS_FOCUS ) {
…… // フォーカスがある場合の処理
}
CRect rect; rect = (CRect)(lpDrawItemStruct->rcItem); // クライアント四角形の取得 CDC *pDC = CDC::FromHandle(lpDrawItemStruct->hDC); // デバイスコンテキストの取得四角形全体を単一色で塗りつぶすにはCDC::FillSolidRect関数が適している。
// 四角形全体を塗りつぶす
pDC->FillSolidRect(&rect, RGB(153,204,204));
// フォーカス四角形の描画
rect.InflateRect(-4, -4); // 四角形を上下に4、左右も4縮小する
if( nState & ODS_FOCUS )
pDC->DrawFocusRect(&rect);
// ボタンの淵の描画。選択されているとき(ボタンが押されている)とそうでないときは描画が異なる
if( nState & ODS_SELECTED ) {
rect.InflateRect(4, 4);
pDC->Draw3dRect(&rect, RGB(0,0,0), RGB(0,0,0));
rect.InflateRect(-1, -1);
pDC->Draw3dRect(&rect, RGB(153,204,204), RGB(153,204,204));
rect.InflateRect(-2, -2, 0, 0); // テキスト描画位置の補正
}
else {
rect.InflateRect(4, 4);
pDC->Draw3dRect(&rect, RGB(255,255,255), RGB(0,0,0));
rect.InflateRect(-1, -1);
pDC->Draw3dRect(&rect, RGB(255,255,255), RGB(0,0,0));
}
CString str; GetWindowText(str); pDC->SetBkMode(TRANSPARENT); pDC->DrawText(str, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); // --> DT_VCENTERを指定する場合は必ずDT_SINGLELINEも指定すること