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);