我想在Timer1組件達到規定時間后,顯示出“提醒事件”視窗,這個“提醒事件”視窗,我想做成:
當Timer1組件達到規定時間后,在任務欄托盤區域顯示閃爍圖示,然后雙擊這個閃爍的圖示,打開“提醒事件”視窗。我從朋友那里下載了一個例子,照著這個例子做后,目前只是做到點擊SpeedButton1.Click后,顯示在任務欄,但有一些不明白的地方和幾個問題,代碼如下:
(本人菜鳥一只,只能將該單元的所有代碼全部貼出來,大家幫我看看該怎么改寫)
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls;
const WM_NID = WM_User + 1000;
type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
Label1: TLabel;
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure N1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
procedure WMNID(var msg:TMessage); message WM_NID;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses ShellAPI;
var
NotifyIcon: TNotifyIconData;
{$R *.dfm}
procedure TForm1.WMNID(var msg:TMessage);
var
CursorPos: TPoint;
begin
if msg.LParam = WM_RBUTTONDOWN then // 在托盤區點擊左鍵后
begin
GetCursorPos(CursorPos);
if IsIconIc(Application.Handle) then
SetForegroundWindow(Application.Handle)
else
Application.BringToFront;
Application.ProcessMessages;
PopupMenu1.Popup(CursorPos.x,CursorPos.y);
PostMessage(Application.MainForm.Handle,WM_NULL,0,0);
end;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
Shell_NotifyIcon(NIM_DELETE,@NotifyIcon)// 洗掉托盤圖示
end;
procedure TForm1.N1Click(Sender: TObject);
begin
close;
end;
procedure TForm1.FormShow(Sender: TObject);
begin
with NotifyIcon do
begin
cbSize := SizeOf(TNotifyIconData);
Wnd := Handle;
uID := 1;
uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
uCallBackMessage := WM_NID;
hIcon := Application.Icon.Handle;
szTip := '托盤程式';
end;
Shell_NotifyIcon(NIM_ADD, @NotifyIcon); // 在托盤區顯示圖示
end;
end.
問題如下:
1、“提醒事件”視窗在動態建立后,會在桌面和任務欄托盤區域都顯示出來。怎樣將其做成動態建立后,不顯示出表單,直接放入托盤區域?
2、顯示到任務欄托盤區域后,圖示不閃爍。怎樣實作閃爍?就象QQ訊息彈窗那樣。
3、Const WM_NID = WM_User + 1; 這一句中,有的例子在WM_User后+1,有的例子在WM_User后+1000。這個1 和 1000 有什么區別?為什么要+?不+行不行?
4、我從網上查了下IsIconIc,網上說這個函式用于判斷視窗是否最小化。最小化,則回傳“非0”,未最小化,則回傳“0”。 那么IF IsIconIc(Application.Handle) Then 判斷后,結果是“最小化”還是“正常顯示”?
5、SetForegroundWindow(Form2.Handle) 這一句是“激活Form2”吧?
6、Application.BringToFront 這一句是將視窗“置頂”嗎?
7、PostMessage(Form2.Handle,WM_NULL,0,0); 這一句是什么意思,不明白,盼解答。
8、為什么沒有呼叫WMNID就能夠將Form2放在任務欄托盤區域上。
本人分不多,不能給高分,還望各位大蝦別嫌分少,能夠不吝賜教,解我疑惑!!
uj5u.com熱心網友回復:
圖示閃爍,應該是兩個圖示交換,即一個空圖示,然后一個實際圖示,兩者切換就可以實作影片效果了,另外這個是有現成的控制元件的,D2007之后,Delphi自帶叫TrayIcon,之前有第三方的,貌似也是TrayIcon這種名字吧!uj5u.com熱心網友回復:
圍觀一下,也需要學習這個功能!uj5u.com熱心網友回復:
我現在已經解決了第1個問題——“提醒事件”視窗在動態建立后,會在桌面和任務欄托盤區域都顯示出來。怎樣將其做成動態建立后,不顯示出表單,直接放入托盤區域?uj5u.com熱心網友回復:
至于圖示閃爍的問題,我有2種實作方案:1、2個不同的圖示,使用IF陳述句后,閃爍頻率和QQ彈窗的差不多,但缺點是2個圖示不同。并不是其中1個圖示是空,也是有圖案的。
2、2個相同的圖示,增加一個NotifyIcon,然后通過時間計算來實作閃爍。已經實作閃爍,但缺點是閃爍頻率很慢,達不到QQ彈窗那種效果。
請問:如何做一個空的圖示?通過什么軟體?誰能提供給我一個空圖示?另外,任務欄中圖示應該是32位像素的圖示,而不是16位像素的吧?因為16像素的好像比任務欄中其它的圖示小。
uj5u.com熱心網友回復:
使用TrayBarIconu單元(TrayIcon),做成一個托盤程式。uj5u.com熱心網友回復:
TRzTrayIcon 加上這個就可以了,很簡單,轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/93130.html
標籤:語言基礎/算法/系統設計
