
お世話になります。
現在開発中のアプリケーションにて行き詰ってしまった箇所が
あったためご質問させていただきました。
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を探す
今、見られている記事はコレ!
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
MFC DrawText 背景色とフォント
-
LineToやMoveToにて描画した線...
-
word
-
テクスチャがうまく表示されな...
-
この二つの違いは・・・?
-
win32api 画面のちらつき
-
VB6,リストボックスの特定行の...
-
GDI+について
-
グラフの交点の求め方(Excel)
-
エクセルで作った新しいウイン...
-
勝手にウィンドウが開いて止ま...
-
マインクラフト(pc版)で座標...
-
検索の画面がでなくなってしま...
-
【VB2008】 マウス操作の一時的...
-
コントロールの書式設定で、“コ...
-
vbaから他のアプリを終了
-
コンボボックス内の文字サイズ変更
-
スピンボタンを右クリックして...
-
CEdit の内容が変わった時にメ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
TextBoxに文字を書いても表示さ...
-
VB6,リストボックスの特定行の...
-
NVIDIAのシェーダーキャッシュ
-
panelのスクロール表示について
-
VC++プログラムをつかったBMP画...
-
VBAにGDI+を参照させる方法
-
google Colabでmatplotlibの描...
-
MFCでOnPaintのタイミング
-
MFCのタイマーのつかい方を教え...
-
UpdateData( FALSE); による文...
-
CStaticコントロールの静的イメ...
-
Form1 Load で実行されない。
-
InvalidateRectの使い方について
-
win32api 画面のちらつき
-
c++ ダブルバッファリング、以...
-
CDC(LineTo)で描画した線を透過...
-
BitBltでの表示での問題です。
おすすめ情報