再描画について – プログラミング – Home

通知
すべてクリア

[解決済] 再描画について


モーモー
 モーモー
(@モーモー)
ゲスト
結合: 22年前
投稿: 49
Topic starter  

過去ログ等でいろいろ見てみたのですが、よくわからないので教えてください。

メインウィンドウとダイアログ(モーダレス)の二つの画面があり、
ダイアログの絵(BITMAP)をドロップ&ドラックでメインに絵をどんどん貼り付けてるんです
が、
一回目はうまくいくんですけど、二回目以降は、なぜか[中止][再試行][無視]の
エラー画面が三回も出てしまいます。
[無視]し続けると、絵は出てくるんですけど・・・

それで、原因は再描画しているInvalidate(FALSE)だと思うんですけど、
このエラーをどう回避すればいいかわかりません。
なんで、三回もエラー画面が出てきちゃうのか・・・(T_T)

どなたか教えてください。よろしくお願いします。


引用未解決
トピックタグ
lap
 lap
(@lap)
ゲスト
結合: 22年前
投稿: 11
 

これだけの情報でわかったら神。

>一回目はうまくいくんですけど、二回目以降は、なぜか[中止][再試行][無視]の
>エラー画面が三回も出てしまいます。

[中止][再試行][無視]以外に何か書いてありませんでした?

>それで、原因は再描画しているInvalidate(FALSE)だと思うんですけど、

そう思うのならそこを重点的に調べれば?
デバッガで変数の値を見てみるとか。


返信引用
NEG(ねぐ)
 NEG(ねぐ)
(@NEG(ねぐ))
ゲスト
結合: 22年前
投稿: 178
 

 [無視]しないで[再試行]する。
http://www24.cds.ne.jp/~neg/pro/neg/neg007.html


返信引用
へたれ
 へたれ
(@へたれ)
ゲスト
結合: 23年前
投稿: 32
 

情報不足なので推測なのですが、

ビットマップデータを格納しているGDIオブジェクトを Delete しないで、

Create または Load してメモリリークを起こしているというのが考えられます。


返信引用
モーモー
 モーモー
(@モーモー)
ゲスト
結合: 22年前
投稿: 49
Topic starter  

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;
}


返信引用
NEG(ねぐ)
 NEG(ねぐ)
(@NEG(ねぐ))
ゲスト
結合: 22年前
投稿: 178
 

 デバッグ用ウィンドウの[変数]を使って、CDC::Attach(HDC_*)を呼び出してる自分のソース
はどこか調べます。


返信引用
へたれ
 へたれ
(@へたれ)
ゲスト
結合: 23年前
投稿: 32
 

直接は関係ないのですが、
>DeleteDC(&uraDC);
これは危険ですね。
CClientDC を使ったことがないので一概にそうとは言えないのですが、ヘルプを見る限

これを構築するときに GetDC() を呼び出しているようなので、これの前に
this->ReleaseDC(&uraDC);
を入れておいたほうがいいですね。(というか、入れないと落ちます)
それと、これを Delete する場合は
uraDC.DeleteDC();
ですね。

GDIオブジェクトの場合も
CGdiObject::DeleteObject()
を使用します。

ただし上に記述した部分は それぞれのデストラクタで自動的に
処理されるので特別気にしなくても良いでしょう。
(でも Delete する癖を付けたほうがいいですよ)

さて、本題ですが
>myDC.CreateCompatibleDC(&uraDC);
ここで落ちてませんか?

見る限りでは Delete されていませんので。


返信引用
モーモー
 モーモー
(@モーモー)
ゲスト
結合: 22年前
投稿: 49
Topic starter  

レスありがとうございます。

実は、CClientDCを使っていますが、GetDCは特に使ってないんですけど、
それがまずいんでしょうか?
ソース自体は、上に記述した通りです。
すみませんが、どうすればdeleteがうまくいくのか、教えていただけますか。

それと、この質問には関係無いですが、
myDC.CreateCompatibleDC(&uraDC);
myBMP.CreateCompatibleBitmap(uraDC,pWidth,pHeight);
この文2つを記述すると、表示したいBITMAPが壊れてしまうんですけど、
どうしてなんでしょうか?
裏画面を作りたくてネット上のサンプルを真似してるだけなんですが・・・
myBMP.CreateCompatibleBitmap(uraDC,pWidth,pHeight);
この一行を消すと、絵はきれいに出力されます。
なぜかご存知でしたら教えてください。


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

OnDraw()で渡されたpDCは削除する必要ナシ。
CClientDCも削除する必要ナシ。
また、描画してないビットマップも削除しちゃダメ、つーか意味がない。


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

つーかコンパイルエラーや警告は全部解消してから、その上でデバッグするべきでは?


返信引用
モーモー
 モーモー
(@モーモー)
ゲスト
結合: 22年前
投稿: 49
Topic starter  

レスありがとうございます。

一応コンパイルエラーや警告は出てないんですけど。。。

DCやBITMAPのDeleteが必要無いとなると、
落ちてしまう原因というは何が考えられますでしょうか?
教えてください。


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

> デバッグ用ウィンドウの[変数]を使って、CDC::Attach(HDC_*)を呼び出してる
> 自分のソースはどこか調べます。

まずは、NEG(ねぐ)さんの仰った、これを実践して
自分のソースの何行目で落ちているのかを調べるべきでしょう。


返信引用
n
 n
(@n)
ゲスト
結合: 23年前
投稿: 159
 

> 一応コンパイルエラーや警告は出てないんですけど。。。

ごめんなさい、そうみたい。私の誤解です。

で、
> CDC::Attach(HDC_*)
で停止する原因は、同じCDCオブジェクト(つまりmyDC)に2度CreateCompatibleDC()
をかけたせいだと思います。

もしかしてflgAが常に1のまんまなのでは?


返信引用
モーモー
 モーモー
(@モーモー)
ゲスト
結合: 22年前
投稿: 49
Topic starter  

おー!!!!
できました!ありがとうございましたm(_ _)m

また、掲示板に出てきた時はよろしくお願いします。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました