いつもお世話になっています、ccです。
MFCサンプル:Collectを見ています、
幾つかのわかりにくい所があります。
1.Viewの変更メニュー(Example)の使い方
ON_COMMAND_RANGE(ID_STRINGLIST, ID_MAP, OnExample)
普段、インベトハンドラの追加を通じてやってますが、
ここで、そうではない。
手動でやっていますか。
2.自分でメニューを追加したのですが、(”自作View”、 ID_View1)
以下の通りです。
void CMainFrame::OnExample(UINT nCmdID)
{
…
CRuntimeClass* pNewViewClass;
switch (nCmdID)
{
case ID_STRINGLIST:
pNewViewClass = RUNTIME_CLASS(CStringListView);
break;
case ID_TYPEDLIST:
pNewViewClass = RUNTIME_CLASS(CTypedPtrListView);
break;
…
//追加したID
case ID_View1:
pNewViewClass = RUNTIME_CLASS(CTypedPtrListView);
break;
default:
ASSERT(0);
return;
}
結局、ID_View1は有効していなかった。(”自作View”の色がグレになった。)
どうやったら、有効になるのでしょうか。
(言い換えるとID_STRINGLISTはどういうふうに有効になったか)
よろしくお願いします。
環境:XP .Net2002 MFC
ON_COMMAND_RANGE(ID_STRINGLIST, ID_MAP, OnExample)
は、IDがID_STRINGLIST以上で、かつID_MAP以下ならOnExample()を
実行という意味です。
従って「ID_View1」の値が上記の範囲でないとメニューは有効になりません。
ID_STRINGLISTからID_MAPは値が連番になっていますか?
仲澤@失業者さん、Blueさん
ご回答ありがとう。
>従って「ID_View1」の値が上記の範囲でないとメニューは有効になりません。
なるほど、やってみたらその通りです。
ON_COMMAND_RANGE(ID_STRINGLIST, ID_View1, OnExample)
、”自作View”は有効になりました。
どうもありがとうございました。
解決チェックが忘れた。
質問に対する答えは全てヘルプやMSDNに書いてあるのに
http://msdn.microsoft.com/ja-jp/library/9ab3z9tb(VS.80).aspx
ON_COMMAND_RANGEで検索すれば一発で引っかかるけど。
> 普段、インベトハンドラの追加を通じてやってますが、
> ここで、そうではない。
> 手動でやっていますか。
「メッセージ マップの範囲の自動サポートはないので、ユーザー自身がこのマクロを記
述する必要があります。」
> どうやったら、有効になるのでしょうか。
> (言い換えるとID_STRINGLISTはどういうふうに有効になったか)
「ある範囲のコマンド ID を 1 つのメンバ関数に割り当てるには ON_COMMAND_RANGE を
使用します。1 つのコマンドを 1 つのメンバ関数に割り当てるには ON_COMMAND を使用
します。メッセージ マップのエントリに一致するコマンド ID は 1 つだけです。つま
り、コマンドを複数のハンドラに割り当てることはできません。メッセージ マップ範囲
の詳細については、「範囲内のメッセージのハンドラ」を参照してください。」
> なるほど、やってみたらその通りです。
質問や、やってみる前に検索することを強くお勧めします。
maruさん
ご指摘ありがとう。
>質問や、やってみる前に検索することを強くお勧めします。
当時、検索のほうがうまくできませんでした。
アトバイス得てから、検索ができました。
ご指摘ありがとう。