環境:プログラムの開発環境はWindows XP SP2でVC++6.0です。
現象:
Pen,Brush描画処理を下記の単位で行っています。
//myPen,mybush set
myPen.CreatePen(PS_SOLID, 1, mycolor);
pOldPen=pDC->SelectObject(&myPen);
mybrush.CreateSolidBrush(mycolor);
pOldbrush=pDC->SelectObject(&mybrush);
//
//myPen,mybush draw
//
//myPen,mybush delete
pDC->SelectObject(pOldPen);
myPen.DeleteObject();
pDC->SelectObject(pOldbrush);
mybrush.DeleteObject();
上記単位で色々なタイルを作り図を描いています。
マウスドラッグに追随させこの図を回転や移動させるため再描画
させると、システムのバッファオーバーフローが起き、プログラムが
異常終了してしまいます。タイマーにより再描画速度を遅らせると
異常終了は起きません。
質問:何かPen,Brushによるシステムバッファの使用状況を管理する
関数または方法はありませんでしょうか?
No.1
- 回答日時:
myPenやmybrushがクラス変数なら描画するたびに PenやBrushを生成/破棄する必要は無い様に思います
色指定のメニューがあるならそのハンドラ内で
if ( myPen.m_hObject ) {
myPen.DeleteObject();
}
if ( mybrush.m_hObject ) {
mybrush.DeleteObject();
}
myPen.CreatePen( PS_SOLID, 1, mycolor );
mybrush.CreateSolidBrush( mycolor );
といった具合でいいように思います
初期化を WM_CREATEハンドラなどで
myPen.CreatePen( PS_SOLID, 1, mycolor );
mybrush.CreateSolidBrush( mycolor );
後始末を WM_DESTORYハンドラなどで
if ( myPen.m_hObject ) {
myPen.DeleteObject();
}
if ( mybrush.m_hObject ) {
mybrush.DeleteObject();
}
描画の際には
pOldPen=pDC->SelectObject(&myPen);
pOldbrush=pDC->SelectObject(&mybrush);
//
//myPen,mybush draw
//
//myPen,mybush delete
pDC->SelectObject(pOldPen);
pDC->SelectObject(pOldbrush);
としてみてはいかがでしょう
No.2ベストアンサー
- 回答日時:
「描画後に、元のペンとブラシに戻す」のなら、API関数の「SaveDC」「RestoreDC」を使用しましょう。
http://msdn.microsoft.com/ja-jp/library/cc410563 …
http://msdn.microsoft.com/ja-jp/library/cc410595 …
質問者さんの方法では「元のペン」「今のペン」「元のブラシ」「今のブラシ」など、リソースを食いますし、ペンやブラシの作成と破棄が繰り返され、色々と無駄です。
それに、うっかりペンやブラシじゃない物を書き換える関数を呼んじゃった場合、それが元に戻らないので、色々と問題を起こす可能性があります。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) マクロで行を追加、削除すると行位置がずれますが、解決方法はありませんか?。 5 2022/05/28 16:03
- Visual Basic(VBA) エクセルのマクロを使ってメールを送る方法について教えてください 2 2022/03/29 01:36
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- その他(Microsoft Office) VBA メール送信済で実行されるはずが、実行されない時があります。 2 2023/02/02 14:05
- その他(プログラミング・Web制作) pythonのmap、結果の利用は1度だけ? 5 2022/06/11 12:33
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Illustrator(イラストレーター) 「頂点で線分を伸ばす」作業がうまく行かない。 1 2022/09/09 10:19
- 美術・アート メディバンペイント。マウスでの描画。 3 2022/11/09 10:53
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PCで「使用可能な場合はグラフ...
-
TextBoxに文字を書いても表示さ...
-
NVIDIAのシェーダーキャッシュ
-
[VB.net] DataGridViewの列ヘッ...
-
ブレゼンハムのアルゴリズムに...
-
vc++のpictureboxにopenGLの画...
-
画像の印刷について
-
MFC ビットマップ描画で残像が残る
-
VB6のform Load
-
VB6,リストボックスの特定行の...
-
UpdateData( FALSE); による文...
-
ワード2019 描画ツールの書式が...
-
C++にて、塗りつぶされた円を描...
-
ダイアログベースの再描画について
-
WM_PAINTとWM_MOVEで同じ事をし...
-
Windowのちらつき防止
-
FlexGridの一部のみ表示を更新...
-
InvalidateRectの使い方について
-
C言語(dxlib)のDrawboxについ...
-
LineToやMoveToにて描画した線...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6,リストボックスの特定行の...
-
[VB.net] DataGridViewの列ヘッ...
-
NVIDIAのシェーダーキャッシュ
-
MFCでOnPaintのタイミング
-
TextBoxに文字を書いても表示さ...
-
word
-
UpdateData( FALSE); による文...
-
VC++プログラムをつかったBMP画...
-
InvalidateRectの使い方について
-
OneNote 2010 文字と描画がずれる
-
StretchBlt関数について
-
C# ラバーバンドの描画を快適に...
-
エクセルでガンチャートを作成...
-
C++にて、塗りつぶされた円を描...
-
VBAにGDI+を参照させる方法
-
GDI+で高速な描画
-
MFC DrawText 背景色とフォント
-
FlexGridの一部のみ表示を更新...
-
MFCのタイマーのつかい方を教え...
-
Labelの文字をスクロールする際...
おすすめ情報