トップ回答者
スタティックテキストコントロールに表示する文字の色変更について

質問
-
スタティックテキストコントロールに関連付けた
CStatic m_Static_TxtSample
という変数を扱っています。CStatic型ではフォントの色を変えることはできなそうなのでCDCでも使ってみるかと思い、下記のような実験をしてみました。まず、前提条件として(細かいエラー処理などは省略)
CFontDialog CmnFontDlg(&LogFont);
COLORREF ColRef = CmnFontDlg.GetColor();
CmnFontDlg.GetCurrentFont(&LogFont);
m_Font_DlgKURA.CreateFontIndirectW(&LogFont);
というような定義をしたうえで、以下ソースコードです。
CDC *pDC = m_Static_TxtSample.GetDC();
pDC->SetTextColor(ColRef);m_Static_TxtSample.SetFont(&m_Font_Dlg, TRUE);
m_Static_TxtSample.Invalidate(); ・・・(a)とやっているのですが、どうも画面の更新や色の変更が思った通りに行きません。字体そのもの(MS明朝、MSゴシック、その他もろもろ)や、時の大きさ、アンダーラインなどはコモンダイアログのフォント設定ダイアログの設定どおり変わっています。色だけが変わらないということになります。また、このダイアログにはリストコントロールも付いており、そのリストコントロールに関連付けられた変数m_Lc_Testに対して、
m_Lc_Test.SetFont(&m_Font_Dlg);
m_Lc_Test.SetTextColor(ColRef);
とやることで、字体も色も設定が反映されていますので、m_Font_DlgやColRefの中身に問題は無いと思われます。1.CStaticに表示するテキストの色変更はこのやり方ではダメですか?
(a)のようにやってみても引数の設定がTRUE/FALSEによらず、字が重ね書きされていって「書き換え」が行われていませんでしたので、現状は
CRect rect;
m_Static_TxtSample.GetWindowRect(&rect);
ScreenToClient(&rect);
this->InvalidateRect(&rect, TRUE);
というコードを(a)よりも下に追加することで画面の書き換えが行われて、重ね書きは無くなって「字体を変える」目的は実現できていますが、色は相変わらず変わりません。2.(a)の書き方でも文字色の書き換えが行われないのでしょうか?
回答
-
>1.CStaticに表示するテキストの色変更はこのやり方ではダメですか?
ダメです。
まず、pDC->SetTextColorとm_Lc_Test.SetTextColorの違いをAPIの観点から調べてみてください。その後何故思い通りの結果にならないか考察してみてください。
それぞれAPIに置き換えると、以下になります。
pDC->SetTextColor:SetTextColor Function
http://msdn.microsoft.com/en-us/library/dd145093(VS.85).aspx
m_Lc_Test.SetTextColor:LVM_SETTEXTCOLOR Message
http://msdn.microsoft.com/en-us/library/bb761208(VS.85).aspx
また、Windowsの描画の仕組みを理解する必要があります。
[Painting and Drawing]
http://msdn.microsoft.com/en-us/library/dd162759(v=VS.85).aspx
>2.(a)の書き方でも文字色の書き換えが行われないのでしょうか?
行われません。理由は上記から考えてみましょう。
少しでも良いですので、自分なりの理由を導き出してみてください。
MFCでStatic Controlの文字色を変えるには、CWnd::OnCtlColorを利用します。
- 回答としてマーク 山本春海 2011年2月21日 6:03
すべての返信
-
>1.CStaticに表示するテキストの色変更はこのやり方ではダメですか?
ダメです。
まず、pDC->SetTextColorとm_Lc_Test.SetTextColorの違いをAPIの観点から調べてみてください。その後何故思い通りの結果にならないか考察してみてください。
それぞれAPIに置き換えると、以下になります。
pDC->SetTextColor:SetTextColor Function
http://msdn.microsoft.com/en-us/library/dd145093(VS.85).aspx
m_Lc_Test.SetTextColor:LVM_SETTEXTCOLOR Message
http://msdn.microsoft.com/en-us/library/bb761208(VS.85).aspx
また、Windowsの描画の仕組みを理解する必要があります。
[Painting and Drawing]
http://msdn.microsoft.com/en-us/library/dd162759(v=VS.85).aspx
>2.(a)の書き方でも文字色の書き換えが行われないのでしょうか?
行われません。理由は上記から考えてみましょう。
少しでも良いですので、自分なりの理由を導き出してみてください。
MFCでStatic Controlの文字色を変えるには、CWnd::OnCtlColorを利用します。
- 回答としてマーク 山本春海 2011年2月21日 6:03
-
kozzさんありがとうございます。
答えを出すのは時間がかかりそうなので、まずはお礼まで。
>1.CStaticに表示するテキストの色変更はこのやり方ではダメですか?
ダメです。
はい。わかりました。
MFCでStatic Controlの文字色を変えるには、CWnd::OnCtlColorを利用します。
これを使わないとダメということのようですね。
実は、このやりかたは
http://www.g-ishihara.com/mfc_tc_03.htm
で見たことがあって、知っていました。ただ、質問文に載っけたようにリストコントロールではあのようにやってできるので、スタティックテキストでもできるのではないか、と思い実験を始めた次第です。