一個古老的問題?

时间:2022-04-10 16:05:23
我在窗體的系統菜單中添加了一項自定義的菜單,在任務欄上單擊右鍵,彈出的菜單上沒有自定義的,但在窗體上有,這是為什麼?我的系統是XP的,代碼是這樣的:  
       MENUITEMINFO    Info;  
       const  AnsiString  MenuString  =  "¨t²Î»¡©ú";  
 
       //add    separator  
       Info.cbSize=sizeof(MENUITEMINFO);  
       Info.fMask=MIIM_TYPE    ¦  MIIM_STATE    ¦  MIIM_ID  ;  
       Info.fType=MFT_STRING;                                              //  menu  type  is  string  
       Info.fState=MFS_ENABLED;                                          //  menu  item  is  enabled  
       Info.wID  =IDS_CUSTOMMENUID;                                  //  id  of  menu  item  
       Info.hSubMenu=NULL;                                                    //  no  sub  menu  
       Info.hbmpChecked=NULL;                                              //  no  check  bitmap  
       Info.dwItemData=0;                                                      //  no  uncheck  bitmap  
       Info.dwTypeData=NULL;                                              //  no  item  data  
       Info.cch=0;                                                                  //  string  of  menu  item  
       Info.hbmpItem=0;                                                        //  last  item  not  used  
 
       HMENU  SysMenu  =  GetSystemMenu(Handle,  FALSE);  
       InsertMenuItem  (SysMenu,  SC_CLOSE,  TRUE,  &Info);  
請高手指點.

5 个解决方案

#1


具体可以通过下面的步骤实现:
• 在系统菜单上添加所需的菜单项。
• 为新添加的菜单项定义OnClick事件的处理过程。

下面的例程中,在系统菜单中添加了一个“前端显示( A )”菜单项,通过该菜单项,可以使窗体始终显示在最前端或为普通窗体模式。具体实现过程如下:

1) 通过菜单File | New Application创建一个新的工程。
2) 添加窗体Form1的OnCreate事件的处理过程如下:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
// 设置系统菜单
AppendMenu(GetSystemMenu(Handle, false), MF_SEPARATOR, 0, " ") ;
AppendMenu(GetSystemMenu(Handle, false), MF_STRING, 200, "前端显示( & A )") ;
3) 在文件U n i t 1 . h头文件中增加如下语句:
. . .
#include <Menus.hpp>
. . .
4) 在TForm1的类型定义中,添加系统菜单中新建菜单项的OnClick事件的处理过程的声明:
. . .
public: // User declarations
__fastcall TForm1(TComponent* Owner);
MESSAGE void __fastcall SystemMenuCommand(TWMMenuSelect &Msg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_SYSCOMMAND, TWMMenuSelect, SystemMenuCommand);
END_MESSAGE_MAP(TForm);
};
5) 手工添加系统菜单中新建菜单项的O n C l i c k事件的处理过程如下:
void __fastcall TForm1::SystemMenuCommand(TWMMenuSelect &Msg)
{
TForm::Dispatch(&Msg);
if( Msg.IDItem==200 )
{
if( Form1->FormStyle==fsNormal )
{
// 将窗体设置为总在前端显示
Form1->FormStyle = fsStayOnTop;
// 重新设置系统菜单
AppendMenu(GetSystemMenu(Handle,False), MF_SEPARATOR, 0, " ") ;
AppendMenu(GetSystemMenu(Handle,False), MF_STRING, 200, "前端显示& A )") ;
// 在新添加的菜单项前增加一个选中标志
ModifyMenu(GetSystemMenu(Handle,False),200,MF_CHECKED,200,“前端显示(&A )”);
}
}
else
{
// 将窗体设置为普通模式
Form1->FormStyle = fsNormal;
//重新设置系统菜单
AppendMenu(GetSystemMenu(Handle,False), MF_SEPARATOR, 0, " ") ;
AppendMenu(GetSystemMenu(Handle,False), MF_STRING, 200, "前端显示( & A )");
}
}
6) 编译、链接并运行程序,测试系统菜单中新添加的菜单项的效果

#2


樓上的代碼效果我也實現了,你的代碼也沒有實現我所說的功能,即在任務欄右擊鼠標右鍵也彈出自定義的菜單項.是不是與XP的系統有關,如何實現這一功能呀?

#3


gz

#4


我猜测是这样的,你试验以下:

