ポップアップメニューのセパレータ – プログラミング – Home

ポップアップメニューのセパレータ
 
通知
すべてクリア

[解決済] ポップアップメニューのセパレータ


ねこ
 ねこ
(@ねこ)
ゲスト
結合: 22年前
投稿: 94
Topic starter  

環境→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番目のセパレータのみを消すにはどうすればよいでしょうか?


引用未解決
トピックタグ
ねこ
 ねこ
(@ねこ)
ゲスト
結合: 22年前
投稿: 94
Topic starter  

すいません、訂正です

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

×:C-x ⇒ ○:D-x


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

MF_BYCOMMANDではなくMF_BYPOSITIONならどうですか?


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

>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
 REE
(@REE)
ゲスト
結合: 23年前
投稿: 240
 

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

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


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

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

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

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


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

>REE様

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

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

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

>dairygoods様

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

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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