ポップアップメニューのセパレータ

[戻る]
ねこ 2005/02/24(木) 11:52:55
環境→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番目のセパレータのみを消すにはどうすればよいでしょうか?

ねこ 2005/02/24(木) 11:54:40
すいません、訂正です

>そこで右クリックされたダイアログによってC-xの機能が不必要な場合があるので
>ソース上でC-xのメニューを削除することにしました。

↓

×:C-x ⇒ ○:D-x

ku 2005/02/24(木) 12:15:00
MF_BYCOMMANDではなくMF_BYPOSITIONならどうですか?

ねこ 2005/02/24(木) 14:26:49
>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でエラーの返ってくる原因など、何か予想されることが
ありましたら、ご教授お願いします。

REE 2005/02/24(木) 14:38:04
>menu.Remove/Delete Menu(11,MF_BYPOSITION)の戻り値が1(0以外)であるので、
>エラーなのは判るのですが、原因がわかりません。

どちらも、0以外が正常ですよ。

dairygoods 2005/02/24(木) 14:46:05
ひょっとして、操作しようとしているメニューは、
menu のサブメニューではないですか?

MF_BYCOMMAND は、サブメニューまでたどってくれますが、
MF_BYPOSITION の場合は、そのメニュー階層しか操作できません。

CMenu* sub = menu.GetSubMenu(番号);
sub->RemoveMenu(...);

ねこ 2005/02/24(木) 15:08:00
[[解決]]
>REE様

>どちらも、0以外が正常ですよ。

そうでした。私、日本語を理解できてなかったようです。お恥ずかしい・・・
ご指摘ありがとうございました。

ヘルプより↓
*>戻り値
*>正常終了した場合は 0 以外を返します。それ以外の場合は 0 を返します。


>dairygoods様 

>ひょっとして、操作しようとしているメニューは、
>menu のサブメニューではないですか?

その通りでした!
下記、ソースでうまくいきました。本当にありがとうございます!

pop = menu.GetSubMenu(0);
pop ->RemoveMenu((pop->GetMenuItemCount()-1),MF_BYPOSITION);

古いスレッドには追加発言できません。