アプリ版:「スタンプのみでお礼する」機能のリリースについて

お世話になります。
現在開発中のアプリケーションにて行き詰ってしまった箇所が
あったためご質問させていただきました。

Visual Studio2005にてダイアログベースのアプリケーションを作成しており、オリジナルのCStatic派生のクラスCSampleStaticクラスを作成します。
このCSampleStaticクラスはメインダイアログでのサブクラスにした際に
PreSubclassWindow()
ないでタイマーイベントを発生させます。タイマーイベントの内容は1秒ごとにタイマーを呼び、ランダムの値をそのCStaticの値に代入し、ダイアログ上に表示させる動作をします。
その際の処理のプログラムは以下のように作成しています

CString str;//メンバー変数
//メインダイアログにてサブクラス化した際に呼ばれる
CSampleStatic::PreSubclassWindow()
{
SetTimer(1,1000,NULL);//1秒毎に
}

CSampleStatic::OnTimer(UINT_PTR nIDEvent)
{
str.Format(_T("%d"),rand()%200); //1~199の乱数をstrに代入
 Invalidate();           //OnPaint()を呼ぶ
 CStatic::OnTimer(nIDEvent);
}

CSampleStatic::OnPaint()
{
CPaintDC dc(this);
CFont MyFont;
MyFont.CreateFont(-----); //フォント設定
CDC* myDC = GetDC();
CRect Myrect;
GetClientRect(&Myrect);
myDC->SelectObject(&Myrect);
myDC->DrawText(str,-1,&Myrect,DT_CENTER); //strを表示
ReleaseDC(myDC);
MyFont.DeleteObject();
}
というプログラムを作成しているのですが、この方法でのダイアログへの文字の表示では、たとえば90が表示され、次に100が表示されるのであればいいのですが、100のあとに90が表示された時に100の上にそのまま90が表示されてしまい、うまく表示できません。

再描画のときに、上書きではなく、前回の数値を消去してから新たな数値を表示できればいいとは思うのですが、やり方がわからず、ご意見をいただければと思い質問させていただきました。

どうか宜しくお願いいたします。

開発環境は
Windows CE 6.0
Visual Studio 2005
です。

A 回答 (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 );
}
といった具合で ・・・
    • good
    • 0
この回答へのお礼

ご回答ありがごうございます。
返答が遅くなり、申し訳ございません。
早速、redfox63様のおっしゃるようにコードを入力し、実行してみましたところ、前回の数値にだぶって新しい数値が表示されることはなくなりました。
こういうメッセージがあるのを初めて知りました。
ありがとうございました。

お礼日時:2009/06/09 19:09

OnPaintだけでもできますけどね ・・・



DrawTextのフラグに DT_CALCRECTを加えれば 引数のRECTに描画する領域を返します
ただし 実際の描画はされません
その返された RECTを クラス変数などで記憶しておいて
次回の描画の際にはその領域だけ 背景色で塗りつぶすとか

この方式の弱点は 2回のDrawTextを実行するといった点です
一度目は DT_CENTER | DT_CALCRECT ... 領域計算
二度目は DT_CENTER ... こちらで実際に描画
になります

前回の回答は背景色でコントロール全体を塗りつぶしています
コントロールが大きくなると描画する無駄が生じます

また、OnPaintでまいかいFontを作成していますが
頻繁に大きさや太さなどの情報が変化するのでなければ クラス変数にでFontを確保して
コンストラクタで初期化、デストラクタで破棄といった具合でもいいと思います

OnPaintでわざわざ GetDCを使いDCを取得していますが
もともとの CPaintDCを使いたくない理由があるのでしょうか
デフォルトの CPaintDCなら デストラクタでDC自体を開放しますので
ReleaseDCを使って開放する必要もありません
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!