Visual Studio 2008のMFCでOnPaint()が呼ばれるタイミングですが、
非表示の時など再描画が不要と思われるところで立て続けに
呼ばれているのが気になりました。
そのタイミングはどういう時でしょうか?
といいますのも、ダイアログベースで
OnPaint()の中でダブルッファリングを使用していくつかの処理をまとめて描画をしているのですが、
起動後数分後にCResourceExceptionで落ちてしまっていまして、
最小限の描画回数に済ませればそのようにはならないかと考えた次第です。
※メンバにデバイスコンテキストとCBITAMAPを定義して使用しています。
BitBltするごとにDeleteObjectはしていますが・・・
A 回答 (2件)
- 最新から表示
- 回答順に表示
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 のエラーメッセージにヒントが隠されているかもしれません。
No.2
- 回答日時:
おはようございます。
想像になりますが、とりあえず、OnPaint内にカウンタを置いて、それをディスプレイさせて他のメッセージハンドラが呼ばれたときにカウンタが上がっているかとか、
そういった感じで、探っていくしかないと思います。
後は、いくつかの関連していると思しきメッセージハンドラのログを出力するとかです。
後、一応、グラフィックスオブジェクトの作成と破棄の回数があっているかを確認してみてください。
お探しの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も見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
MFCで画像を表示させているのですが、透過表示する方法がわかりません。
C言語・C++・C#
-
ダイアログ内コントロールの位置取得について
C言語・C++・C#
-
-
4
VC++でコントロールの境界線を描画する方法
C言語・C++・C#
-
5
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
6
VC++プログラムをつかったBMP画像の拡大縮小について
C言語・C++・C#
-
7
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
8
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
9
CStringをwchar_tに変換したい
C言語・C++・C#
-
10
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
11
VC++スレッドの正しい終了のさせかた
C言語・C++・C#
-
12
ビットマップに描画をしてピクチャーコントロールに貼り付けるためには?
C言語・C++・C#
-
13
MFCでbitmapを背景にしてstaticテキストを透過させる方法
C言語・C++・C#
-
14
MFCダイアログボックスを最前面に表示
C言語・C++・C#
-
15
unsigned long long 型のフォーマット指定子
C言語・C++・C#
-
16
リソースエディタでスタティックテキストの文字サイズの変更
C言語・C++・C#
-
17
エディットボックスのフォントを変えたい
C言語・C++・C#
-
18
std::stringからLPCWSTR型への変換
C言語・C++・C#
-
19
MFC - ダイアログボックスのPictureControlへの画像表示
C言語・C++・C#
-
20
ダイアログボックスで指定したサイズどおり表示されない
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
[VB.net] DataGridViewの列ヘッ...
-
PCで「使用可能な場合はグラフ...
-
VB6,リストボックスの特定行の...
-
多角形の描画。(VC++)
-
C++にて、塗りつぶされた円を描...
-
UpdateData( FALSE); による文...
-
word
-
WM_SIZEとWM_SIZINGの違い (Win...
-
ちらつきを何とかしたい
-
CScrollViewの使用方法について
-
タブコントロール上のピクチャ...
-
MFCのタイマーのつかい方を教え...
-
VBAにGDI+を参照させる方法
-
VB.netでのライン描画方法がわ...
-
MFCタブコントロールのグラデー...
-
NVIDIAのシェーダーキャッシュ
-
アプリケーションのデザイン
-
ビューにビットマップファイル...
-
c++ ダブルバッファリング、以...
-
ペーパーマリオみたいにドット...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6,リストボックスの特定行の...
-
[VB.net] DataGridViewの列ヘッ...
-
NVIDIAのシェーダーキャッシュ
-
MFCでOnPaintのタイミング
-
TextBoxに文字を書いても表示さ...
-
word
-
UpdateData( FALSE); による文...
-
VC++プログラムをつかったBMP画...
-
InvalidateRectの使い方について
-
StretchBlt関数について
-
OneNote 2010 文字と描画がずれる
-
C# ラバーバンドの描画を快適に...
-
エクセルでガンチャートを作成...
-
C++にて、塗りつぶされた円を描...
-
VBAにGDI+を参照させる方法
-
MFC DrawText 背景色とフォント
-
GDI+で高速な描画
-
MFCのタイマーのつかい方を教え...
-
Labelの文字をスクロールする際...
-
FlexGridの一部のみ表示を更新...
おすすめ情報