一個古老的問題?

yezhiyuan1303 2003-09-22 09:33:16
我在窗體的系統菜單中添加了一項自定義的菜單,在任務欄上單擊右鍵,彈出的菜單上沒有自定義的,但在窗體上有,這是為什麼?我的系統是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);
請高手指點.
...全文
37 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
yezhiyuan1303 2003-09-24
  • 打赏
  • 举报
回复
樓上的說的對,我也發現了,但是又出了一個問題,我沒有辦法映射菜單的消息呀,
請問怎麼做呀,我發現任務欄上的消息在窗體上映射不到,這個怎麼做才行呀,要
用窗口子類化技術嗎,這個不太會,如果是給個例子好嗎
  • 打赏
  • 举报
回复
我猜测是这样的,你试验以下:

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

HMENU SysMenu = GetSystemMenu(Application->Handle, FALSE); //任务栏上面的
InsertMenuItem (SysMenu, SC_CLOSE, TRUE, &Info);
constantine 2003-09-23
  • 打赏
  • 举报
回复
gz
yezhiyuan1303 2003-09-23
  • 打赏
  • 举报
回复
樓上的代碼效果我也實現了,你的代碼也沒有實現我所說的功能,即在任務欄右擊鼠標右鍵也彈出自定義的菜單項.是不是與XP的系統有關,如何實現這一功能呀?
zihan 2003-09-22
  • 打赏
  • 举报
回复
具体可以通过下面的步骤实现:
• 在系统菜单上添加所需的菜单项。
• 为新添加的菜单项定义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) 编译、链接并运行程序,测试系统菜单中新添加的菜单项的效果

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