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) 编译、链接并运行程序,测试系统菜单中新添加的菜单项的效果
• 在系统菜单上添加所需的菜单项。
• 为新添加的菜单项定义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);
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
具体可以通过下面的步骤实现:
• 在系统菜单上添加所需的菜单项。
• 为新添加的菜单项定义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) 编译、链接并运行程序,测试系统菜单中新添加的菜单项的效果
• 在系统菜单上添加所需的菜单项。
• 为新添加的菜单项定义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);
HMENU SysMenu = GetSystemMenu(Handle, FALSE); //窗口上面的
InsertMenuItem (SysMenu, SC_CLOSE, TRUE, &Info);
HMENU SysMenu = GetSystemMenu(Application->Handle, FALSE); //任务栏上面的
InsertMenuItem (SysMenu, SC_CLOSE, TRUE, &Info);
#5
樓上的說的對,我也發現了,但是又出了一個問題,我沒有辦法映射菜單的消息呀,
請問怎麼做呀,我發現任務欄上的消息在窗體上映射不到,這個怎麼做才行呀,要
用窗口子類化技術嗎,這個不太會,如果是給個例子好嗎
請問怎麼做呀,我發現任務欄上的消息在窗體上映射不到,這個怎麼做才行呀,要
用窗口子類化技術嗎,這個不太會,如果是給個例子好嗎