mcrblog

vcpp-ml

2001年09月

30

[vcpp 00055632] Re: メッセージハンドラの実装先

質問しました斎藤です。

From: "PTVI" p...@h4.dion.ne.jp
Subject: [vcpp 00055631]
> クリックなどの通知はボタンなどに限らず、
> 特殊のものを除いて
> 親ウィンドウに送られます。
>
> もしビューで処理しなかったら
> 対応するドキュメントにメッセージが送られるように
> MFCが作られているからです。
>
> コマンド ルーティングという機能です。

コマンドルーティングの勉強をはじめました。
CCmdTargetの理解が必要みたいですね。普段、見かけていながら黙殺していた
クラスです。
理解に少し時間がかかりそうですので、ご質問の回答だけ先にお送りします。

> CMyAppなどで処理する方が好都合なケースとは何ですか。
> もしかして、複数の種類のビュークラスとドキュメントクラスがあるけど、
> 共通の処理だからCMyAppに記述したいということですか。

PTVIさんの言われる通りです。また、この処理で扱う変数の大部分がCMyApp
メンバーなので、他のクラスで処理しようとするとAfxGetApp()でクラスポイ
ンタを取得して、メンバー変数の前に「p->」を付けなければならない。
そういう所が煩わしいと考えました。

> 実装例
> ビューのボタンでなく、フレームウィンドウについているメニューに置く。
> 共通な処理をクラスにして、ビューを多重継承にする。
> 共通な処理を非クラスの関数にして、各種ビューから呼び出す。
> 各種ビューからCMyAppオブジェクトのメンバ関数を呼び出す。

今回の件では、ビューのボタンを採用したいので、4番目の「CMyAppメンバ
呼び出し」が最適と思われます。
(呼び出すために1回だけはAfxGetApp()が必要ですが...)

PTVIさん、ご指導ありがとうございました。
30

[vcpp 00055632] Re: メッセージハンドラの実装先

質問しました斎藤です。

From: "PTVI" p...@h4.dion.ne.jp
Subject: [vcpp 00055631]
> クリックなどの通知はボタンなどに限らず、
> 特殊のものを除いて
> 親ウィンドウに送られます。
>
> もしビューで処理しなかったら
> 対応するドキュメントにメッセージが送られるように
> MFCが作られているからです。
>
> コマンド ルーティングという機能です。

コマンドルーティングの勉強をはじめました。
CCmdTargetの理解が必要みたいですね。普段、見かけていながら黙殺していた
クラスです。
理解に少し時間がかかりそうですので、ご質問の回答だけ先にお送りします。

> CMyAppなどで処理する方が好都合なケースとは何ですか。
> もしかして、複数の種類のビュークラスとドキュメントクラスがあるけど、
> 共通の処理だからCMyAppに記述したいということですか。

PTVIさんの言われる通りです。また、この処理で扱う変数の大部分がCMyApp
メンバーなので、他のクラスで処理しようとするとAfxGetApp()でクラスポイ
ンタを取得して、メンバー変数の前に「p->」を付けなければならない。
そういう所が煩わしいと考えました。

> 実装例
> ビューのボタンでなく、フレームウィンドウについているメニューに置く。
> 共通な処理をクラスにして、ビューを多重継承にする。
> 共通な処理を非クラスの関数にして、各種ビューから呼び出す。
> 各種ビューからCMyAppオブジェクトのメンバ関数を呼び出す。

今回の件では、ビューのボタンを採用したいので、4番目の「CMyAppメンバ
呼び出し」が最適と思われます。
(呼び出すために1回だけはAfxGetApp()が必要ですが...)

PTVIさん、ご指導ありがとうございました。
29

[vcpp 00055631] Re: メッセージハンドラの実装先

PTVIです。

> ボタンの処理を実装するクラスにより、その処理が動く場合と
> そうでない場合があるようですが、その理由が理解できません。

> 環境:VC++6.0 SP4 MFC ビューの基底=CFormView

> 実装処理:ボタンが1回押されたとき(BN_CLICKED)

> 実装先クラスと動作:
> CMyApp 実行されない
> CMainFrame 実行されない
> CChileFrame 実行されない
> CMyView 実行される
> CMyDoc 実行される
> (CMyViewとCMyDoc両方に実装するとCMyViewだけ実行)

