こんにちは。
VC初心者です。すみません。
参考書等を読みつつ勉強中ですが、「メッセージハンドラ?!」
が今一つ理解できていないようです。(==;)
今やろうとしているのは。。。
ダイヤログを2つ作っていて、一方のダイヤログ上のボタンを押すと、
もう片方のダイヤログのOnPaintを呼び出して描画を行いたいのですが、
どうしても出来なくて悩んでいます。
どなたか、教えてください!!
描画したいダイアログのInvalidateメソッドを呼べばよさそうです。
void CXXXDlg::OnButton1()
{
this->GetParent()->Invalidate();
}
[MSDN]CWnd::Invalidate
http://msdn2.microsoft.com/ja-jp/library/ax04k970(VS.80).aspx
補足
> this->GetParent()->Invalidate();
は親子関係にあるダイアログの場合です。
そうでない場合、どうにかして描画対象となるウィンドウのインスタンス
(もしくはウィンドウハンドル)を取得して、Invalidateメソッドを呼べばいいです。
BLUEさん こんにちは。
回答ありがとうございます。
2つのダイヤログは、残念ながら、親子関係ではないのです。
正確に言うと、Aというダイヤログを表示していて、
表示されたAの座標上の内部にBのダイヤログを表示しているイメージです。
一見すると、1つの画面(大きなAに小さなBが張り付いている感じ)です。
で、ボタンは、Aについているのですが、画像(ここでは、ピクチャを使用してます)
は、Bについてます。
ボタンAを押下したタイミングで、Bのピクチャを変更したいというものです。
何かしら、メッセージハンドラを使用するのかなぁ?と思っていたのですが、
ご指摘された「Invalidateメソッド」を調べてみたのですが。。。
このメソッドで、他のダイヤログへのイベントを呼べるのでしょうか?
親子関係だと思うけどどうやってBダイアログを表示しているのでしょうか?
(モードレスだろうがモーダルだろうが、Bダイアログのインスタンス作成している
ところがあるはず)
Aダイヤログの「OnInitDialog」の中で、BダイヤログをCREATEしてます。
CBDlg m_BDlg;
BOOL CADlg::OnInitDialog()
{
CDialog::OnInitDialog();
m_BDlg.Create(IDD_B_DIALOG,this);
m_BDlg.ShowWindow(SW_SHOW);
}
> m_BDlg
Bダイアログのインスタンスを持っているってことから
Aダイアログの持ち物、つまりBダイアログはAダイアログの子であるってことじゃないの
かなぁ。
void CADlg::OnButton1()
{
this->m_BDlg->Invalidate();
}
でよさげですけど。
BLUEさん
これって、親子関係だったのですね!(勉強不足ですみません。)
this->m_BDlg->Invalidate();
でビルドすると「クラス 'CDisp' にはオーバーロードされたメンバ 'operator ->' がありません。」
と言われてしまったので、
this->m_BDlg.Invalidate();
でやってみました。
が、Bダイヤログ内の「OnPaint」の処理が、まだ呼び出せません。(悩)
すみません。
さきほどの、ビルドエラー内容ですが、
「クラス 'CDisp' にはオーバーロードされたメンバ 'operator ->' がありません。」
の 'CDisp' は、'CBDlg' の誤りです。
ごめんなさい。
> this->m_BDlg.Invalidate();
あ~、ポインタではなかったですね。
> が、Bダイヤログ内の「OnPaint」の処理が、まだ呼び出せません。(悩)
必要最低限のコードを書いてやってみましたがCBDlgのOnPaintはちゃんと呼ばれます
よ。(環境:Windows XP SP2,VC++6.0 SP6)
BLUEさん。
>必要最低限のコードを書いてやってみましたがCBDlgのOnPaintはちゃんと呼ばれます
よ。(環境:Windows XP SP2,VC++6.0 SP6)
ぜひ、ぜひ、そのコードを教えてもらえませんか?
ひょっとしたら、私。。。根本的!?に間違ってるのかもしれないので。
ちなみに、私の環境は、Windows 2000 SP4,VC++6.0 SP6です。
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
と表示されるのを確認。
以上。
BLUEさん
解決しました~!
BLUEさん解かり易~い「ソースコード」と比較しつつ作成したら、
ちゃんと、OnPaintへ処理が飛びました。
どうも、私のDLGの作り方がまずかったようですね。
本当にありがとうございました。