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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルマクロでアニメを作る方法を教えてください。 1 2023/02/07 14:27
- デザイン タブレットパソコンについて。 3 2022/10/22 15:19
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- CAD・DTP 「機能ブロック図」の描画用フリーソフトを教えてください 1 2022/09/23 16:12
- au(KDDI) 特定の画面を見るとスマホが固まります ご覧頂き有難うございます。 特定のページを見るとスマホが固まり 1 2023/08/21 19:29
- Windows 10 パソコンの起動時、画面が黒いままのトラブルにつきまして。 4 2022/10/02 18:02
- Windows 8 Route Generator の使い方 1 2023/05/03 00:36
- その他(音楽・ダンス・舞台芸能) 手描き動画の楽曲使用について 2 2023/02/11 00:59
- ビデオカード・サウンドカード PCに接続したイヤフォンのマイクが使えません。 3 2022/10/22 11:07
- 歴史学 倭寇について教えてください 1 2023/07/15 20:46
このQ&Aを見た人はこんなQ&Aも見ています
-
【お題】NEW演歌
【大喜利】 若い人に向けたことは分かるけど、それはちょっと寄せ過ぎて変になってないか?と思った演歌の歌詞
-
人生最悪の忘れ物
今までの人生での「最悪の忘れ物」を教えてください。 私の「最悪の忘れ物」は「財布」です。
-
【お題】引っかけ問題(締め切り10月27日(日)23時)
【大喜利】 「日本で一番高い山は富士山……ですが!」から始まった、それは当てられるわけ無いだろ!と思ったクイズの問題
-
あなたは何にトキメキますか?
「きゅんとした〜♪」 と思う瞬間ってありますよね。 それは恋愛だったり、推し活だったり、映画のワンシーンだったり……。
-
好きな「お肉」は?
牛肉、豚肉、鶏肉、ラム肉、クマやシカの狩猟肉……。 いろ〜んな肉が食べられるようになりましたよね。 あなたがこれまで食べて「これはうまい!」とか「なんじゃこりゃ!」と好きになったお肉を教えてください。
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
リソースエディタでスタティックテキストの文字サイズの変更
C言語・C++・C#
-
-
4
ダイアログ内コントロールの位置取得について
C言語・C++・C#
-
5
VC++でコントロールの境界線を描画する方法
C言語・C++・C#
-
6
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
7
エディットボックスの入力制限について
C言語・C++・C#
-
8
UpdateData( FALSE); による文字列データの表示更新(VC++6.0)
C言語・C++・C#
-
9
CStaticコントロールの静的イメージ描画
C言語・C++・C#
-
10
MFCで画像を表示させているのですが、透過表示する方法がわかりません。
C言語・C++・C#
-
11
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
12
MFC ダイアログ上のID取得について
C言語・C++・C#
-
13
メッセージハンドラ
C言語・C++・C#
-
14
デバッグ中のエラーのことで教えてください。
C言語・C++・C#
-
15
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
-
16
static 文字が上に張り付いて・・・
C言語・C++・C#
-
17
CString から LPCTSTRの型に変換
C言語・C++・C#
-
18
MFCダイアログボックスを最前面に表示
C言語・C++・C#
-
19
ビットマップを表示させる(MFC)
C言語・C++・C#
-
20
ビットマップに描画をしてピクチャーコントロールに貼り付けるためには?
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・ハマっている「お菓子」を教えて!
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
TextBoxに文字を書いても表示さ...
-
Minecraft 統合版(PC)の描画距...
-
WM_SIZEとWM_SIZINGの違い (Win...
-
CDC(LineTo)で描画した線を透過...
-
テキストボックス 自動スクロ...
-
NVIDIAのシェーダーキャッシュ
-
[VB.net] DataGridViewの列ヘッ...
-
スピードの速い描画
-
エクセルでガンチャートを作成...
-
win32api 画面のちらつき
-
google Colabでmatplotlibの描...
-
VC++プログラムをつかったBMP画...
-
CreateFontで回転させて印刷出...
-
VB.netでのライン描画方法がわ...
-
プシュボタンのテキストの色を...
-
ボタン形のラベル
-
ウインドウ描画のタイミングの...
-
GDI+で高速な描画
-
C++にて、塗りつぶされた円を描...
-
word
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
word
-
TextBoxに文字を書いても表示さ...
-
VB6,リストボックスの特定行の...
-
[VB.net] DataGridViewの列ヘッ...
-
NVIDIAのシェーダーキャッシュ
-
MFCでOnPaintのタイミング
-
C++にて、塗りつぶされた円を描...
-
UpdateData( FALSE); による文...
-
VC++プログラムをつかったBMP画...
-
MFCのタイマーのつかい方を教え...
-
CStaticコントロールの静的イメ...
-
画面全体を再描画させたい
-
OneNote 2010 文字と描画がずれる
-
VBAにGDI+を参照させる方法
-
Labelの文字をスクロールする際...
-
Form1 Load で実行されない。
-
InvalidateRectの使い方について
-
テクスチャに半透明ポリゴンを...
-
Windowのちらつき防止
おすすめ情報