HMENU  SysMenu  =  GetSystemMenu(Handle,  FALSE); //窗口上面的
InsertMenuItem  (SysMenu,  SC_CLOSE,  TRUE,  &Info);

HMENU  SysMenu  =  GetSystemMenu(Application->Handle,  FALSE); //任务栏上面的
InsertMenuItem  (SysMenu,  SC_CLOSE,  TRUE,  &Info);

#5


樓上的說的對,我也發現了,但是又出了一個問題,我沒有辦法映射菜單的消息呀,
請問怎麼做呀,我發現任務欄上的消息在窗體上映射不到,這個怎麼做才行呀,要
用窗口子類化技術嗎,這個不太會,如果是給個例子好嗎

#1


具体可以通过下面的步骤实现:
&#8226; 在系统菜单上添加所需的菜单项。
&#8226; 为新添加的菜单项定义OnClick事件的处理过程。

下面的例程中,在系统菜单中添加了一个“前端显示( A )”菜单项,通过该菜单项,可以使窗体始终显示在最前端或为普通窗体模式。具体实现过程如下:

1) 通过菜单File | New Application创建一个新的工程。
2) 添加窗体Form1的OnCreate事件的处理过程如下:
void __fastcall TForm1::FormCreate(TObject *Sender)
{
// 设置系统菜单
AppendMenu(GetSystemMenu(Handle, false), MF_SEPARATOR, 0, " ") ;
AppendMenu(GetSystemMenu(Handle, false), MF_STRING, 200, "前端显示( & A )") ;
3) 在文件U n i t 1 . h头文件中增加如下语句:
. . .
#include <Menus.hpp>
. . .
4) 在TForm1的类型定义中,添加系统菜单中新建菜单项的OnClick事件的处理过程的声明:
. . .
public: // User declarations
__fastcall TForm1(TComponent* Owner);
MESSAGE void __fastcall SystemMenuCommand(TWMMenuSelect &Msg);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_SYSCOMMAND, TWMMenuSelect, SystemMenuCommand);
END_MESSAGE_MAP(TForm);
};
5) 手工添加系统菜单中新建菜单项的O n C l i c k事件的处理过程如下:
void __fastcall TForm1::SystemMenuCommand(TWMMenuSelect &Msg)
{
TForm::Dispatch(&Msg);
if( Msg.IDItem==200 )
{
if( Form1->FormStyle==fsNormal )
{
// 将窗体设置为总在前端显示
Form1->FormStyle = fsStayOnTop;
// 重新设置系统菜单
AppendMenu(GetSystemMenu(Handle,False), MF_SEPARATOR, 0, " ") ;
AppendMenu(GetSystemMenu(Handle,False), MF_STRING, 200, "前端显示& A )") ;
// 在新添加的菜单项前增加一个选中标志
ModifyMenu(GetSystemMenu(Handle,False),200,MF_CHECKED,200,“前端显示(&A )”);
}
}
else
{
// 将窗体设置为普通模式
Form1->FormStyle = fsNormal;
//重新设置系统菜单
AppendMenu(GetSystemMenu(Handle,False), MF_SEPARATOR, 0, " ") ;
AppendMenu(GetSystemMenu(Handle,False), MF_STRING, 200, "前端显示( & A )");
}
}
6) 编译、链接并运行程序,测试系统菜单中新添加的菜单项的效果

#2


樓上的代碼效果我也實現了,你的代碼也沒有實現我所說的功能,即在任務欄右擊鼠標右鍵也彈出自定義的菜單項.是不是與XP的系統有關,如何實現這一功能呀?

#3


gz

#4


我猜测是这样的,你试验以下:

HMENU  SysMenu  =  GetSystemMenu(Handle,  FALSE); //窗口上面的
InsertMenuItem  (SysMenu,  SC_CLOSE,  TRUE,  &Info);

HMENU  SysMenu  =  GetSystemMenu(Application->Handle,  FALSE); //任务栏上面的
InsertMenuItem  (SysMenu,  SC_CLOSE,  TRUE,  &Info);

#5


樓上的說的對,我也發現了,但是又出了一個問題,我沒有辦法映射菜單的消息呀,
請問怎麼做呀,我發現任務欄上的消息在窗體上映射不到,這個怎麼做才行呀,要
用窗口子類化技術嗎,這個不太會,如果是給個例子好嗎