- ベストアンサー
DrawTextでのダイアログへの文字表示について
- Visual Studio2005において、ダイアログベースのアプリケーションでDrawTextを使用して文字を表示する方法について質問です。
- CSampleStaticクラスを作成し、PreSubclassWindow()でタイマーイベントを発生させ、1秒ごとにランダムな値を表示しています。
- ただし、再描画時に前回の表示値が上書きされず、重なってしまいます。解決方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
WM_ERASEBKGNDメッセージのハンドラOnEaseBkgndをオーバーライドして ココで消去するように組めばいいように思います CBrush型のメンバー変数を追加しておいて コンストラクタの中で初期化します CSampleStatic::CSampleStatic() { m_brBack.Create( RGB( 255, 255, 255 ) ); } OnEraseBkgndでクライアント領域を塗りつぶします BOOL CSampleStatic::OnEraseBkgnd(CDC* pDC) { CRect rc; GetClientRect( &rc ); pDC->FillRect( rc, &m_brBack ); return CStatic::OnEraseBkgnd(pDC); } これでInvalidate()を呼んだときに OnEraseBkgndも呼ばれるので 前回描画した領域を背景色で塗りつぶします 外部から背景色をアクセスしたいなら m_brBackを変更できるような GetBKColor/SetBkColorなどをメンバー関数に加えましょう 例 メンバー変数として COLORREF m_bkColor; を追加 COLORREF CSampleStatic::GetBKColor() { return m_bkColor; } void CSampleStatic::SetBKColor( COLORREF col ) { if ( m_brBack.m_hObject ) { m_brBack.DeleteObject(); } m_brBack.Create( col ); } といった具合で ・・・
その他の回答 (1)
- redfox63
- ベストアンサー率71% (1325/1856)
OnPaintだけでもできますけどね ・・・ DrawTextのフラグに DT_CALCRECTを加えれば 引数のRECTに描画する領域を返します ただし 実際の描画はされません その返された RECTを クラス変数などで記憶しておいて 次回の描画の際にはその領域だけ 背景色で塗りつぶすとか この方式の弱点は 2回のDrawTextを実行するといった点です 一度目は DT_CENTER | DT_CALCRECT ... 領域計算 二度目は DT_CENTER ... こちらで実際に描画 になります 前回の回答は背景色でコントロール全体を塗りつぶしています コントロールが大きくなると描画する無駄が生じます また、OnPaintでまいかいFontを作成していますが 頻繁に大きさや太さなどの情報が変化するのでなければ クラス変数にでFontを確保して コンストラクタで初期化、デストラクタで破棄といった具合でもいいと思います OnPaintでわざわざ GetDCを使いDCを取得していますが もともとの CPaintDCを使いたくない理由があるのでしょうか デフォルトの CPaintDCなら デストラクタでDC自体を開放しますので ReleaseDCを使って開放する必要もありません
お礼
ご回答ありがごうございます。 返答が遅くなり、申し訳ございません。 早速、redfox63様のおっしゃるようにコードを入力し、実行してみましたところ、前回の数値にだぶって新しい数値が表示されることはなくなりました。 こういうメッセージがあるのを初めて知りました。 ありがとうございました。