antenn-a
company profile

MFC航海日記 六十一日目(簡単にコントロールの文字色や背景色を変える)


選択されている写真を表す為にその写真に付随する情報表示の色を変えたりしてみたい。
どうしたいかと言うと、

と、いう風にしたい。
これをやる為には、実際に色を変えたいコントロールの親で 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 静的コントロール

という感じ。おや、ツリーコントロール無いんだ・・・。

prev


ちなみに、例えばスタティック領域を全て塗りつぶしたい!という時はこの関数を使わないでも出来ます。
その場合は、塗りつぶしたいコントロールの親ウィンドウの 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 コントロールは赤色で塗りつぶされます。
今回の前半のサンプルはここからダウンロードして下さい。
後半の塗りつぶしの方のサンプルは次回の六十二話で。


antenn-a

prev next


antenn-a