コンボボックスがDISABLEの時の文字色の変更 – プログラミング – Home

コンボボックスがDISABLEの時の文...
 
通知
すべてクリア

コンボボックスがDISABLEの時の文字色の変更


はんず
 はんず
(@はんず)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

コンボボックスのスタイルをドロップダウンリストで使用しています。
このコンボボックスをDISABLEの状態にした時に、コンボボックスの
エディットコントロール部分の文字をグレーではなく黒で表示したいと思っています。

とりあえず、WM_CTLCOLORをオーバーライドして、OnCtlColorで、SetTextColor()を試し
てみましたが駄目でした。

なにかいい方法を知っている方、教えてください。

環境
・VC++ Ver6.0
・MFC
・WinXP


引用解決済
トピックタグ
たみあ
 たみあ
(@たみあ)
ゲスト
結合: 22年前
投稿: 57
 

Disable時は、WM_CTLCOLORSTATIC だったと思います


返信引用
はんず
 はんず
(@はんず)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

たみあさん、返信ありがとうございます。

WM_CTLCOLORSTATICなのですが、クラスウィザードではそのようなメッセージは
表示されていませんでした。

ですので、PreTranslateMessage()で捕まえられるかな?と思って試してみたのですが、
まったくWM_CTLCOLORSTATICをメッセージを捕まえることができませんでした。

申し訳ありませんが、WM_CTLCOLORSTATICはどのように
捕まえればよろしいのでしょうか?


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

HBRUSH CxxDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if ( CTLCOLOR_STATIC == nCtlColor ) {...}

こうですね。


返信引用
はんず
 はんず
(@はんず)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

nさんの通りしてみましたが、
コンボボックスをドロップダウンにするとうまくいくのですが、
ドロップダウンリストでは文字色が変更されませんでした。

どうしても、ドロップダウンリストでコンボボックスを使用したいのですが、
他に何かいい方法はありますでしょうか?


返信引用
たみあ
 たみあ
(@たみあ)
ゲスト
結合: 22年前
投稿: 57
 

ドロップダウンリストのリスト部分とテキスト部分でなにか処理が違ってたかな。。。
リスト部分の文字の色も変わりませんでした?


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

試してみたところ...
「ドロップダウンリスト」スタイルを持つ無効状態のコンボボックスでは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;
}


返信引用
はんず
 はんず
(@はんず)
ゲスト
結合: 22年前
投稿: 7
Topic starter  

nさん、たみあさん、おかげさまで文字色の変更ができるようになりました。

ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました