昨日のハマリ事
昨日ちょっとはまってしまった事を今後の戒めでメモっておきます。Kokomieの描画ルーチンで CBrush* oldbr = NULL; if(hoge){ CBrush br_col(RGB(255,0,0)); oldbr = dc.SelectObject(&br_col); } else{ oldbr = dc.SelectObject(&this->m_brDlgBk); } dc.Ellipse(&r);で、hogeがTRUEの場合の描画で円がうまく塗りつぶされません。判定をはずして、 CBrush* oldbr = NULL; CBrush br_col(RGB(255,0,0)); oldbr = dc.SelectObject(&br_col); dc.Ellipse(&r);だとうまく行きます。GDIの描画に詳しい方は気がつくと思いますが、CBrush br_colの宣言位置がまずかった訳です。最初のルーチンでは、dc.Ellipse(&r);を実行する時点ではCBrushはスコープ外なので開放されています。なので、Ellipse()が参照しようとしてもCBrushのデストラクタでブラシのハンドルは開放されています。わかってみれば、なんと言うことはないですが、これが結構わかりませんでした。普段割合、アドレス渡しの変数の生存期間は結構気をつかっていたのですが。。普段は、ペンオブジェクトやブラシオブジェクトは必要な分をクラス変数等で確保して、Paint()モジュールで動的に作成することがあまりないのでなかなか気がつきませんでした。(このルーチンも最終形はクラス変数にしたので、最初からそうしておけば。。。)久々の、トホホでした。