サブメニュー項目の無効化 – プログラミング – Home

サブメニュー項目の無効化
 
通知
すべてクリア

[解決済] サブメニュー項目の無効化


TT
 TT
(@TT)
ゲスト
結合: 22年前
投稿: 10
Topic starter  

はじめまして、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使用
よろしくお願いします。


引用未解決
トピックタグ
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

メインメニューは、デフォルトで
UPDATE_COMMAND_UI メッセージ
処理が有効になっているので、EnableMenuItem()を使用するためには、
CFrameWnd::m_bAutoMenuEnable = FALSE
にせねばなりません。

素直に、
UPDATE_COMMAND_UI メッセージ
を処理するのも1つの手です。

詳しくは以下をどうぞ。
http://www.alpha-net.ne.jp/users2/uk413/vc/VCT_MENUenable.html


返信引用
TT
 TT
(@TT)
ゲスト
結合: 22年前
投稿: 10
Topic starter  

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( *** )
三つの中に有効になっている項目を判断するの仕方がわかりません。

よろしくお願いします。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

えーと、難しいことは何もないはずなので、何か勘違いされている
可能性が大とみて、簡単に解説します。

まず、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メニューが無効
になります。


返信引用
TT
 TT
(@TT)
ゲスト
結合: 22年前
投稿: 10
Topic starter  

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();

色が変わりませんでした。

よろしくお願いします。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

おそらく、タイミングの問題ですね。

HPの例では、
m_bAutoMenuEnable = FALSE;

CMainFrameクラスのコンストラクタ
でやっていますよね。

同じようにしてみてください。


返信引用
TT
 TT
(@TT)
ゲスト
結合: 22年前
投稿: 10
Topic starter  

bunさん:
返事がありがとう。

>同じようにしてみてください。

>>CFrameWnd* pFrame     = static_cast<CFrameWnd*>(AfxGetMainWnd());
>>pFrame->m_bAutoMenuEnable = FALSE;       //追加
Viewクラスに
m_bAutoMenuEnable = FALSE; 追加したのですが

error C2065: 'm_bam_bAutoMenuEnable' : 定義されていない識別子です。

どうしたらいいでしょうか
よろしくお願いします。


返信引用
ryo
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

>m_bAutoMenuEnable = FALSE; 追加したのですが

m_bAutoMenuEnable

>error C2065: 'm_bam_bAutoMenuEnable' : 定義されていない識別子です。

m_bam_bAutoMenuEnable

「m_ba」がくっついてる


返信引用
TT
 TT
(@TT)
ゲスト
結合: 22年前
投稿: 10
Topic starter  

ryoさん

>「m_ba」がくっついてる
すみません、
で、
error C2065: 'm_bAutoMenuEnable' : 定義されていない識別子です。
同じエラーがでっています。

よろしくお願いします。


返信引用
TT
 TT
(@TT)
ゲスト
結合: 22年前
投稿: 10
Topic starter  

Viewのコンストラクタに
CSampleView::CSampleView(){
 m_bAutoMenuEnable = FALSE; 

error C2065: 'm_bAutoMenuEnable' : 定義されていない識別子です。
エラーがでっています。

よろしくお願いします。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

CFrameWnd::m_bAutoMenuEnableなのでCViewクラスのメンバでは有りませんよね。
CFraemWndのコンストラクタで設定すれば良いと思いますよ。

この辺はなんでエラーが出るのかわからないのであれば、
C++言語の文法の勉強をされる事をお勧めします。
MFCを使って開発をするのであれば、C++言語の基礎知識は必須です。
いきなりMFCを使うのではなくてC++言語の勉強を一通り行なってから
MFCにステップアップする事をお勧めします。
C++言語の勉強をする時は、C++言語の入門書を用意して
コンソールアプリケーションでやってみる事をお勧めします。
ウインドウが絡むとMFCを使う事になるので最初はコンソールの方が良いです。

コンソールアプリもやってみると案外面白いですよ。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

あうあう。
誤字。
わかると思いますが、念の為。

CFraemWnd -> CFrameWnd


返信引用
TT
 TT
(@TT)
ゲスト
結合: 22年前
投稿: 10
Topic starter  

PATIO さん
>いきなりMFCを使うのではなくてC++言語の勉強を一通り行なってから
>MFCにステップアップする事をお勧めします。
そうですね、ありがとう。

CFraemWndのコンストラクタで
CMainFrame::CMainFrame()
{
 m_bAutoMenuEnable = FALSE;
}
やっぱり、色が変わりませんでした。

よろしくお願いします。


返信引用
bun
 bun
(@bun)
ゲスト
結合: 24年前
投稿: 761
 

最初のソースコード通り、
pSubMenu->EnableMenuItem(11, MF_GRAYED | MF_BYPOSITION ); // 無効
ではどうでしょう?

それがOKなら、
CMenu* pSubMenu = pMenu->GetSubMenu(2);
の 2 の数字が間違っているとか、
ID_EDITDELETE_POINT
の ID の数字が他のIDと重複しているとか、
何か、上記のソースコードだけでは分からない原因の可能性が大


返信引用
TT
 TT
(@TT)
ゲスト
結合: 22年前
投稿: 10
Topic starter  

bun さん
ご回答ありがとう。

> pSubMenu->EnableMenuItem(11, MF_GRAYED | MF_BYPOSITION ); // 無効
>ではどうでしょう?
OKでした。

> ID_EDITDELETE_POINT
>の ID の数字が他のIDと重複しているとか

調べたら、重複していないです(まったく同じです)。
もう一度、プロパティからコピーした、
今回が色が変わりました。(原因がわかりません)

ほんとにありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました