关于最小化不到任务栏及在任务栏上按右键的菜单显示问题: ( 积分: 200 )

  • 主题发起人 主题发起人 coscka
  • 开始时间 开始时间
C

coscka

Unregistered / Unconfirmed
GUEST, unregistred user!
1、为什么我的程序按最小化时,不是最小到任务栏,而是最小化浮到任务栏的上面?这样当点任务栏的程序时就不能最大化了。
2、在任务栏上我的程序那里点右键,只有“最小化”,“还原”,“关闭”三个按钮,怎样添加其他的,就象大部分Windows程序一样?我还想增加一个象Acdsee一样的"Always on Top"又该怎样做呢?
==== 解决问题每题100分,谢谢 ========
 
1、为什么我的程序按最小化时,不是最小到任务栏,而是最小化浮到任务栏的上面?这样当点任务栏的程序时就不能最大化了。
2、在任务栏上我的程序那里点右键,只有“最小化”,“还原”,“关闭”三个按钮,怎样添加其他的,就象大部分Windows程序一样?我还想增加一个象Acdsee一样的"Always on Top"又该怎样做呢?
==== 解决问题每题100分,谢谢 ========
 
2、是否可用trayicon实现?我没有用过该功能
 
1,那应该是与你的窗口类型有关。你可以设成mdi类型的试试。
2,你可以使用api函数调用
 
用 override createparams 实现
 
1.第一个问题是因为你最小化的窗口不是主窗口
也就是说不是Application.MainForm,那么当其最小化时无法使使Application最小化,所以有这样的结果,如果要使非主窗口在点击最小化按钮后使整个程序最小化到任务栏,可以拦截最小化事件,在最小化时将Application最小化,干脆给你代码吧:
....
private
procedure WMSysCommand(var Msg: TWMSysCommand);
message WM_SYSCOMMAND;
public
....
procedure TForm2.WMSysCommand(var Msg: TWMSysCommand);
begin
if Msg.CmdType = SC_MINIMIZE then
Application.Minimize;
inherited;
end;

2.要在标题栏系统菜单中添加自己的菜单项,这样做:
首先自定义一菜单消息常量,在窗口建立时用AppendMenu添加菜单项到系统菜单,同样拦截WM_SYSCOMMAND消息,在得到菜单消息时处理相应事件。
//在系统菜单上添加自定义菜单项
procedure WMSysCommand(var Msg: TWMSysCommand);
message WM_SYSCOMMAND;
const
idMyFunc = $f200;
procedure TForm1.FormCreate(Sender: TObject);
begin
AppendMenu(GetSystemMenu(Handle, False), MF_STRING, idMyFunc, '自定义系统菜单项');
end;
procedure TForm1.WMSysCommand(var Msg: TWMSysCommand);
begin
inherited;
if Msg.CmdType and $FFF0 = idMyFunc then
ShowMessage('你点击了自定义系统菜单项');
end;

1,2两个问题可以合在一个WMSysCommand(var Msg: TWMSysCommand)过程中解决。
至于Always on Top功能,就是在菜单中添加这个菜单项,然后用下面的语句设置窗口是否最顶层
设置最顶层:
SetWindowPos(Handle, HWND_TOPMOST, 0,0,0,0, SWP_NOMOVE or SWP_NOSIZE)
取消总在最顶层:
SetWindowPos(Handle, HWND_NOTOPMOST,0,0,0,0, SWP_NOMOVE or SWP_NOSIZE);
 
procedure CreateParams(var Params: TCreateParams);
override;
....
procedure TForm2.CreateParams(var Params: TCreateParams);
override;
begin
inherited CreateParams(Params);
params.ExStyle:=params.ExStyle or WS_EX_APPWINDOW
end;

这样就可以了。
 
多人接受答案了。
 
后退
顶部