アプリ版:「スタンプのみでお礼する」機能のリリースについて

環境:プログラムの開発環境は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によるシステムバッファの使用状況を管理する
   関数または方法はありませんでしょうか?

A 回答 (2件)

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);
としてみてはいかがでしょう 
    • good
    • 0
この回答へのお礼

有難うございました。

お礼日時:2009/06/26 14:34

「描画後に、元のペンとブラシに戻す」のなら、API関数の「SaveDC」「RestoreDC」を使用しましょう。


http://msdn.microsoft.com/ja-jp/library/cc410563 …
http://msdn.microsoft.com/ja-jp/library/cc410595 …

質問者さんの方法では「元のペン」「今のペン」「元のブラシ」「今のブラシ」など、リソースを食いますし、ペンやブラシの作成と破棄が繰り返され、色々と無駄です。

それに、うっかりペンやブラシじゃない物を書き換える関数を呼んじゃった場合、それが元に戻らないので、色々と問題を起こす可能性があります。
    • good
    • 0
この回答へのお礼

有難うございました。

お礼日時:2009/06/26 14:33

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!