環境→Win2000、VC++.NET、MFC使用
VCのリソースエディタによって以下のようなメニューを作成し、
ダイアログ上で右クリックした時、ポップアップメニューとして表示しています。
***********
* *
* A-1(&A) *
* A-2(&S) *
* A-3(&D) *
* ----- *
* B-1(&B) *
* B-2(&N) *
* B-3(&M) *
* ----- *
* C-1(&C) *
* C-2(&V) *
* C-3(&B) *
* ----- *
* D-1(&D) *
* D-2(&F) *
* D-3(&G) *
* *
********
※「-----」はセパレータです。
そこで右クリックされたダイアログによってC-xの機能が不必要な場合があるので
ソース上でC-xのメニューを削除することにしました。
menu.RemoveMenu(ID_D1,MF_BYCOMMAND);
menu.RemoveMenu(ID_D2,MF_BYCOMMAND);
menu.RemoveMenu(ID_D3,MF_BYCOMMAND);
そうするとポップアップメニューは以下のようになります。
********
* *
* A-1(&A) *
* A-2(&S) *
* A-3(&D) *
* ----- *
* B-1(&B) *
* B-2(&N) *
* B-3(&M) *
* ----- *
* C-1(&C) *
* C-2(&V) *
* C-3(&B) *
* ----- * ← このセパレータを消したい
***********
3番目のセパレータのみを消すにはどうすればよいでしょうか?
すいません、訂正です
>そこで右クリックされたダイアログによってC-xの機能が不必要な場合があるので
>ソース上でC-xのメニューを削除することにしました。
↓
×:C-x ⇒ ○:D-x
MF_BYCOMMANDではなくMF_BYPOSITIONならどうですか?
>Ku様
レス、ありがとうございます。
ところが、MF_BYPOSITIONを使うとセパレータに限らず、通常のメニューの削除も
できないのです。BYPOSITIONの数え方は以下でよいのでしょうか?
***********
* *
* A-1(&A) * ←0
* A-2(&S) * ←1
* A-3(&D) * ←2
* ----- * ←3
* B-1(&B) * ←4
* B-2(&N) * ←5
* B-3(&M) * ←6
* ----- * ←7
* C-1(&C) * ←8
* C-2(&V) * ←9
* C-3(&B) * ←10
* ----- * ←11
* D-1(&D) * ←12
* D-2(&F) * ←13
* D-3(&G) * ←14
* *
********
menu.Remove/Delete Menu(11,MF_BYPOSITION)の戻り値が1(0以外)であるので、
エラーなのは判るのですが、原因がわかりません。
(RemoveとDeleteの違いも・・・)
ですので、MF_BYCOMMANDのほうを使おうと思ったのですが・・・
ちなみに
menu.RemoveMenu(0,MF_BYCOMMAND);
とすると、こうなります。(↓)
********
* *
* A-1(&A) *
* A-2(&S) *
* A-3(&D) *
* B-1(&B) *
* B-2(&N) *
* B-3(&M) *
* ----- *
* C-1(&C) *
* C-2(&V) *
* C-3(&B) *
* ----- *
********
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
menu.RemoveMenu(0,MF_BYCOMMAND);
menu.RemoveMenu(0,MF_BYCOMMAND);
menu.RemoveMenu(0,MF_BYCOMMAND);
とするとこうなります。(↓)
********
* *
* A-1(&A) *
* A-2(&S) *
* A-3(&D) *
* B-1(&B) *
* B-2(&N) *
* B-3(&M) *
* C-1(&C) *
* C-2(&V) *
* C-3(&B) *
***********
このやり方では、セパレータは上から順にしか消せないのでしょうか?
またMF_BYPOSITIONでエラーの返ってくる原因など、何か予想されることが
ありましたら、ご教授お願いします。
>menu.Remove/Delete Menu(11,MF_BYPOSITION)の戻り値が1(0以外)であるので、
>エラーなのは判るのですが、原因がわかりません。
どちらも、0以外が正常ですよ。
ひょっとして、操作しようとしているメニューは、
menu のサブメニューではないですか?
MF_BYCOMMAND は、サブメニューまでたどってくれますが、
MF_BYPOSITION の場合は、そのメニュー階層しか操作できません。
CMenu* sub = menu.GetSubMenu(番号);
sub->RemoveMenu(...);
>REE様
>どちらも、0以外が正常ですよ。
そうでした。私、日本語を理解できてなかったようです。お恥ずかしい・・・
ご指摘ありがとうございました。
ヘルプより↓
*>戻り値
*>正常終了した場合は 0 以外を返します。それ以外の場合は 0 を返します。
>dairygoods様
>ひょっとして、操作しようとしているメニューは、
>menu のサブメニューではないですか?
その通りでした!
下記、ソースでうまくいきました。本当にありがとうございます!
pop = menu.GetSubMenu(0);
pop ->RemoveMenu((pop->GetMenuItemCount()-1),MF_BYPOSITION);