
Visual Studio 2008のMFCでOnPaint()が呼ばれるタイミングですが、
非表示の時など再描画が不要と思われるところで立て続けに
呼ばれているのが気になりました。
そのタイミングはどういう時でしょうか?
といいますのも、ダイアログベースで
OnPaint()の中でダブルッファリングを使用していくつかの処理をまとめて描画をしているのですが、
起動後数分後にCResourceExceptionで落ちてしまっていまして、
最小限の描画回数に済ませればそのようにはならないかと考えた次第です。
※メンバにデバイスコンテキストとCBITAMAPを定義して使用しています。
BitBltするごとにDeleteObjectはしていますが・・・
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
おはようございます。
想像になりますが、とりあえず、OnPaint内にカウンタを置いて、それをディスプレイさせて他のメッセージハンドラが呼ばれたときにカウンタが上がっているかとか、
そういった感じで、探っていくしかないと思います。
後は、いくつかの関連していると思しきメッセージハンドラのログを出力するとかです。
後、一応、グラフィックスオブジェクトの作成と破棄の回数があっているかを確認してみてください。
No.1
- 回答日時:
Windows プログラミングとか MFC とか余り触らないので想像ですが。
OnPaint が呼ばれるのはウィンドウに WM_PAINT メッセージが送られた時で、WM_PAINT が呼ばれるのは、ウィンドウの隠れていた部分が表に出てきた時や、そのウィンドウに対して Invalidate が呼ばれた時と思います。そして Invalidate を明示的に呼び出すのは、ウィンドウをリサイズした時だとか、ウィンドウの内容を変更して表示内容を更新したい時です。非表示でも、裏で何かを更新した時に Invalidate が呼び出されているのではないでしょうか。(でも非表示の場合に Invalidate が呼び出されたら即座に OnPaint が呼び出されるかは疑問ですね…)
> 起動後数分後にCResourceExceptionで落ちてしまっていまして、
いくら再描画を何度もしても、正しく実装していれば例外で落ちるという事はないと思うのですが…。もし、描画回数を最小限に抑える事ができたとしても、プログラムの寿命が多少伸びるだけで、遅かれ早かれやはり落ちるのではないでしょうか。
多分、何かをミスしているんだと思いますが、質問文だけの情報では何とも言えません。
> BitBltするごとにDeleteObjectはしていますが・・・
うーん。例えば、
* DeleteObject の順番を誤っていないか?
例えば、別のオブジェクトが自分のハンドルを保持している場合、自分を削除するより先に、そのオブジェクトを削除しなければならないと思います。
* DeleteObject してはいけない物まで DeleteObject していないか?
例えば CreateCompatibleDC でデバイスコンテキストを作った場合、そこに元から設定されている既定のブラシや既定のビットマップは勝手に DeleteObject してはいけないのではないでしょうか。親の DC を DeleteObject/DeleteDC する時に、それらも処理されるからです。
* CreateCompatibleDC で作った DC を DeleteObject する前に、SelectObject で既定のブラシなどに戻しているか?
後、CResourceException のエラーメッセージにヒントが隠されているかもしれません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
-
4
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
5
エディットボックスのフォントを変えたい
C言語・C++・C#
-
6
CStaticコントロールの静的イメージ描画
C言語・C++・C#
-
7
ボタンの配置を変更したい
C言語・C++・C#
-
8
CStringの文字列検索&抜き出しについて
C言語・C++・C#
-
9
CEdit の内容が変わった時にメッセージを表示させたい
C言語・C++・C#
-
10
起動時に何のダイアログも表示されない
C言語・C++・C#
-
11
エディットコントロールのイベントハンドラ
Microsoft ASP
-
12
ラベル(スタティックテキスト)内での改行。
C言語・C++・C#
-
13
OnDrawが呼び出されません
C言語・C++・C#
-
14
MFC ダイアログ上のID取得について
C言語・C++・C#
-
15
EDITコントロールで入力できる文字を制限するには?
C言語・C++・C#
-
16
static 文字が上に張り付いて・・・
C言語・C++・C#
-
17
ダイアログ内コントロールの位置取得について
C言語・C++・C#
-
18
MFCでコンボボックスを選択不可状態にしたい
C言語・C++・C#
-
19
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
20
エディットコントロールの色の変更方法
C言語・C++・C#
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
隣の枝がはみ出してきたら切ってもいい?最もやってはいけないことは?
「隣の木が越境してきて困るが、勝手に切ってはいけないと聞くし…」そう思っている方も多いだろう。実は、2023年4月1日に民法が改正され、この「越境枝」のルールが大きく変わった。 教えて!gooでも「境界から出て...
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB.netでのライン描画方法がわ...
-
この二つの違いは・・・?
-
CStaticコントロールの静的イメ...
-
TextBoxに文字を書いても表示さ...
-
Minecraft 統合版(PC)の描画距...
-
StretchBlt関数について
-
VB6,リストボックスの特定行の...
-
ちらつきを何とかしたい
-
OpenGLとDirectXの違いについて
-
GDI+について
-
Androidのスマホについての質問...
-
word
-
「アイテムは収集されました」...
-
検索の画面がでなくなってしま...
-
VBAのフォント変更(エクセルか...
-
コントロールの書式設定で、“コ...
-
エクセルのコントロールツール...
-
フォームでPDFを表示させた...
-
occmgr.cppの行410で特定のエラー
-
勝手にウィンドウが開いて止ま...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
google Colabでmatplotlibの描...
-
panelのスクロール表示について
-
VB.netでのライン描画方法がわ...
-
VB6,リストボックスの特定行の...
-
UpdateData( FALSE); による文...
-
TextBoxに文字を書いても表示さ...
-
CStaticコントロールの静的イメ...
-
VBAにGDI+を参照させる方法
-
MFCでOnPaintのタイミング
-
InvalidateRectの使い方について
-
VC++プログラムをつかったBMP画...
-
GetGlyphOutline() ご利用経験...
-
NVIDIAのシェーダーキャッシュ
-
Form1 Load で実行されない。
-
FlexGridの一部のみ表示を更新...
-
C#のタブコントロールについて...
-
WM_SIZEとWM_SIZINGの違い (Win...
おすすめ情報