スタティックテキストの背景色

[戻る]
AA 2004/07/23(金) 11:28:13
こんにちは。
初心者です。宜しくお願い致します。

ボタン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を使用しています。

どなたか、ご指導頂けませんか?

YOU 2004/07/23(金) 13:32:22
ボタンをクリックしたときの処理でフラグをセットしておいて

OnCtrlColorの中でそのフラグと
pWnd->GetDlgCtrlID()
で取得できるIDで判断するといいと思います。

スタティックテキストのIDをIDC_STATICから変更するのも忘れずに。

dairygoods 2004/07/24(土) 11:22:21
背景色を保持する変数を二つ用意してください。

ところで、
>   return :: CreateSolidBrush(m_color);
このように作りっぱなしのブラシを返すと、リソースリークします。

参考:
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200206/02060102.txt

AA 2004/07/29(木) 13:32:44
連絡が遅くなり、申し訳ありませんでした。
YOUさん、dairygoodsさん、ご助言ありがとうございます。
おかげで、うまく背景色を変更することができました。

しかし、dairygoodsさんからご指摘いただきました
リソースリークの件が解決できたのか、
自分でよくわかりません。

最後の行の "return hbr" の前に
DeleteObject( hbr );
を入れてみました。
問題なく実行はできたのですが、
これで解決できているのでしょうか?
かなりの初心者なもので、確認の仕方がわかりませんでした・・・。

宜しくお願い致します。

あいる 2004/07/29(木) 14:07:57
> 最後の行の "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 する

でしょうかねぇ〜
# 人それぞれやりかたがあると思いますが・・・

あいる 2004/07/29(木) 14:11:58
と、書いた後にスレを読み返すと・・・
dairygoods さんが書かれたレスの参考先でちゃんと説明されていますねぇ・・・

# きつい言い方かもですが、その参考先を見る限りは
# return 文の前で DeleteObject にはならないかと・・・

古いスレッドには追加発言できません。