Delphi7使用控件CoolTrayIcon时如何做到程序启动就最小化到托盘
学习Delphi时,使用了第3方控件CoolTrayIcon。CoolTrayIcon的功能很强大,能够将程序添加进托盘,省去了我们再编写代码来实现托盘。但是在看搜CoolTrayIcon的时候,发现好多朋友在求如何让程序在启动就最小化多托盘的方法。但是貌似都不曾成功过。笔者摸索了一下,成功实现了。
找原因
首先我们来看一下CoolTrayIcon的功能函数:根据CoolTrayIcon的使用实例来看,CoolTrayIcon提供了函数HideMainForm()。好吧我们如果在FromCreat里面如果调用该函数会发现没有任何反应。为什么呢?我们接着跟踪这个函数看一下它的声明:
procedure TCoolTrayIcon.HideMainForm;beginif Owner is TWinControl then // Owner might be of type TServiceif Application.MainForm <> nil thenbegin// Hide the form itself (and thus any child windows)Application.MainForm.Visible := False;{ Hide application's TASKBAR icon (not the tray icon). Do this AFTERthe main form is hidden, or any child windows will redisplay thetaskbar icon if they are visible. }HideTaskbarIcon;end;end;
好吧,我们看到这里应该知道了吧。如果你还不知道,可以对它设置断点调试,你就会发现函数声明的语句根本就没有进去。也就是说Application.MainForm根本没有创建。这就意味着你要在创建了窗体的情况下才能调用该函数。如果你知道了应该在哪些改代码就可以去试试了,不知道那我来说,首先你在Delphi7的编译器里面打开你的工程文件,具体的步骤最简单的就是Ctrl+F12,或者说在菜单栏里面选择View→Units选择你的工程文件(后缀名为*.dpr的文件)。但是应该加的代码是什么呢?
解决方法
还是这个HideMainForm?不是的,你试了就应该知道了。没有用,为什么,这个同样就可以用上面断点跟踪的方法来看为什么没有用。我就跳过去来。要实现该功能,你就跟踪代码Application.Run
procedure TApplication.Run;beginFRunning := True;tryAddExitProc(DoneApplication);if FMainForm <> nil thenbegincase CmdShow ofSW_SHOWMINNOACTIVE: FMainForm.FWindowState := wsMinimized;SW_SHOWMAXIMIZED: MainForm.WindowState := wsMaximized;end;if FShowMainForm thenif FMainForm.FWindowState = wsMinimized thenMinimize elseFMainForm.Visible := True;repeattryHandleMessage;exceptHandleException(Self);end;until Terminated;end;finallyFRunning := False;end;end;
关键代码就是 SW_SHOWMINNOACTIVE: FMainForm.FWindowState := wsMinimized;这是对Windows消息机制的处理。只是对窗体最小化的处理。相应的我们的代码(在工程文件*.dpr)中可以改成
beginApplication.Initialize;Application.CreateForm(TTaskReminder, TaskReminder);Application.MainForm.WindowState := wsMinimized ;//TaskReminder.CoolTrayIcon1.HideMainForm;Application.Run;end.
系统代码首先在这里运行:
Application.CreateForm(TTaskReminder, TaskReminder);//它会调用TaskReminder的Creat函数,然后是往下走
当然使用上面的代码会造成主窗体(包括你新生成的窗体)不会轻易的显示,因此这方法仅适合服务器那种没有界面的程序,如果你要弹出主窗体就要在希望弹窗的事件那里写代码
Application.MainForm.WindowState := wsMaximized
如果你嫌这样太麻烦了,就将前面要用的这句话,改成
beginApplication.Initialize;Application.CreateForm(TTaskReminder, TaskReminder);Application.ShowMainForm := False ;//改这里的一行代码Application.Run;end.
这样就不会影响后面,你只要单击生成的新窗体都可以弹出