VC++6.0
OS XP
モダールさせるダイアログ内のピクチャーボックスに絵を書き込みたいのですが、うま
くいきません。どこが間違っているのでしょうか?
詳しい方、よろしくおねがいします。
CShow show; // 後から作成したダイアログクラス
CWnd* myPICT = GetDlgItem(IDC_PICT); // IDC_PICT はピクチャボックスのID
CClientDC myCLDC(myPICT) ;
CPen myPen1(PS_SOLID, 1, RGB(0,0,255));
CPen* oldPen = myCLDC.SelectObject(&myPen1);
myCLDC.Rectangle(2,140,12,130);
int nResponse = show.DoModal();
そのソースだと、そもそもピクチャボックスと、モーダルダイアログ
との接点がありませんが。
モーダルダイアログにデータを渡したいのなら、コンストラクタなり
public メソッドなりを経由させて必要な情報を渡す必要があります。
なお、モーダルダイアログは DoModal() メソッドを呼び出すまでは
ウィンドウが生成されていないため、描画するために必要な情報だけ
を渡すようにします。(実際の描画は CShow 側が行なう。)
最初の書いている描画のコードは、
後で表示を指示しているダイアログに全く関係なく動いてますね。
そもそも表示もされていない物に描画なんてできませんし。
基本的にそのウインドウ内の描画はそのウインドウのクラスで行うのが
一番自然で無理がない実装になります。
で、描画に必要な情報はダイアログをDoModalする前に
予めダイアログに対して引き渡しておくのが普通でしょう。
引き渡し方としてはRAPTさんが書かれているように
publicのメソッドを使ってダイアログのメンバー変数に設定するとか
メンバー変数自体をpublicにしておいて直接設定するとかあると思います。
MFCではメンバー変数をpublicにしておいて直接使うと言う手段が割りと
多く使われていますけれど、本来はメンバー変数はprivateにしておいて
publicなメンバー関数で設定するのが本来の姿ですね。
RAPT 様、PATIO 様、ご解答ありがとうございます。
外部変数で必要な情報を渡し、コンストラクタで描画させてみます。
いえ、そうではなくて
CShowというダイアログクラスに引き渡す情報を保持する為のメンバー変数を追加します。
そのメンバー変数に対してダイアログを呼び出す側でCShowのインスタンスを作成後、
DoModalする前に情報を設定するのです。
こうすれば、DoModalを実行するときにはデータが引き渡し済みになります。
ちなみに描画に関してはOnDrawが適当だと思います。
他の場所に書いてもウインドウの上に他のウインドウが重なったりしたら
多分、描画結果が消えてしまいますよ。
Windowsでの画面の更新の仕組みとかC++言語でのクラスの考え方とか
勉強した方が良いと思いますよ。その辺の下敷きが無いと今後勉強を進めても
躓くと思いますので。
あっ、CDialogクラスの派生だったら、OnPaintですね。
失礼いたしました。
PATIO 様、ありがとうございます。
コーディングテストには、しばらく時間がかかります。
できしだい、UPいたしますので、しばらくおまちくださいませ。
<a href