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も見ています
-
とっておきの「夜食」教えて下さい
真夜中に小腹がすいたときにこっそり作るメニュー、こっそり家を抜け出して食べに行くお店… 人には言えない、けど自慢したい、そんなあなたの「とっておきの夜食」を教えて下さい。
-
あなたにとってのゴールデンタイムはいつですか?
一週間の中でもっともテンションが上がる「ゴールデンタイム」はいつですか? その逆で、一週間でもっとも落ち込むタイミングでも構いません。 よかったら教えて下さい!
-
遅刻の「言い訳」選手権
よく遅刻してしまうんです…… 「電車が遅延してしまい遅れました」 「歯医者さんが長引いて、、、」 「病院が混んでいて」 などなどみなさんがこれまで使ってきた遅刻の言い訳がたくさんあるのではないでしょうか?
-
許せない心理テスト
私は「あなたの目の前にケーキがあります。ろうそくは何本刺さっていますか」と言われ「12本」と答えたら「ろうそくの数はあなたが好きな人の数です」と言われ浮気者扱いされたことをいまだに根に持っています。
-
好きな和訳タイトルを教えてください
洋書・洋画の素敵な和訳タイトルをたくさん知りたいです!【例】 『Wuthering Heights』→『嵐が丘』
-
画面を強制的に再描画させる方法
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
CStaticコントロールの静的イメージ描画
C言語・C++・C#
-
8
エディットボックスの入力制限について
C言語・C++・C#
-
9
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
10
UpdateData( FALSE); による文字列データの表示更新(VC++6.0)
C言語・C++・C#
-
11
MFCで画像を表示させているのですが、透過表示する方法がわかりません。
C言語・C++・C#
-
12
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
13
MFC ダイアログ上のID取得について
C言語・C++・C#
-
14
static 文字が上に張り付いて・・・
C言語・C++・C#
-
15
デバッグ中のエラーのことで教えてください。
C言語・C++・C#
-
16
CString から LPCTSTRの型に変換
C言語・C++・C#
-
17
ビットマップを表示させる(MFC)
C言語・C++・C#
-
18
MFCダイアログボックスを最前面に表示
C言語・C++・C#
-
19
CString型 全角半角を意識せずに「1文字」ずつ取り出す
C言語・C++・C#
-
20
ビットマップに描画をしてピクチャーコントロールに貼り付けるためには?
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[VB.net] DataGridViewの列ヘッ...
-
word
-
PCで「使用可能な場合はグラフ...
-
OneNote 2010 文字と描画がずれる
-
TextBoxに文字を書いても表示さ...
-
MFCでOnPaintのタイミング
-
VB6,リストボックスの特定行の...
-
NVIDIAのシェーダーキャッシュ
-
VBAにGDI+を参照させる方法
-
ビットマップを表示させる(MFC)
-
UpdateData( FALSE); による文...
-
フォームにビットマップを表示
-
エクセルでガンチャートを作成...
-
C#のタブコントロールについて...
-
コンボボックスの高さを変えたい
-
c++ ダブルバッファリング、以...
-
CDC(LineTo)で描画した線を透過...
-
MFC FormViewの背景色
-
(C# .Net) ToolStripのボタンの...
-
MFCタブコントロールのグラデー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Minecraft 統合版(PC)の描画距...
-
word
-
TextBoxに文字を書いても表示さ...
-
VB6,リストボックスの特定行の...
-
[VB.net] DataGridViewの列ヘッ...
-
MFCでOnPaintのタイミング
-
NVIDIAのシェーダーキャッシュ
-
C++にて、塗りつぶされた円を描...
-
UpdateData( FALSE); による文...
-
VC++プログラムをつかったBMP画...
-
MFCのタイマーのつかい方を教え...
-
CStaticコントロールの静的イメ...
-
画面全体を再描画させたい
-
OneNote 2010 文字と描画がずれる
-
VBAにGDI+を参照させる方法
-
Labelの文字をスクロールする際...
-
Form1 Load で実行されない。
-
InvalidateRectの使い方について
-
テクスチャに半透明ポリゴンを...
-
Windowのちらつき防止
おすすめ情報