![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
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も見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
VC++でコントロールの境界線を描画する方法
C言語・C++・C#
-
-
4
VC++プログラムをつかったBMP画像の拡大縮小について
C言語・C++・C#
-
5
MFCで画像を表示させているのですが、透過表示する方法がわかりません。
C言語・C++・C#
-
6
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
7
OnPaintとOnDraw関数の違いについて
C言語・C++・C#
-
8
リソースエディタでスタティックテキストの文字サイズの変更
C言語・C++・C#
-
9
ビットマップに描画をしてピクチャーコントロールに貼り付けるためには?
C言語・C++・C#
-
10
ダイアログ内コントロールの位置取得について
C言語・C++・C#
-
11
DWORDの実際の型は何でしょうか
C言語・C++・C#
-
12
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
13
エディットボックスの入力制限について
C言語・C++・C#
-
14
unsigned long long 型のフォーマット指定子
C言語・C++・C#
-
15
CStaticコントロールの静的イメージ描画
C言語・C++・C#
-
16
MFCでbitmapを背景にしてstaticテキストを透過させる方法
C言語・C++・C#
-
17
OnDrawが呼び出されません
C言語・C++・C#
-
18
エディットボックスのフォントを変えたい
C言語・C++・C#
-
19
MFC ダイアログ上のID取得について
C言語・C++・C#
-
20
ビットマップを表示させる(MFC)
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
FlexGridの一部のみ表示を更新...
-
MFCでOnPaintのタイミング
-
pset関数について
-
[VB.net] DataGridViewの列ヘッ...
-
C言語(dxlib)のDrawboxについ...
-
NVIDIAのシェーダーキャッシュ
-
エディットコントロールを再描...
-
VBAにGDI+を参照させる方法
-
TextBoxに文字を書いても表示さ...
-
word
-
ブレゼンハムのアルゴリズムに...
-
PCで「使用可能な場合はグラフ...
-
VC++プログラムをつかったBMP画...
-
プシュボタンのテキストの色を...
-
StretchBlt関数について
-
楕円を描くプログラミング
-
VB.netでのライン描画方法がわ...
-
アプリケーションのデザイン
-
InvalidateRectの使い方について
-
OpenGLで描画するテクスチャの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PCで「使用可能な場合はグラフ...
-
[VB.net] DataGridViewの列ヘッ...
-
UpdateData( FALSE); による文...
-
NVIDIAのシェーダーキャッシュ
-
VB6,リストボックスの特定行の...
-
TextBoxに文字を書いても表示さ...
-
word
-
MFCでOnPaintのタイミング
-
エクセルでガンチャートを作成...
-
MFCのタイマーのつかい方を教え...
-
InvalidateRectの使い方について
-
VC++プログラムをつかったBMP画...
-
CScrollViewの使用方法について
-
VB.netでのライン描画方法がわ...
-
CStaticコントロールの静的イメ...
-
Labelの文字をスクロールする際...
-
Form1 Load で実行されない。
-
VBAにGDI+を参照させる方法
-
C++にて、塗りつぶされた円を描...
-
GetGlyphOutline() ご利用経験...
おすすめ情報