はじめまして、TTです。
サブメニュー項目の無効化にしたいのですが、
うまくできませんでした。
CWnd* pWnd = AfxGetMainWnd();
CMenu* pMenu = pWnd->GetMenu(); // メニューのハンドル取得
CMenu* pSubMenu = pMenu->GetSubMenu(2);
pSubMenu->EnableMenuItem(11, MF_GRAYED | MF_BYPOSITION ); // 無効
pWnd->DrawMenuBar();
以上で、サブメニュー項目2の11番目の項目色が変わっていません。
ちなみに、
CWnd* pWnd = AfxGetMainWnd();
CMenu* pMenu = pWnd->GetMenu(); // メニューのハンドル取得
pMenu ->EnableMenuItem(2, MF_GRAYED | MF_BYPOSITION ); // 無効
pWnd->DrawMenuBar();
サブメニュー項目2は色が変わっています。
何か足りないですか。
よろしくお願いします。
環境:.Net2002 MFC使用
よろしくお願いします。
メインメニューは、デフォルトで
UPDATE_COMMAND_UI メッセージ
処理が有効になっているので、EnableMenuItem()を使用するためには、
CFrameWnd::m_bAutoMenuEnable = FALSE
にせねばなりません。
素直に、
UPDATE_COMMAND_UI メッセージ
を処理するのも1つの手です。
詳しくは以下をどうぞ。
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_MENUenable.html
bunさん:
アドバイスありがとう。
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_MENUenable.html
を見たのですが、
一点が不明があります。
方法1:UPDATE_COMMAND_UIメッセージハンドラを使います。
例:
if( GetStyle() & WS_MAXIMIZE )
pCmdUI->Enable(FALSE);
else
pCmdUI->Enable(TRUE);
のif( GetStyle() & WS_MAXIMIZE )部分に不明があります。
自分で使っていいる普通のメニュー項目ですが、
三つの項目連動したいのですが、
ID_EDITDELETE_POINT
ID_EDITADD_POINT
ID_EDITMOVE_POINT
if( *** )
三つの中に有効になっている項目を判断するの仕方がわかりません。
よろしくお願いします。
えーと、難しいことは何もないはずなので、何か勘違いされている
可能性が大とみて、簡単に解説します。
まず、UPDATE_COMMAND_UI メッセージ の ハンドラは、
3つのメニューに対して、それぞれ実装します。
ID_EDITDELETE_POINT
ID_EDITADD_POINT
ID_EDITMOVE_POINT
なので、OnUpdate...()関数内では、自分自身のメニューをどうするか?
だけをコーディングします。
たとえば、
ON_UPDATE_COMMAND_UI(ID_EDITADD_POINT, OnUpdateEditAddPoint)
なら、
OnUpdateEditAddPoint()
関数内で、
pCmdUI->Enable(TRUE);
で、ID_EDITADD_POINTメニューが有効
pCmdUI->Enable(FALSE);
で、ID_EDITADD_POINTメニューが無効
になります。
UPDATE_COMMAND_UIは
CMainFrameクラスじゃなくて、Viewクラスにあると、
問題が解決しました。
ただし、方法2の場合EnableMenuItem()
CFrameWnd* pFrame = static_cast<CFrameWnd*>(AfxGetMainWnd());
pFrame->m_bAutoMenuEnable = FALSE; //追加
CWnd* pWnd = AfxGetMainWnd();
CMenu* pMenu = pWnd->GetMenu(); // メニューのハンドル取得
CMenu* pSubMenu = pMenu->GetSubMenu(2);
pSubMenu->EnableMenuItem(ID_EDITDELETE_POINT, MF_GRAYED | MF_BYCOMMAND); // 無効
pWnd->DrawMenuBar();
色が変わりませんでした。
よろしくお願いします。
おそらく、タイミングの問題ですね。
HPの例では、
m_bAutoMenuEnable = FALSE;
を
CMainFrameクラスのコンストラクタ
でやっていますよね。
同じようにしてみてください。
bunさん:
返事がありがとう。
>同じようにしてみてください。
>>CFrameWnd* pFrame = static_cast<CFrameWnd*>(AfxGetMainWnd());
>>pFrame->m_bAutoMenuEnable = FALSE; //追加
Viewクラスに
m_bAutoMenuEnable = FALSE; 追加したのですが
error C2065: 'm_bam_bAutoMenuEnable' : 定義されていない識別子です。
どうしたらいいでしょうか
よろしくお願いします。
>m_bAutoMenuEnable = FALSE; 追加したのですが
m_bAutoMenuEnable
>error C2065: 'm_bam_bAutoMenuEnable' : 定義されていない識別子です。
m_bam_bAutoMenuEnable
「m_ba」がくっついてる
ryoさん
>「m_ba」がくっついてる
すみません、
で、
error C2065: 'm_bAutoMenuEnable' : 定義されていない識別子です。
同じエラーがでっています。
よろしくお願いします。
Viewのコンストラクタに
CSampleView::CSampleView(){
m_bAutoMenuEnable = FALSE;
}
error C2065: 'm_bAutoMenuEnable' : 定義されていない識別子です。
エラーがでっています。
よろしくお願いします。
CFrameWnd::m_bAutoMenuEnableなのでCViewクラスのメンバでは有りませんよね。
CFraemWndのコンストラクタで設定すれば良いと思いますよ。
この辺はなんでエラーが出るのかわからないのであれば、
C++言語の文法の勉強をされる事をお勧めします。
MFCを使って開発をするのであれば、C++言語の基礎知識は必須です。
いきなりMFCを使うのではなくてC++言語の勉強を一通り行なってから
MFCにステップアップする事をお勧めします。
C++言語の勉強をする時は、C++言語の入門書を用意して
コンソールアプリケーションでやってみる事をお勧めします。
ウインドウが絡むとMFCを使う事になるので最初はコンソールの方が良いです。
コンソールアプリもやってみると案外面白いですよ。
あうあう。
誤字。
わかると思いますが、念の為。
CFraemWnd -> CFrameWnd
PATIO さん
>いきなりMFCを使うのではなくてC++言語の勉強を一通り行なってから
>MFCにステップアップする事をお勧めします。
そうですね、ありがとう。
CFraemWndのコンストラクタで
CMainFrame::CMainFrame()
{
m_bAutoMenuEnable = FALSE;
}
やっぱり、色が変わりませんでした。
よろしくお願いします。
最初のソースコード通り、
pSubMenu->EnableMenuItem(11, MF_GRAYED | MF_BYPOSITION ); // 無効
ではどうでしょう?
それがOKなら、
CMenu* pSubMenu = pMenu->GetSubMenu(2);
の 2 の数字が間違っているとか、
ID_EDITDELETE_POINT
の ID の数字が他のIDと重複しているとか、
何か、上記のソースコードだけでは分からない原因の可能性が大
bun さん
ご回答ありがとう。
> pSubMenu->EnableMenuItem(11, MF_GRAYED | MF_BYPOSITION ); // 無効
>ではどうでしょう?
OKでした。
> ID_EDITDELETE_POINT
>の ID の数字が他のIDと重複しているとか
調べたら、重複していないです(まったく同じです)。
もう一度、プロパティからコピーした、
今回が色が変わりました。(原因がわかりません)
ほんとにありがとうございました。