他のダイアログの描画

[戻る]
NENE 2007/07/27(金) 12:00:52
こんにちは。
VC初心者です。すみません。
参考書等を読みつつ勉強中ですが、「メッセージハンドラ?!」
が今一つ理解できていないようです。(==;)
今やろうとしているのは。。。
ダイヤログを2つ作っていて、一方のダイヤログ上のボタンを押すと、
もう片方のダイヤログのOnPaintを呼び出して描画を行いたいのですが、
どうしても出来なくて悩んでいます。
どなたか、教えてください!!

Blue 2007/07/27(金) 12:49:09
描画したいダイアログのInvalidateメソッドを呼べばよさそうです。

void CXXXDlg::OnButton1() 
{
    this->GetParent()->Invalidate();
}

[MSDN]CWnd::Invalidate
http://msdn2.microsoft.com/ja-jp/library/ax04k970(VS.80).aspx

Blue 2007/07/27(金) 12:51:05
補足

> this->GetParent()->Invalidate();
は親子関係にあるダイアログの場合です。
そうでない場合、どうにかして描画対象となるウィンドウのインスタンス
(もしくはウィンドウハンドル)を取得して、Invalidateメソッドを呼べばいいです。

NENE 2007/07/27(金) 13:23:08
BLUEさん こんにちは。
回答ありがとうございます。
2つのダイヤログは、残念ながら、親子関係ではないのです。
正確に言うと、Aというダイヤログを表示していて、
表示されたAの座標上の内部にBのダイヤログを表示しているイメージです。
一見すると、1つの画面(大きなAに小さなBが張り付いている感じ)です。
で、ボタンは、Aについているのですが、画像(ここでは、ピクチャを使用してます)
は、Bについてます。
ボタンAを押下したタイミングで、Bのピクチャを変更したいというものです。
何かしら、メッセージハンドラを使用するのかなぁ?と思っていたのですが、
ご指摘された「Invalidateメソッド」を調べてみたのですが。。。
このメソッドで、他のダイヤログへのイベントを呼べるのでしょうか?

Blue 2007/07/27(金) 13:34:48
親子関係だと思うけどどうやってBダイアログを表示しているのでしょうか?
(モードレスだろうがモーダルだろうが、Bダイアログのインスタンス作成している
ところがあるはず)

NENE 2007/07/27(金) 15:44:30
Aダイヤログの「OnInitDialog」の中で、BダイヤログをCREATEしてます。

CBDlg  m_BDlg;

BOOL CADlg::OnInitDialog()
{
  CDialog::OnInitDialog();
  m_BDlg.Create(IDD_B_DIALOG,this);
  m_BDlg.ShowWindow(SW_SHOW);
}

Blue 2007/07/27(金) 15:52:16
> m_BDlg
Bダイアログのインスタンスを持っているってことから
Aダイアログの持ち物、つまりBダイアログはAダイアログの子であるってことじゃないの
かなぁ。

void CADlg::OnButton1() 
{
    this->m_BDlg->Invalidate();
}

でよさげですけど。

NENE 2007/07/27(金) 16:06:02
BLUEさん

これって、親子関係だったのですね!(勉強不足ですみません。)

this->m_BDlg->Invalidate();

でビルドすると「クラス 'CDisp' にはオーバーロードされたメンバ 'operator ->' がありません。」
と言われてしまったので、

this->m_BDlg.Invalidate();

でやってみました。
が、Bダイヤログ内の「OnPaint」の処理が、まだ呼び出せません。(悩)

NENE 2007/07/27(金) 16:09:39
すみません。

さきほどの、ビルドエラー内容ですが、

「クラス 'CDisp' にはオーバーロードされたメンバ 'operator ->' がありません。」

の 'CDisp' は、'CBDlg' の誤りです。

ごめんなさい。

Blue 2007/07/27(金) 16:13:40
> this->m_BDlg.Invalidate();
あ〜、ポインタではなかったですね。

> が、Bダイヤログ内の「OnPaint」の処理が、まだ呼び出せません。(悩)
必要最低限のコードを書いてやってみましたがCBDlgのOnPaintはちゃんと呼ばれます
よ。(環境:Windows XP SP2,VC++6.0 SP6)

NENE 2007/07/27(金) 16:25:58
BLUEさん。

>必要最低限のコードを書いてやってみましたがCBDlgのOnPaintはちゃんと呼ばれます
よ。(環境:Windows XP SP2,VC++6.0 SP6)

ぜひ、ぜひ、そのコードを教えてもらえませんか?
ひょっとしたら、私。。。根本的!?に間違ってるのかもしれないので。

ちなみに、私の環境は、Windows 2000 SP4,VC++6.0 SP6です。

Blue 2007/07/27(金) 16:43:36
MFC Application ダイアログ でプロジェクト作成(プロジェクト名「A])
↓
リソースにダイアログを追加
↓
ClassWizardで追加したダイアログリソース用のCDialog派生クラスを新規作成
(クラス名 CBDlg)
↓
ADlg.hのクラス宣言の直前に

#include "BDlg.h"

を追加し、メンバ変数として

    CBDlg m_BDlg;

を追加。
↓
ADlgのOnInitDialogに

    this->m_BDlg.Create(IDD_DIALOG1, this);
    this->m_BDlg.ShowWindow(SW_SHOW);

を追加。
↓
デフォルトであるOKボタンをハンドリングして、
void CADlg::OnOK() 
{
    // TODO: この位置にその他の検証用のコードを追加してください
    this->m_BDlg.Invalidate();
    
//  CDialog::OnOK();
}
てなコードを追加。
↓
CBDlgのWM_PAINTイベントをClassWizardより追加し、
確認用のコード

void CBDlg::OnPaint() 
{
    CPaintDC dc(this); // 描画用のデバイス コンテキスト
    
    // TODO: この位置にメッセージ ハンドラ用のコードを追加してください
    TRACE("OnPaint\n");
    
    // 描画用メッセージとして CDialog::OnPaint() を呼び出してはいけません
}

を追加。
↓
ビルド
↓
F5実行(デバッグ実行)
↓
CADlgのOKボタンを押したときにデバッグウィンドウに

OnPaint

と表示されるのを確認。


以上。

NENE 2007/07/27(金) 17:12:53
[[解決]]
BLUEさん

解決しました〜!
BLUEさん解かり易〜い「ソースコード」と比較しつつ作成したら、
ちゃんと、OnPaintへ処理が飛びました。
どうも、私のDLGの作り方がまずかったようですね。
本当にありがとうございました。

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