お世話になります。
現在開発中のアプリケーションにて行き詰ってしまった箇所が
あったためご質問させていただきました。
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
です。
No.1ベストアンサー
- 回答日時:
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 );
}
といった具合で ・・・
ご回答ありがごうございます。
返答が遅くなり、申し訳ございません。
早速、redfox63様のおっしゃるようにコードを入力し、実行してみましたところ、前回の数値にだぶって新しい数値が表示されることはなくなりました。
こういうメッセージがあるのを初めて知りました。
ありがとうございました。
No.2
- 回答日時:
OnPaintだけでもできますけどね ・・・
DrawTextのフラグに DT_CALCRECTを加えれば 引数のRECTに描画する領域を返します
ただし 実際の描画はされません
その返された RECTを クラス変数などで記憶しておいて
次回の描画の際にはその領域だけ 背景色で塗りつぶすとか
この方式の弱点は 2回のDrawTextを実行するといった点です
一度目は DT_CENTER | DT_CALCRECT ... 領域計算
二度目は DT_CENTER ... こちらで実際に描画
になります
前回の回答は背景色でコントロール全体を塗りつぶしています
コントロールが大きくなると描画する無駄が生じます
また、OnPaintでまいかいFontを作成していますが
頻繁に大きさや太さなどの情報が変化するのでなければ クラス変数にでFontを確保して
コンストラクタで初期化、デストラクタで破棄といった具合でもいいと思います
OnPaintでわざわざ GetDCを使いDCを取得していますが
もともとの CPaintDCを使いたくない理由があるのでしょうか
デフォルトの CPaintDCなら デストラクタでDC自体を開放しますので
ReleaseDCを使って開放する必要もありません
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# 【C++】IDirect3DSurfaceのディープコピーは可能ですか? 1 2022/07/06 02:47
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- Visual Basic(VBA) VBAにてメール作成した際、一部指定箇所のみ赤文字にしたいです。 下記の内容ですと作成されたメール本 1 2022/04/27 13:31
- その他(データベース) Accessフォームにて指定のフィールドの平均値を小数点第一位で表示できない 2 2022/08/30 17:19
- Excel(エクセル) IF 関数で「〇〇 という文字を含む場合」の分岐処理で表示された数字はSUMで数字集計できますか? 3 2022/08/02 16:29
- その他(プログラミング・Web制作) Pythonを用いたフラッシュ暗算ソフトの開発に必要なもの 2 2023/01/29 02:22
- その他(プログラミング・Web制作) Pythonによる物理の斜方投射の位置座標表示について 2 2023/06/05 12:46
- Excel(エクセル) excelvbaでスライドショーを作りたい 2 2023/04/20 14:32
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- Visual Basic(VBA) エラー処理 3 2022/04/11 14:58
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ローディング画面をマルチスレ...
-
UpdateData( FALSE); による文...
-
OneNote 2010 文字と描画がずれる
-
NVIDIAのシェーダーキャッシュ
-
MFCでOnPaintのタイミング
-
[VB.net] DataGridViewの列ヘッ...
-
C++にて、塗りつぶされた円を描...
-
VB6,リストボックスの特定行の...
-
エクセルでガンチャートを作成...
-
VB6のform Load
-
3Dシミュレータの開発言語
-
MFC DrawText 背景色とフォント
-
Labelの文字をスクロールする際...
-
VBAにGDI+を参照させる方法
-
Form1 Load で実行されない。
-
クライアント領域を再描画させ...
-
Spreadで表全体を選択した場合...
-
プシュボタンのテキストの色を...
-
ウインドウサイズを変更しても...
-
word
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
NVIDIAのシェーダーキャッシュ
-
VB6,リストボックスの特定行の...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
UpdateData( FALSE); による文...
-
TextBoxに文字を書いても表示さ...
-
VC++プログラムをつかったBMP画...
-
MFCでOnPaintのタイミング
-
エクセルでガンチャートを作成...
-
InvalidateRectの使い方について
-
FlexGridの一部のみ表示を更新...
-
VB.NETでPictureBoxへの描画に...
-
MFCのタイマーのつかい方を教え...
-
CStaticコントロールの静的イメ...
-
VBAにGDI+を参照させる方法
-
画面全体を再描画させたい
-
Labelの文字をスクロールする際...
-
Form1 Load で実行されない。
-
panelのスクロール表示について
-
CScrollViewの使用方法について
おすすめ情報