他のダイアログの描画 – プログラミング – Home

通知
すべてクリア

[解決済] 他のダイアログの描画


NENE
 NENE
(@NENE)
ゲスト
結合: 17年前
投稿: 7
Topic starter  

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


引用未解決
トピックタグ
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

描画したいダイアログのInvalidateメソッドを呼べばよさそうです。

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

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

補足

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


返信引用
NENE
 NENE
(@NENE)
ゲスト
結合: 17年前
投稿: 7
Topic starter  

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

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


返信引用
NENE
 NENE
(@NENE)
ゲスト
結合: 17年前
投稿: 7
Topic starter  

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
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> m_BDlg
Bダイアログのインスタンスを持っているってことから
Aダイアログの持ち物、つまりBダイアログはAダイアログの子であるってことじゃないの
かなぁ。

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

でよさげですけど。


返信引用
NENE
 NENE
(@NENE)
ゲスト
結合: 17年前
投稿: 7
Topic starter  

BLUEさん

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

this->m_BDlg->Invalidate();

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

this->m_BDlg.Invalidate();

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


返信引用
NENE
 NENE
(@NENE)
ゲスト
結合: 17年前
投稿: 7
Topic starter  

すみません。

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

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

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

ごめんなさい。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

> this->m_BDlg.Invalidate();
あ~、ポインタではなかったですね。

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


返信引用
NENE
 NENE
(@NENE)
ゲスト
結合: 17年前
投稿: 7
Topic starter  

BLUEさん。

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

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

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


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

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
 NENE
(@NENE)
ゲスト
結合: 17年前
投稿: 7
Topic starter  

BLUEさん

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました