コンボボックスのスタイルをドロップダウンリストで使用しています。
このコンボボックスをDISABLEの状態にした時に、コンボボックスの
エディットコントロール部分の文字をグレーではなく黒で表示したいと思っています。
とりあえず、WM_CTLCOLORをオーバーライドして、OnCtlColorで、SetTextColor()を試し
てみましたが駄目でした。
なにかいい方法を知っている方、教えてください。
環境
・VC++ Ver6.0
・MFC
・WinXP
Disable時は、WM_CTLCOLORSTATIC だったと思います
たみあさん、返信ありがとうございます。
WM_CTLCOLORSTATICなのですが、クラスウィザードではそのようなメッセージは
表示されていませんでした。
ですので、PreTranslateMessage()で捕まえられるかな?と思って試してみたのですが、
まったくWM_CTLCOLORSTATICをメッセージを捕まえることができませんでした。
申し訳ありませんが、WM_CTLCOLORSTATICはどのように
捕まえればよろしいのでしょうか?
HBRUSH CxxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if ( CTLCOLOR_STATIC == nCtlColor ) {...}
こうですね。
nさんの通りしてみましたが、
コンボボックスをドロップダウンにするとうまくいくのですが、
ドロップダウンリストでは文字色が変更されませんでした。
どうしても、ドロップダウンリストでコンボボックスを使用したいのですが、
他に何かいい方法はありますでしょうか?
ドロップダウンリストのリスト部分とテキスト部分でなにか処理が違ってたかな。。。
リスト部分の文字の色も変わりませんでした?
試してみたところ...
「ドロップダウンリスト」スタイルを持つ無効状態のコンボボックスではOnCtlColor()
が2度
呼ばれた後にWindowsが勝手に文字色を変えて描画するので、OnCtlColor()中にDCをいじ
っても
無効状態の文字色は変えられないみたいです。というわけで以下のようにすると一応で
きます。
(ちなみに「ドロップダウン」スタイルを持つ無効状態のコンボボックスでは
OnCtlColor()は
3度呼ばれ、文字描画位置も微妙に異なるため、このコードではきちんと動きません)
HBRUSH CxxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
int id = pWnd->GetDlgCtrlID();
if ( /*コンボのID*/==id && CTLCOLOR_STATIC==nCtlColor )
{
//2回毎に独自メッセージハンドラを呼ばせてそこで描く。
const int n = 2;
static int i;
if ( n-1 <= i )
{
PostMessage( WM_APP, 0, id );
i = 0;
}
else ++i;
}
return hbr;
}
//独自メッセージハンドラの作り方は「MFCテクニカルノート6:メッセージマップ」の
//「ユーザー定義の Windows メッセージ」を参照。
LONG CxxDlg::OnApp( UINT, LONG id )
{
CWnd* pWnd = GetDlgItem( id );
CClientDC dc( pWnd );
dc.SaveDC();
dc.SetBkMode( TRANSPARENT );
::SelectObject( dc.GetSafeHdc(), ::GetStockObject( DEFAULT_GUI_FONT ) );
CRect r;
pWnd->GetClientRect( &r );
int cx = ::GetSystemMetrics( SM_CXHSCROLL );//コンボのボタン幅
dc.IntersectClipRect( 3, 3, r.right-cx-3, r.bottom-3 );//はみ出ないようにクリ
ッピング
dc.TextOut( 4, 4, /*コンボの文字列*/ );
//↑ここらへんの3だの4だのいう数値には根拠ないです。
//「スタティック境界線」等にチェックを入れると破綻します。
dc.RestoreDC( -1 );
return 1;
}
nさん、たみあさん、おかげさまで文字色の変更ができるようになりました。
ありがとうございました。