CStaticの背景透明化

解決


しゅん  2008-05-15 17:31:06  No: 68353  IP: 192.*.*.*

Visual Studio2005でXP/Vistaで開発しています。
# FAQっぽいネタで恐縮です。

レイヤーウィンドウとして作った透明なダイアログの上に、CStaticクラス
を継承した MyStaticクラスを作りダイアログクラス上のコードからMyStatic
クラスに向かって SetWindowText() しています。

背景を透明にする為に、myStaticクラス内にて、

HBRUSH MyStatic::CtlColor(CDC* pDC, UINT nCtlColor)
{
    if( nCtlColor == MY_RESOURCE_ID ){
        pDC->SetBkMode( TRANSPARENT );
    }
    return (HBRUSH)::GetStockObject( NULL_BRUSH );
}

として透明化しています。背景がうまく透明にはなっているのですが
文字列を書き換えると前のテキストが消されず前のテキストの上に
描画されてしまい困っています。

ブラシに色を設定し、ある色で背景色を塗る場合はうまく再描画されて
いるのですが、NULL_BRUSHを返すとうまくテキストが再描画されません。

解決法をご教授願えませんでしょうか。

宜しくお願いいたします。

編集 削除
そだ  2008-05-16 03:07:38  No: 68354  IP: 192.*.*.*

VisualC++6.0に付属してた竜の絵が書いてあるマニュアル以来
初めてMFCの描画試したけど面白いなぁ〜♪

透明なダイアログ(?)でもできるかはわかりませんが
SetWindowTextで文字変えた後にダイアログのInvalidateRectメソッドを
呼ぶことで消えました。
void CtestMFC2Dlg::OnBnClickedButton1()
{
    // TODO: ここにコントロール通知ハンドラ コードを追加します。
    m_Ctl->SetWindowText(_T("1"));
    //m_Ctl->InvalidateRect(NULL, TRUE);
    InvalidateRect(NULL, TRUE);
}
InvalidateRectの対象を変えてみて試してみてわかったけど
どうもSetWindowTextだとダイアログに残像が残るみたいですね。
コメントアウトした
//m_Ctl->InvalidateRect(NULL, TRUE);
じゃ消えなかったので。

編集 削除
しゅん  2008-05-16 23:17:15  No: 68355  IP: 192.*.*.*

そださんのご指摘部分により解決致しました。

有難うございました! m(_ _)m

編集 削除