過去ログ等でいろいろ見てみたのですが、よくわからないので教えてください。
メインウィンドウとダイアログ(モーダレス)の二つの画面があり、
ダイアログの絵(BITMAP)をドロップ&ドラックでメインに絵をどんどん貼り付けてるんです
が、
一回目はうまくいくんですけど、二回目以降は、なぜか[中止][再試行][無視]の
エラー画面が三回も出てしまいます。
[無視]し続けると、絵は出てくるんですけど・・・
それで、原因は再描画しているInvalidate(FALSE)だと思うんですけど、
このエラーをどう回避すればいいかわかりません。
なんで、三回もエラー画面が出てきちゃうのか・・・(T_T)
どなたか教えてください。よろしくお願いします。
これだけの情報でわかったら神。
>一回目はうまくいくんですけど、二回目以降は、なぜか[中止][再試行][無視]の
>エラー画面が三回も出てしまいます。
[中止][再試行][無視]以外に何か書いてありませんでした?
>それで、原因は再描画しているInvalidate(FALSE)だと思うんですけど、
そう思うのならそこを重点的に調べれば?
デバッガで変数の値を見てみるとか。
情報不足なので推測なのですが、
ビットマップデータを格納しているGDIオブジェクトを Delete しないで、
Create または Load してメモリリークを起こしているというのが考えられます。
lapさん、NEGさん、へたれさん、レスありがとうございます。
わかりにくい説明で投稿してしまい、すみません。。。
[再試行]で、デバックをやってみたところ、CDC::Attach(HDC_*)っていう関数のなかにある
m_pNextClassというところに、値が入ってきていないようでした。
でも、実際この関数って何しているものなのかよくわからないので、修正の仕方がわかりませ
ん。
それから、メモリリークの可能性もあるということだったので、
その方も、調べてDeleteObjectとDeleteDCを追加してみたのですが、変化しなかったです。
書く場所が悪いのでしょうか?
ソースを添付しますので、確認してもらっても良いですか?
************
void CAAAView::OnDraw(CDC* pDC)
{
CAAADoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: この場所にネイティブ データ用の描画コードを追加します。
//_______tuika________
if(MemoryDC_Draw()){
pDC->BitBlt(px,py,pWidth,pHeight,&myDC,0,0,SRCCOPY);
DeleteDC(myDC); //myDCはCAAAView.hに宣言
}
}
}
BOOL CAAAView::MemoryDC_Draw()
{
CBitmap myBMP;
CClientDC uraDC(this);
BITMAP tBitmap;
if(flgA == 1){
//ビットマップを読込む
myBMP.LoadBitmap(dlg1->pictID);
//ビットマップ情報を取得する
myBMP.GetObject(sizeof(tBitmap), &tBitmap);
pHeight = tBitmap.bmHeight;
pWidth = tBitmap.bmWidth;
myDC.CreateCompatibleDC(&uraDC);
myDC.SelectObject(&myBMP);
DeleteObject(myBMP);
DeleteDC(uraDC);
return TRUE;
}
else return FALSE;
}
デバッグ用ウィンドウの[変数]を使って、CDC::Attach(HDC_*)を呼び出してる自分のソース
はどこか調べます。
直接は関係ないのですが、
>DeleteDC(&uraDC);
これは危険ですね。
CClientDC を使ったことがないので一概にそうとは言えないのですが、ヘルプを見る限
り
これを構築するときに GetDC() を呼び出しているようなので、これの前に
this->ReleaseDC(&uraDC);
を入れておいたほうがいいですね。(というか、入れないと落ちます)
それと、これを Delete する場合は
uraDC.DeleteDC();
ですね。
GDIオブジェクトの場合も
CGdiObject::DeleteObject()
を使用します。
ただし上に記述した部分は それぞれのデストラクタで自動的に
処理されるので特別気にしなくても良いでしょう。
(でも Delete する癖を付けたほうがいいですよ)
さて、本題ですが
>myDC.CreateCompatibleDC(&uraDC);
ここで落ちてませんか?
見る限りでは Delete されていませんので。
レスありがとうございます。
実は、CClientDCを使っていますが、GetDCは特に使ってないんですけど、
それがまずいんでしょうか?
ソース自体は、上に記述した通りです。
すみませんが、どうすればdeleteがうまくいくのか、教えていただけますか。
それと、この質問には関係無いですが、
myDC.CreateCompatibleDC(&uraDC);
myBMP.CreateCompatibleBitmap(uraDC,pWidth,pHeight);
この文2つを記述すると、表示したいBITMAPが壊れてしまうんですけど、
どうしてなんでしょうか?
裏画面を作りたくてネット上のサンプルを真似してるだけなんですが・・・
myBMP.CreateCompatibleBitmap(uraDC,pWidth,pHeight);
この一行を消すと、絵はきれいに出力されます。
なぜかご存知でしたら教えてください。
OnDraw()で渡されたpDCは削除する必要ナシ。
CClientDCも削除する必要ナシ。
また、描画してないビットマップも削除しちゃダメ、つーか意味がない。
つーかコンパイルエラーや警告は全部解消してから、その上でデバッグするべきでは?
レスありがとうございます。
一応コンパイルエラーや警告は出てないんですけど。。。
DCやBITMAPのDeleteが必要無いとなると、
落ちてしまう原因というは何が考えられますでしょうか?
教えてください。
> デバッグ用ウィンドウの[変数]を使って、CDC::Attach(HDC_*)を呼び出してる
> 自分のソースはどこか調べます。
まずは、NEG(ねぐ)さんの仰った、これを実践して
自分のソースの何行目で落ちているのかを調べるべきでしょう。
> 一応コンパイルエラーや警告は出てないんですけど。。。
ごめんなさい、そうみたい。私の誤解です。
で、
> CDC::Attach(HDC_*)
で停止する原因は、同じCDCオブジェクト(つまりmyDC)に2度CreateCompatibleDC()
をかけたせいだと思います。
もしかしてflgAが常に1のまんまなのでは?
おー!!!!
できました!ありがとうございましたm(_ _)m
また、掲示板に出てきた時はよろしくお願いします。