请教,还是NotifyIcon的问题。(50分)

  • 主题发起人 主题发起人 jacer
  • 开始时间 开始时间
J

jacer

Unregistered / Unconfirmed
GUEST, unregistred user!
网上很多关于 TrayIcon 的文章,我 CUT 了一份,可是我的窗口怎么也不到<br>任务栏去,还是赫然一个大 Form,把 Visible 设为 False 也没用。这是<br>什么原因呢?<br>我的代码如下:<br><br>unit TrayIcon;<br><br>interface<br><br>uses<br>&nbsp; Windows, Messages, SysUtils, Classes,<br>&nbsp; Graphics, Controls, Forms, Dialogs,<br>&nbsp; ShellAPI, StdCtrls;<br><br>{自定义消息,当小图标捕捉到鼠标事件时Windows向回调函数发送此消息}<br>const MY_MESSAGE = WM_USER + 678;<br><br>type<br>&nbsp; TMyTrayForm = class(TForm)<br>&nbsp; procedure FormCreate(Sender: TObject);<br>&nbsp; procedure FormClose(Sender: TObject; var Action: TCloseAction);<br>&nbsp; procedure FormPaint(Sender: TObject);<br>&nbsp; private<br>&nbsp; &nbsp; procedure OnIconNotify(var Message: TMessage);<br>&nbsp; &nbsp; &nbsp; message MY_MESSAGE;<br>&nbsp; public<br>&nbsp; &nbsp; { Public declarations }<br>&nbsp; end;<br><br>var<br>&nbsp; MyTrayForm: TMyTrayForm;<br><br>implementation<br><br>{$R *.DFM}<br><br>procedure TMyTrayForm.OnIconNotify(var Message: TMessage);<br>const<br>&nbsp; Busy: Boolean = false;<br>begin<br>... ...<br>end;<br><br>{当主Form建立时通知Windows加入小图标}<br>procedure TMyTrayForm.FormCreate(Sender: TObject);<br>var<br>&nbsp; nid: TNotifyIconData;<br>begin<br>&nbsp; nid.cbSize := sizeof(nid); // nid变量的字节数<br>&nbsp; nid.Wnd := Self.Handle; // 主窗口句柄<br>&nbsp; nid.uID := $DEDB; // 内部标识,可设为任意数<br>&nbsp; nid.hIcon := Application.Icon.Handle; // 要加入的图标句柄,可任意指定<br>&nbsp; nid.szTip := 'This is a test application'; // 提示字符串<br>&nbsp; nid.uCallbackMessage := MY_MESSAGE; // 回调函数消息<br>&nbsp; nid.uFlags := NIF_ICON or NIF_TIP or NIF_MESSAGE; // 指明哪些字段有效<br>&nbsp; if not Shell_NotifyIcon(NIM_ADD, @nid) then begin<br>&nbsp; &nbsp; ShowMessage('Failed!');<br>&nbsp; &nbsp; Application.Terminate;<br>&nbsp; end;<br>&nbsp; {将程序的窗口样式设为TOOL窗口,可避免在任务条上出现}<br>&nbsp; SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);<br>end;<br><br>procedure TMyTrayForm.FormClose(Sender: TObject; var Action: TCloseAction);<br>var<br>&nbsp; nid: TNotifyIconData;<br>begin<br>&nbsp; nid.cbSize := sizeof(nid);<br>&nbsp; nid.uID := $DEDB; <br>&nbsp; nid.Wnd := Self.Handle;<br>&nbsp; Shell_NotifyIcon(NIM_DELETE, @nid);<br>end;<br><br>procedure TMyTrayForm.FormPaint(Sender: TObject);<br>begin<br>&nbsp; Hide;<br>end;<br><br>end.<br>
 
你还费这劲干吗? &nbsp;找一个用不就得了,不过要学习编程就另一回事了。
 
我是想自己试试,我以前没用TForm,用最原始的方法(WinMain)倒是可以。<br>我就不明白。。。是TForm的哪个特性没设对吗?<br>另外,我如果在 WinMain 开始的程序里想调用 TForm 类,(奇怪的问题?)<br>我该怎么写这句话:<br>MyForm := TForm.Create({这里的Sender应该是什么?})<br><br>不好意思,这里又加了一个问题。不过前一个是因为这个而来的。<br>请大虾们一并给俺解了吧!我会加分的。
 
i think the trayicon is apeared at taskbar.<br><br>formCreate event cannot change its visible property, if u changed <br>mainform's visible property to be false at desin time it should be<br>re-asigneed to be true at runtime automaticly.<br><br>and i wander but not sure if u could use SetWindowLong in Oncreate <br>event.<br><br>myform := TMyform.create(application);//owner not sender;<br>some use: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;nil<br>or use application.createform....<br><br>good luck
 
Notify Icon 的控件太多了,不会搞不定吧,<br>MyForm := TForm.Create(nil);
 
如果是用 WinMain 写的 dpr,好象没有 application 对象吧!
 
在setwindowlong前加<br>&nbsp; ShowWindow(Application.Handle, SW_HIDE);<br>
 
在某个地方隐藏Application.Handle就可以了,用xixi的方法,只是<br>可以在任何需要的时候,在任何位置都可以.如果调用:<br>ShowWindow(Application.Handle, SW_NORMAL);<br>还可以使程序恢复到Taskbar.
 
接受答案了!
 
你还需在.dpr文件Application.CreateForm(TForm,Form1);前加入一句Application.Showmainform:=false;也许就可以了,我曾经也遇到这种情况.
 
&gt;&gt;接受答案了!<br><br>那给分呀!<br>
 
jacer (jacer@yeah.net) &nbsp;上次进入: 00-1-10 15:12:42 &nbsp;<br><br>你还等着他给分?<br>
 
将程序的窗口样式设为TOOL窗口,可避免在任务条上出现}<br>&nbsp; SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);<br>没用!!!!!!!<br>程序没出现在任务栏但最小化向 d4 编程中一样还在前台。<br>ShowWindow(Application.Handle, SW_HIDE);<br>我变程也试过不能把程序发送到后台,即只有一个在任务栏的程序屏幕上在没有其他<br>的窗体。就像金山词霸 3 一样。<br>不知道为什莫会接受答案???
 
很久没有地方上网,问题一直拖到现在,非常抱歉。<br>好象xixi和阿蒙是对的。
 
接受答案了.
 
搞错了,50分都给CJ啦!
 
后退
顶部