裏画面を表示するには

解決


やす  2005-11-25 13:18:58  No: 59791  IP: 192.*.*.*

裏画面に線を書いてそれを表示するという目的で

void DoEvents(){
  MSG msg;
  while(::PeekMessage(&msg,NULL,0,0,PM_REMOVE)){
    ::TranslateMessage(&msg);
    ::DispatchMessage(&msg);
  }
}

void CSteady_flowView::OnDraw(CDC* pDC)
{
  計算……

  while(条件){

    計算……

    if(convergence%20==0){
      Drawing_line(pDC, …);
    }  
    DoEvents();
    if(flag){
      break;
    }
    convergence++;
  }
}

void Drawing_line(CDC* pDC, …){

  pDC=GetDC();
  CDC memDC;
  CBitmap bmp,*pbmp;
  memDC.CreateCompatibleDC(pDC);
  bmp.CreateCompatibleBitmap(pDC,640, 480);
  pbmp = memDC.SelectObject(&bmp);
  memDC.FillSolidRect(0, 0, 640, 480, RGB(255,255,255));
  
  計算……

  for(i=0; i<100; i++){
    for(j=0; j<100; j++){
      memDC.MoveTo(x[i][j],y[i][j]);
      memDC.LineTo(x[i+1][j],y[i+1][j]);
    }
  }
  memDC.SelectObject(pbmp);
  memDC.DeleteDC();
  bmp.DeleteObject();
  ReleaseDC(pDC);
}

このような感じでプログラムを書きましたが、"GetDC()""ReleaseDC"の関数が不正な実引数をともなって呼び出されたと表示されます。
また、ループ中にアプリケーションを終了するとエラーが出るのですがどうすればよいでしょうか?

編集 削除
επιστημη  2005-11-25 13:32:18  No: 59792  IP: 192.*.*.*

> void Drawing_line(CDC* pDC, …){
>    pDC=GetDC();

…せっかく引数で与えたpDCを潰してますけど。

> "GetDC()""ReleaseDC"の関数が不正な実引数をともなって呼び出されたと表示されます。

Win32APIのGetDCとMFCのGetDCを混同していませんか?
# C++(or MFC)に不慣れとミタ。

編集 削除
やす  2005-11-25 18:46:38  No: 59793  IP: 192.*.*.*

すいません。C++自体はじめてまだ間もないので根本的なところから問題があるかもしれませんが、そこら辺を考慮してやさしくご教授していただければさいわいです。

編集 削除
επιστημη  2005-11-25 23:59:02  No: 59794  IP: 192.*.*.*

> 根本的なところから問題があるかもしれませんが

ならばまず、教本を読んでください。
'普通の関数'と'メンバ関数'は扱いが異なります。

編集 削除
やす  2005-11-26 12:32:34  No: 59795  IP: 192.*.*.*

pDC=GetDC(),ReleaseDC(pDC)をとりあえず削除して
pDC->BitBlt(0, 0, 640, 480, &memDC, 0, 0,SRCCOPY);
をmemDC.SelectObject(pbmp)の上に書くことでとりあえず表示はされるようになりましたがループ中にアプリケーションを終了させてもエラーダイアログを出さない方法がいまだわからないです。

編集 削除
みい  2005-11-26 14:30:55  No: 59796  IP: 192.*.*.*

> ループ中にアプリケーションを終了するとエラーが出る
イコール ループ中でなければアプリケーションは終了しないということですよね。
簡単に考えるなら…

<ループ処理に時間がかからない>
クリティカルセクションを利用してループ処理が終わるまで、クローズするのを待つ。

<ループ処理に時間がかかる>
フラグを用意しておいて
・ループ内に入ったらフラグを1にする
  ループ内でフラグを監視してフラグが2ならばループを抜けるようにする
  ループを抜けたらフラグを0にする
・クローズイベントもしくはクローズクエリーイベントで
  フラグ1ならばフラグを2にする
  フラグが0になるまで待機し、フラグが0になったら処理を続ける

編集 削除
やす  2005-11-29 12:50:28  No: 59797  IP: 192.*.*.*

ループ処理に時間がかかる方を参考に作らせていただき
何とか思い通りの形になってまいりました。
επιστημηさん、みいさん。
いろいろとありがとうございました。

編集 削除