MDI子ウィンドウに 定期的に別々のグラフを描画

[戻る]
あぶ 2003/12/06(土) 17:00:29
 VC++6.0でMFC、MDI(Formベース)で 刻々変化する数種類の実験データ項目(温度、電圧
など)をそれぞれ別の子ウィンドウに表示しようとしておりますが、どうもうまくいきません。
VBから転向したばかりでウィンドやViewの扱いに今一しっくりしていないので、初心者向けの
ご説明を頂けたら幸いです。
 使用するタイマーは全体タイマーの一つのみ,子ウィンドウは6つのグラフ・データ数値表示
(EditBox)用

1、子ウィンドウ作成はPostMessageを使用し、テンプレートのFormViewが作成されます。
  (どうしてもLoadFrameでテンプレートのFormを呼び出せなかったので…)
2、CDC* の配列変数を作成して、子ウィンドウ作成時にCDCを保存。
  (ViewのInitialUpdate内で処理、MainFrame内の子ウィンドウ作成用関数内でも試す)
3、MainFrameのOnTimerで 実験値取得後、InvaidateRect(NULL);
4、OnDrawで
  for(i=1;i<WndCount;i++)  // WndCount:作成したウィンドウ数
    {
    pDC=WndCDC[i];       // WndCDC[]:CDC*を保存してある配列変数
     for(l=1;l<DataCount-1,l++)
       {
          pDC-> グラフ描画;
       }
    EditBoxへデータの表示;
    }
  としたのですが… グラフ描画の所でエラー発生!です。

<今までの調査結果>
「2」の配列変数にはうまくCDC*が代入されているようですが、いざ「4」で使おうとすると
きには、配列変数CDC*のメンバーm_hDCやm_hAtrribDCが参照されない。これがエラーの原
因?

 以上 とんちんかんなところもあるかもしれません。よろしくお願いいたします。     
           のん兵衛 あぶ

n [E-Mail] 2003/12/06(土) 17:46:09
>グラフ描画の所でエラー発生!です。
何というエラーが発生するのですか?

あぶ 2003/12/06(土) 18:18:29
失礼しました。エラーメッセージですが
実行時には
Debug Assertion Failed!

For Information on how your program can cause an assertion failure,
seethe Visual C++ documentation on asserts

と出て、kernell32.dll エラー となります。
デバッグを実行しますと、混合モード画面が表示され
「ブレークポイントの設定位置」とメッセージが出てとまります。

遅れましたが WindowsME上で作成しています。
よろしくお願いいたします。

n [E-Mail] 2003/12/06(土) 18:28:12
え〜と、Debug Assertion Failed!のダイアログに

 File:xxxx.cpp
 Line:nnn

とか出てきていないですか?


それと、
>CDC* の配列変数を作成して
とありますが、具体的にどのように書いていますか?

あぶ 2003/12/06(土) 18:38:31
エラーメッセージですが、
File Windgi.cpp  Line 583 で 
グラフ描画の最初の行がMoveToになっているため、
CPoint CDC::MoveTo 関数の中です。

配列変数は、一応色々と試すため、グローバルで宣言してあります。

宣言 CDC* WndCDC[10];
使用するとき extern CDC* WndCDC[10]; としてから使用しています。

よろしくお願いいたします。

NEG(ねぐ) [E-Mail] [HomePage] 2003/12/07(日) 12:01:17
 たとえばGetDCでポインタを取得してた場合、、、
 「後で使用するために保存しておくことはできません。」となっています。
http://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/vclib/html/_mfc_cwnd.3a3a.getdc.asp

あぶ 2003/12/07(日) 16:03:02
情報ありがとうございます。
たしかに、GetDCで取得しておりました。
ページを確認いたしましたが、「一時的なもの」なのですね。う〜む。

 とすると、そもそもその都度状況を確認するという考え方に変えなければ
ならない…わけですね。では、子ウィンドウ作成時に何か識別できるような印
(ウィンドウタイトルなどで)をつけておいて、それをたよりに見分ける
方法をこれから試して見ます。

nさん、NEGさん ありがとうございました。試してみまして、判らないことが
出てきましたら、またよろしくお願いいたします。 

PATIO 2003/12/08(月) 11:04:34
仕様が良く分からないので的外かもしれませんが、
ウインドウの生成を親がしているのであれば、
ウインドウのインスタンスは親が管理しているのではないでしょうか?
親が管理しているのであれば、どのウインドウが何を表示すべきなのかも
当然分かっていると思うのですが。違うのでしょうか?

あとMFCを使っていると言うことですが、私が思うにそれぞれのウインドウ上の描画は
それぞれのウインドウのインスタンス側で行うのが普通ではないかと思います。
ウインドウ側にデータの更新を通知してウインドウ側でデータを参照して
描画するようにすれば、全体の構成もすっきりしないでしょうか。

描画のロジックが同じでそれをそれぞれに書きたくないというのであれば、
クラスとしては一つにしてインスタンスを複数起こせば良いような気もしますし。

古いスレッドには追加発言できません。