CView クラスとダイアログがあり、ユーザーが [Accept] ボタンをクリックすると、ダイアログ オブジェクトからデータを取得したいので、ボタンのイベントとそのハンドラーを CView クラスに追加しました。これらはすべて Visual Studio 2010 のメニューを使用して行われたため、コードを台無しにすることはありませんでした。
CView クラス:
BEGIN_MESSAGE_MAP(CSurface3DView, CView)
ON_BN_CLICKED(ID_RANGE_OK, &CSurface3DView::OnBnClickedRangeOk)
END_MESSAGE_MAP()
...
void CSurface3DView::OnBnClickedRangeOk()
{
//things i need to do
}
問題は、[OK] ボタンをクリックしたときに OnBnClickedRangeOk() 関数を呼び出さないことです。
Dialog クラスから CView クラスの関数を呼び出すこともできますが、親クラスのインスタンスを使用することはできません。これは、そのヘッダーを含める必要があり、CView クラスを宣言することで解決できる循環的な包含を引き起こすためです。それを含めずにDialogヘッダーに入れますが、そのメソッドにはアクセスできません。
ダイアログ ボタンのメッセージ ハンドルをダイアログ クラスの外に置くことはできないのでしょうか。ダイアログ ボタンが押されたときにのみ、CView クラスで特定の関数を実行するにはどうすればよいですか?
編集:
これで解決しました。CDialog の SendMessage(hWnd, MESSAGE ,...) メソッドを使用して、CDialog のコンストラクターで取得するポインターを親にメッセージを送信したので、特定の Class を宣言する必要はありません。親と私は包含の問題を抱えていません。
ここで見つけた詳細: http://forums.codeguru.com/showthread.php?385590-How-to-SendMessage-from-child-window-to-parent