- ベストアンサー
描画バッファーのオーバーフローの管理について
環境:プログラムの開発環境は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によるシステムバッファの使用状況を管理する 関数または方法はありませんでしょうか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
「描画後に、元のペンとブラシに戻す」のなら、API関数の「SaveDC」「RestoreDC」を使用しましょう。 http://msdn.microsoft.com/ja-jp/library/cc410563.aspx http://msdn.microsoft.com/ja-jp/library/cc410595.aspx 質問者さんの方法では「元のペン」「今のペン」「元のブラシ」「今のブラシ」など、リソースを食いますし、ペンやブラシの作成と破棄が繰り返され、色々と無駄です。 それに、うっかりペンやブラシじゃない物を書き換える関数を呼んじゃった場合、それが元に戻らないので、色々と問題を起こす可能性があります。
その他の回答 (1)
- redfox63
- ベストアンサー率71% (1325/1856)
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); としてみてはいかがでしょう
お礼
有難うございました。
お礼
有難うございました。