> クラスウィザードによるデフォルトの実装先はCMyViewに
> なりますが、行う処理とクラスとの関係により

クリックなどの通知はボタンなどに限らず、
特殊のものを除いて
親ウィンドウに送られます。

もしビューで処理しなかったら
対応するドキュメントにメッセージが送られるように
MFCが作られているからです。

コマンド ルーティングという機能です。

> CMyAppなどで処理する方が好都合なケースがあります。

そうではないケースもあるわけですよね。
コマンド ルーティングの動作はMSDNに書いてあります。

CMyAppなどで処理する方が好都合なケースとは何ですか。
もしかして、複数の種類のビュークラスとドキュメントクラスがあるけど、
共通の処理だからCMyAppに記述したいということですか。

実装例
ビューのボタンでなく、フレームウィンドウについているメニューに置く。
共通な処理をクラスにして、ビューを多重継承にする。
共通な処理を非クラスの関数にして、各種ビューから呼び出す。
各種ビューからCMyAppオブジェクトのメンバ関数を呼び出す。

コマンド ルーティングはオーバライドできますよ。
改造してみたらどうでしょうか。
ビューからフレームウィンドウへコマンドルーティングして、
もし処理をどこにも書かなかったら無限ループにならないのかなあ??。
29

[vcpp 00055631] Re: メッセージハンドラの実装先

PTVIです。

> ボタンの処理を実装するクラスにより、その処理が動く場合と
> そうでない場合があるようですが、その理由が理解できません。

> 環境:VC++6.0 SP4 MFC ビューの基底=CFormView

> 実装処理:ボタンが1回押されたとき(BN_CLICKED)

> 実装先クラスと動作:
> CMyApp 実行されない
> CMainFrame 実行されない
> CChileFrame 実行されない
> CMyView 実行される
> CMyDoc 実行される
> (CMyViewとCMyDoc両方に実装するとCMyViewだけ実行)

> クラスウィザードによるデフォルトの実装先はCMyViewに
> なりますが、行う処理とクラスとの関係により

クリックなどの通知はボタンなどに限らず、
特殊のものを除いて
親ウィンドウに送られます。

もしビューで処理しなかったら
対応するドキュメントにメッセージが送られるように
MFCが作られているからです。

コマンド ルーティングという機能です。

> CMyAppなどで処理する方が好都合なケースがあります。

そうではないケースもあるわけですよね。
コマンド ルーティングの動作はMSDNに書いてあります。

CMyAppなどで処理する方が好都合なケースとは何ですか。
もしかして、複数の種類のビュークラスとドキュメントクラスがあるけど、
共通の処理だからCMyAppに記述したいということですか。

実装例
ビューのボタンでなく、フレームウィンドウについているメニューに置く。
共通な処理をクラスにして、ビューを多重継承にする。
共通な処理を非クラスの関数にして、各種ビューから呼び出す。
各種ビューからCMyAppオブジェクトのメンバ関数を呼び出す。

コマンド ルーティングはオーバライドできますよ。
改造してみたらどうでしょうか。
ビューからフレームウィンドウへコマンドルーティングして、
もし処理をどこにも書かなかったら無限ループにならないのかなあ??。
28

[vcpp 00055630] メッセージハンドラの実装先

斎藤と申します。
お世話になります。

ボタンの処理を実装するクラスにより、その処理が動く場合と
そうでない場合があるようですが、その理由が理解できません。

環境:VC++6.0 SP4 MFC ビューの基底=CFormView

実装処理:ボタンが1回押されたとき(BN_CLICKED)

実装先クラスと動作:
CMyApp 実行されない
CMainFrame 実行されない
CChileFrame 実行されない
CMyView 実行される
CMyDoc 実行される
(CMyViewとCMyDoc両方に実装するとCMyViewだけ実行)

クラスウィザードによるデフォルトの実装先はCMyViewに
なりますが、行う処理とクラスとの関係により
CMyAppなどで処理する方が好都合なケースがあります。

よろしくお願いします。
記事検索
Amazon.co.jp
  • ライブドアブログ