delphi中怎样使程序最小化时图标显示到右下角,并可左击出菜单?能给源码最好!送100分(100分)

  • 主题发起人 主题发起人 李维宏
  • 开始时间 开始时间
有控件啊,深度厉险一大把。
或其他网站也可。
 
用 CoolTrayIcon
 
这是个关于托盘编程的程序了,很多书上都有的,你可以查一下呀,或则检索一下;
这主要用Shell_NotifyIcon; 函数,
这是我检索来的:
WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(
DWORD dwMessage, // message identifier
PNOTIFYICONDATA pnid // pointer to structure
);

参数说明:
dwMessage
向系统发出的对任务条状态区图标的控制消息,可以为以下三个值:

NIM_ADD 向任务条状态区添加图标.
NIM_DELETE 删除任务条状态区的图标.
NIM_MODIFY 更换任务条状态区的图标.

pnid

指向记录型数据NOTIFYICONDATA的指针.

返回值:成功则返回非零值,失败则返回零值。

typedef struct _NOTIFYICONDATA {
DWORD cbSize;
HWND hWnd;
UINT uID;
UINT uFlags;
UINT uCallbackMessage;
HICON hIcon;
char szTip[64];
} NOTIFYICONDATA, *PNOTIFYICONDATA;


记录成员:

cbSize

记录型数据NOTIFYICONDATA的大小 .

hWnd

需要在任务条状态区生成图标的应用程序窗口的句柄。

uID

应用程序定义的任务条图标的标识.

uFlags

显示其他成员是否有确定的数据标志性数组,其他成员有:

NIF_ICON 确认hIcon成员.
NIF_MESSAGE 确认uCallbackMessage成员.
NIF_TIP 确认szTip成员.

uCallbackMessage

当鼠标事件发生在任务条图标区域时所发出的应用程序自定义的消息。

hIcon

要操作的图标的句柄。

szTip

图标所显示的hint文字.
你在API栏里输入“托盘”等就可以检索到了
 
深度历险
http://vcl.vclxx.org/DELPHIGB/DEFAULT.HTM
中的
NTFYICON
比较好用
 
前两天仿照人家的程序写了一个,你可以看看,其实这个功能并不难实现的,
unit trayicon;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,shellAPI,
Menus;

const
WM_BARICON=WM_USER+200;

type
TForm1 = class(TForm)
PopupMenu1: TPopupMenu;
N1: TMenuItem;
N2: TMenuItem;
procedure N1Click(Sender: TObject);
procedure N2Click(Sender: TObject);
private
procedure WMSysCommand(var Message: TMessage); message WM_SYSCOMMAND;
procedure WMBarIcon(var Message:TMessage);message WM_BARICON; { Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.N1Click(Sender: TObject);
begin
close;
end;

procedure TForm1.WMBarIcon(var Message: TMessage);
var
lpData:PNotifyIconData;
pos:TPoint;
begin
case Message.LParam of
WM_LBUTTONDBLCLK:
begin
//如果用户双击击任务栏图标则将图标删除并回复窗口。
lpData := new(PNotifyIconDataA);
lpData.cbSize := 88;//SizeOf(PNotifyIconDataA);
lpData.Wnd := Form1.Handle;
lpData.hIcon := Form1.Icon.Handle;
lpData.uCallbackMessage := WM_BARICON;
lpData.uID :=0;
lpData.szTip := 'Samples';
lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
Shell_NotifyIcon(NIM_DELETE,lpData);
dispose(lpData);
Form1.Visible := True;
end;
WM_RBUTTONDOWN: //用户单击右键,则弹出菜单
begin
getcursorpos(pos);
popupmenu1.Popup(pos.x,pos.y);
end;

end;
end;

procedure TForm1.WMSysCommand(var Message: TMessage);
var
lpData:PNotifyIconData;
begin
if Message.WParam = SC_ICON then
begin
//如果用户最小化窗口则将窗口隐藏并在任务栏上添加图标
lpData := new(PNotifyIconDataA);
lpData.cbSize := 88; //SizeOf(PNotifyIconDataA);
lpData.Wnd := Form1.Handle;
lpData.hIcon := Form1.Icon.Handle;
lpData.uCallbackMessage := WM_BARICON;
lpData.uID :=0;
lpData.szTip := 'Hello';
lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
Shell_NotifyIcon(NIM_ADD,lpData);
dispose(lpData);
Form1.Visible := False;
end
else
begin
//如果是其它的SystemCommand消息则调用系统缺省处理函数处理之。
DefWindowProc(Form1.Handle,Message.Msg,Message.WParam,Message.LParam);
end;


end;

procedure TForm1.N2Click(Sender: TObject);
var
lpData:PNotifyIconData;
begin
lpData := new(PNotifyIconDataA);
lpData.cbSize := 88;//SizeOf(PNotifyIconDataA);
lpData.Wnd := Form1.Handle;
lpData.hIcon := Form1.Icon.Handle;
lpData.uCallbackMessage := WM_BARICON;
lpData.uID :=0;
lpData.szTip := 'Samples';
lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;
Shell_NotifyIcon(NIM_DELETE,lpData);
dispose(lpData);
Form1.Visible := True;
end;

end.
刚刚重写的,应该没有问题
 
多人接受答案了。
 
hezhilong:
虽然成功了,但是程序占用的系统资源增多了,最小化后占用的资源没有减少。普通程序在
最小化后占用资源会减少很多的。
 
怎么沒有看到我最小化后的圖標啊,那個圖標在那里定義啊
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部