|
選択されている写真を表す為にその写真に付随する情報表示の色を変えたりしてみたい。 どうしたいかと言うと、 →
と、いう風にしたい。 これをやる為には、実際に色を変えたいコントロールの親で WM_CTLCOLOR を捕まえてやる必要が有る。 WM_CTLCOLORを捕まえると、OnCtlColor というイベント関数が追加されるので、そこで与えられたpDCで設定する 例えば、上の例で 日付が出ているコントロールを m_StcFilename、コメントのエディットコントロールをm_EdtPicComment とすると、
HBRUSH EMainDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
pDC->SetBkMode( TRANSPARENT );
if( m_SelectedPic == NULL )
return hbr;
if( nCtlColor == CTLCOLOR_STATIC || nCtlColor == CTLCOLOR_EDIT ){
if( ( pWnd == &m_StcFilename || pWnd == &m_EdtPicComment ) && m_SelectedPic )
pDC->SetTextColor( RGB( 0, 0, 255 ) );
}
}
こんな具合で実装する。 SetBkMode は、バックグラウンドを塗りつぶしてからテキストを書くか、塗りつぶさずに書くかの差。 構造の意味としては、来たメッセージがハンドリングしているコントロールがStaticかEditの時に、もし、今描こうとしているウィンドウがm_StcFilenameかm_EdtPicCommentで、かつ、その写真が選択状態ならばテキストの色を変える、という事です。 変更出来るコントロールは CTLCOLOR_BTN ボタン コントロール CTLCOLOR_DLG ダイアログ ボックス CTLCOLOR_EDIT エディット コントロール CTLCOLOR_LISTBOX リスト ボックス コントロール CTLCOLOR_MSGBOX メッセージ ボックス CTLCOLOR_SCROLLBAR スクロール バー コントロール CTLCOLOR_STATIC 静的コントロール という感じ。おや、ツリーコントロール無いんだ・・・。 |
|
|
|
ちなみに、例えばスタティック領域を全て塗りつぶしたい!という時はこの関数を使わないでも出来ます。 その場合は、塗りつぶしたいコントロールの親ウィンドウの OnPaint で行います。 CDC* hdc; PAINTSTRUCT ps; CRect rct; hdc = m_StcFilename.BeginPaint( &ps ); m_StcFilename.GetWindowRect( &rct ); hdc->FillSolidRect( 0, 0, rct.Width(), rct.Height(), RGB( 255, 0, 0 ) ); EndPaint( &ps ); と、書くと、m_StcFilename コントロールは赤色で塗りつぶされます。 今回の前半のサンプルはここからダウンロードして下さい。 後半の塗りつぶしの方のサンプルは次回の六十二話で。 |