裏画面を表示するには

解決


やす  2005-11-25 22:18:58  No: 59791

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

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 22:32:18  No: 59792

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

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

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

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


やす  2005-11-26 03:46:38  No: 59793

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


επιστημη  2005-11-26 08:59:02  No: 59794

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

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


やす  2005-11-26 21:32:34  No: 59795

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


みい  2005-11-26 23:30:55  No: 59796

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

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

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


やす  2005-11-29 21:50:28  No: 59797

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加