こんにちは。
初心者です。宜しくお願い致します。
ボタン1を押したら、スタティックテキスト1の背景色を変更、
ボタン2を押したら、スタティックテキスト2の背景色を変更
としたいのです。
一旦、どちらかのスタティックテキストの背景色を変更した後に、
他のアプリケーションが立ち上がり、ウインドウが隠れてしまったら
その後の再描画(?)で、すべてのスタティックテキストに色がついてしまいます。
どのように修正したらいいのでしょうか?
void CColorDlg::OnButton1()
{
m_color = RGB(255,255,0);
m_st_1.RedrawWindow();
}
void CColorDlg::OnButton2()
{
m_color = RGB(255,255,0);
m_st_2.RedrawWindow();
}
HBRUSH CColorDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(nCtlColor == CTLCOLOR_STATIC ){
pDC->SetBkMode(TRANSPARENT);
return :: CreateSolidBrush(m_color);
}
return hbr;
}
VC++6.0, MFC, Win2000を使用しています。
どなたか、ご指導頂けませんか?
ボタンをクリックしたときの処理でフラグをセットしておいて
OnCtrlColorの中でそのフラグと
pWnd->GetDlgCtrlID()
で取得できるIDで判断するといいと思います。
スタティックテキストのIDをIDC_STATICから変更するのも忘れずに。
背景色を保持する変数を二つ用意してください。
ところで、
> return :: CreateSolidBrush(m_color);
このように作りっぱなしのブラシを返すと、リソースリークします。
参考:
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200206/02060102.txt
連絡が遅くなり、申し訳ありませんでした。
YOUさん、dairygoodsさん、ご助言ありがとうございます。
おかげで、うまく背景色を変更することができました。
しかし、dairygoodsさんからご指摘いただきました
リソースリークの件が解決できたのか、
自分でよくわかりません。
最後の行の return hbr の前に
DeleteObject( hbr );
を入れてみました。
問題なく実行はできたのですが、
これで解決できているのでしょうか?
かなりの初心者なもので、確認の仕方がわかりませんでした・・・。
宜しくお願い致します。
> 最後の行の return hbr の前に
> DeleteObject( hbr );
> を入れてみました。
これだと、return で返されるhbrが不定なっちゃう??
私なら・・・
1、メンバーに HBRUSH の m_hColorBrush を用意する。
2、コンストラクタなりで、デフォルトの m_hColorBrush を作成、
もしくはNULLにする
3、m_color の値が変わるタイミングで、m_hColorBrush を作成、
もしくは再作成する
再作成時は DeleteObject してから作成する
4、OnCtlColor で条件にマッチしたとき m_hColorBrush を返す
m_hColorBrush がNULLのときは、OnCtlColorに任せる
5、デストラクタなりで m_hColorBrush が作成されていたら DeleteObject する
でしょうかねぇ~
# 人それぞれやりかたがあると思いますが・・・
と、書いた後にスレを読み返すと・・・
dairygoods さんが書かれたレスの参考先でちゃんと説明されていますねぇ・・・
# きつい言い方かもですが、その参考先を見る限りは
# return 文の前で DeleteObject にはならないかと・・・