菜单问题,我绝望了, csdn 上没有高手(200分)

  • 主题发起人 主题发起人 IrisCat
  • 开始时间 开始时间
I

IrisCat

Unregistered / Unconfirmed
GUEST, unregistred user!
Winamp3 是怎样重载系统菜单的,它的系统菜单是自己写的
屏蔽了任务栏上的系统菜单,这是怎样做的!!!!
我问过几次了,好像csdn上没人会的呀
msdn上面也没有

清安装最新的 Winamp3 测试版看看
 
无数人都不会...
 
up一下 关注
 
我也不知道
 
-_-
哪里都一样
 
自己定制应用程序的系统菜单,响应WMSysCommand消息!
 
任务栏上的系统菜单??你指的是弹出菜单???
标题栏上的菜单我好像修改过,改天去公司查一下.
实在不行窗体:=bsnone,自己用image画一个,加上菜单.呵呵.
 
AppendMenu、Inert-Menu、ModifyMenu
http://www2.ccw.com.cn/tips/2k03/032703_09.asp
 
如果用这些 api 好使的话,我也不用发这个贴子了.....
我可是 Win32 api 倒背如流的人...
 
呵呵,任务栏上的菜单与主窗口上的菜单不同,它是属于 Application的!
所以只要用GetSystemMenu找到Application的菜单句柄,直接用AppendMenu 就行了!
主要过程如下:
AppendMenu (GetSystemMenu (Application.Handle, FALSE),
mf_Popup, Items.Handle, PChar (Items.Caption));
很简单的。你自己试试,不行的话,留个Email,我发个例子给你:
 
下面这个帖子中Kingron的回答应该是你要的吧
http://www.delphibbs.com/delphibbs/dispq.asp?lid=605573
另外,在霸王级控件包LMD Tools中有个叫LMDSysMenu的控件可以改变Form左上角的系统菜单
 
BTW:CSDN.net适于做文档中心。
 
//除掉系统菜单保留一个关闭,可是真正的除去哦,:),'0'就是从第一个位置开始
for i:=0 to 4 do
RemoveMenu(GetSystemMenu(Handle,false),0,MF_BYPOSITION);
//加分割
AppendMenu(GetSystemMenu(Handle,false),MF_SEPARATOR,0,'');
//把自己的菜单加上
with MainMenu1 do
for i:=0 to Items.count-1 do
AppendMenu(GetSystemMenu(Handle,false),mf_popup,Items.Handle,Pchar(Items.Caption));
//写一个过程激活自己的菜单命令
procedure Tform1.WMSysCommand(var Msg:TWMSysCommand);
var
Item:TMenuItem;
begin
Item:=MainMenu1.FindItem(Msg.CmdType,fkCommand);
if Item<>nil then
Item.click;
//如果还想继承没有删除的系统命令
inherited;
end;

多看看帮助会有好处.
 
我先试一下

我的mail : fsstudio@263.net
 
同意bubble
消息系统是十分强大的,很多问题都可以通过他解决
 
注意声明的时候:
procedure WMSysCommand(var Msg:TWMSysCommand);message WM_SysCommand;
然后就是注意自己的itemcount,使用mf_popup或者mf_string参数.
 
不能工作,当鼠标载任务栏的应用程序按钮上按右键时没有特定消息
 
早说明白阿。靠。
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
procedure OnAppMessage(var Msg: TMsg; var Handled: Boolean);
end;

var
Form1: TForm1;

implementation

const
SC_MyMenuItem = WM_USER + 1;

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
// Assign the application's OnMessage event to my own
// procedure so I can check for the hidden window's WM_SYSCOMMAND
// message.
Application.OnMessage := OnAppMessage;
AppendMenu(GetSystemMenu(Application.Handle, FALSE), MF_SEPARATOR, 0, '');
AppendMenu(GetSystemMenu(Application.Handle, FALSE),
MF_STRING,
SC_MyMenuItem,
'My Menu Item');
end;

procedure TForm1.OnAppMessage(var Msg: TMsg; var Handled: Boolean);
begin
// Check to see if the message is a system command
// and the message's wParam is SC_MyMenuItem
if (Msg.message = WM_SYSCOMMAND) and (Msg.wParam = SC_MyMenuItem) then
begin
ShowMessage('Got the message');
Handled := True;
end;
end;


 
>>不能工作,当鼠标载任务栏的应用程序按钮上按右键时没有特定消息
老大,你的Application的消息循环还没有对你的新菜单项的消息处理呢!
你要把你的新菜单的处理过程加入到Application的消息处理过程,
用Delphi自带的TApplicationEvents控件的OnMessage事件处理就好!

上面bubble兄的方法也是正解,但由于菜单是“全手工”创建,所以处理起来
比较复杂,如果用我说的方法则与一般的PopupMenu的设计是一样的。
你可以先在窗体上加上一PopupMenu,设好菜单项和菜单处理过程,
然后在Form 的OnCreate事件中用一个循环把PopupMenu中的所有菜单加入到
Application中:
with PopupMenu1 do
for i:=0 to Items.Count -1 do
begin
AppendMenu (GetSystemMenu (Application.Handle, FALSE),
mf_Popup, Items.Handle, PChar (Items.Caption));
end;
在窗体中加上一个TapplicationEvent,响应它的OnMessage事件,
再对WM_SYSCOMMAND进行处理:
if Msg.message = WM_SYSCOMMAND then
begin
//取出wParam中的菜单ID值
i:=Loword(Msg.wParam);
//找到PopupMenu中的对应项,调用其处理过程,搞定!
Item := PopupMenu1.FindItem (i, fkCommand);
if Item <> nil then
Item.Click;
end;



 
例子已经发,请查收。
 
后退
顶部