VC++6.0開発していて、
NT4.0上で使用するアプリを製作中です。
CDocumentクラスからCFormViewクラスへSendMessageで
メッセージを飛ばしたいのですが、なにか良い方法はないでしょうか?
また、そのCFormViewクラスのOnInitialUpdate内で
ダイアログを割り込みで表示(DoModal)させていますが、そこにも飛ばしたいです。
CFormView及びCDialogではDefWindowProc関数で
そのメッセージを待っています。
よろしく願いいたします。
> CDocumentクラスからCFormViewクラスへSendMessageで
> メッセージを飛ばしたいのですが、なにか良い方法はないでしょうか?
SendMessageなんか使わず、UpdateAllViews()すれば。
> ダイアログを割り込みで表示(DoModal)させていますが、そこにも飛ばしたいです。
ダイアログのポインタをDocumentに教えておけば、
ダイアログのメソッドをDocumentから呼び出せます。
SendMessageのView側の受け取りかたがわからないのでしょうか
下でできます。
#define WM_USER_MSG1 (WM_USER+101)
CView* pView ;
pView->SendMessage(WM_USER_MSG1, 0, 0) ;
// CXXXView.h 生成されたメッセージ マップ関数
protected:
//{{AFX_MSG(CXXXView)
//}}AFX_MSG
afx_msg LRESULT OnMsg1(WPARAM wParam, LPARAM lParam) ;
DECLARE_MESSAGE_MAP()
// CXXXView.cpp 生成されたメッセージ マップ関数
BEGIN_MESSAGE_MAP(CXXXView, CFormView)
//{{AFX_MSG_MAP(CXXXView)
//}}AFX_MSG_MAP
ON_MESSAGE(WM_USER_MSG1, OnMsg1)
END_MESSAGE_MAP()
LRESULT CXXXView::OnMsg1(WPARAM wParam, LPARAM lParam)
{
return 0 ;
}
【επιστημηさん】
ありがとうございます。
UpdateAllViewsは、知りませんでした。
早速調べてみた所、それに付随してCDocument::GetNextViewで
以下のサンプルを見つけました。
----------------------------------------------------------------
// この例では、CDocument::GetFirstViewPosition
// と GetNextView を使って、各ビューを再描画します。
void CMyDoc::OnRepaintAllViews()
{
POSITION pos = GetFirstViewPosition();
while (pos != NULL)
{
CView* pView = GetNextView(pos);
pView->UpdateWindow();
}
}
// 同じ結果を得る簡単な方法は、UpdateAllViews(NULL) を
// 呼び出すことです。
----------------------------------------------------------------
しかし、上記の方法ではDialogにはイベントが届きませんでした。
UpdateAllViewsの場合にはOnUpdateをCFormViewクラスで
呼び出せばよいと書いてありましたが、
単純にイベントとwParam、lParamを上げたいだけなので
なにか簡単な方法があったらと思い書かせて頂いてます。ぺこりぃ~
しかし、最終的にはこの方法でいくか検討してみます。
【汎さん】
今回、お聞きしたかったのはCDocumentからCFormViewクラス及びCDialogクラスへ
イベントを通知したいと言うことです。
しかし、汎さんが教えていただいたことは別の機会に活用させていただきます。
ありがとうございます。
> しかし、上記の方法ではDialogにはイベントが届きませんでした。
当然です。DialogはViewではありませんから。
だからこそ
ダイアログのポインタをDocumentに教えておけば、
ダイアログのメソッドをDocumentから呼び出せます。
というわけで。
CDocumentの関数からCViewやCDialogにSendMessageを発行するという意味ではなかったの
か!
失礼しました。
CView と CDialog で CCmdTarget::OnCmdMsgをオーバーライドして特定IDのルーティング
を変えるなんて手もありますね
【επιστημηさん】
はい、その通りです。
メッセージを書き込んでから、「あぅぅ・・・」と気がつきました。
【汎さん】
これもまた私の勘違いでした。
教えていただいた方法でいいのでした。
汎さんが教えていただいた方法で、イベントをまとめて1つの関数に
送り込むことなんてのはできるんでしょうか?
質問を投げつつ、ここはクローズとさせていただきます。
επιστημηさん、汎さん、ありがとうございました。