关于窗体最小化的问题(100分)

  • 主题发起人 主题发起人 pcc_mmz1
  • 开始时间 开始时间
P

pcc_mmz1

Unregistered / Unconfirmed
GUEST, unregistred user!
众高手,pcc_mmz1有礼了。
我想使我写的正在运行的程序,最小化时不在任务栏“待命”,而是
以图标形式显示在任务栏最右边的那个(叫什么拖盘)小区域内,请问如何实现?
先谢了。
 
N多组件啦! 100分就为这个?
 
介绍个组件给你。。
TTrayIcon 要的话发email给我:link_mike@163.net
 
也可以不用控件,用API,在已答问题中搜“trayicon”,答案太多太多。。。。
 
其实窗体最小化不显示在任务栏,你可以这么处理 :

procedure TForm1.FormCreate(Sender: TObject);
begin
SetWindowLong(application.handle,
gwl_exstyle,
ws_ex_toolwindow);
end;
 
还是小雪利索。:)
 
一个小程序,用来显示一个记事本的,支持热键(Ctrl+Alt+A),能够实现右侧菜单栏显示图标。
同时,可以使用第三方控件,不过一般没有必要。
unit Unit_Top;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, Buttons, ExtCtrls,Clipbrd, Menus,ShellApi;

const WM_TrayIcon=WM_User+1;

type
TFrm_Top = class(TForm)
mem_top: TMemo;
pnl_top: TPanel;
bbtn_Copy: TBitBtn;
pm_top: TPopupMenu;
pmi_Exit: TMenuItem;
mmi_Restore: TMenuItem;
procedure mem_topKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormCreate(Sender: TObject);
procedure pmi_ExitClick(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
procedure mmi_RestoreClick(Sender: TObject);
private
{ Private declarations }
procedure OnNotifyIcon(var Msg:Tmessage);message WM_TrayIcon;
procedure WMHotkeyHandle(var Msg:TMessage);message WM_HOTKEY; //响应敏感键按键消息
procedure WMSysCommand(var Msg:TMessage);message WM_SysCommand;
public
{ Public declarations }
end;

var
Frm_Top: TFrm_Top;

implementation

{$R *.DFM}

var iData: TNotifyIconData;

HotkeyId :Integer;

procedure TFrm_Top.WMSysCommand(var Msg:TMessage);
begin
if Msg.WParam=SC_MINIMIZE then
begin
Application.Minimize;
Frm_Top.Hide;
end;
inherited;
end;

procedure TFrm_Top.WMHotkeyHandle(var Msg:TMessage);
begin
if (Msg.LParamHi=$41) and (msg.lparamLo=MOD_CONTROL or mod_Alt) then
begin
Msg.Result:=1; //该消息已经处理
mmi_RestoreClick(Application);
end;
end;

procedure TFrm_Top.mem_topKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (ssCtrl in Shift) and (Key=13) then
begin
if mem_top.SelText='' then
Clipboard.AsText:=mem_top.Text
else
Clipboard.AsText:=mem_top.SelText;
Key:=0;
end;
end;

procedure TFrm_Top.FormCreate(Sender: TObject);
begin
iData.cbSize:=Sizeof(iData);
iData.Wnd:=Frm_Top.Handle;
iData.uID:=0;
iData.uFlags:=NIF_MESSAGE or NIF_ICON or NIF_TIP;
iData.uCallbackMessage:=WM_TrayIcon;
iData.hIcon:=Application.Icon.Handle;
iData.szTip:='asd';
if Shell_NotifyIcon(NIM_ADD, @iData)=False then ShowMessage('NO');

HotkeyId:=GlobalAddAtom(Pchar('UserDefineHotKey'))-$C000; //减去$C000是为了保证取值范围的限制
RegisterHotkey(Handle,Hotkeyid,MOD_CONTROL or MOD_Alt, $41);//敏感键为ctrl+Alt+A
end;

procedure TFrm_Top.OnNotifyIcon(var Msg:Tmessage);
var Pos:Tpoint;
begin
case Msg.LParam of
WM_LBUTTONDBLCLK:
mmi_RestoreClick(Application);
WM_RBUTTONDOWN:
begin
GetCursorPos(Pos);
pm_top.Popup (Pos.x,Pos.y);
end;
end;
end;

procedure TFrm_Top.pmi_ExitClick(Sender: TObject);
begin
if Shell_NotifyIcon(NIM_DELETE, @iData)=False then ShowMessage('NO');
UnRegisterhotkey(Handle,HotkeyId);
DeleteAtom(HotKeyID);
Application.Terminate;
end;

procedure TFrm_Top.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
// Application.Minimize;
// ShowWindow(Handle,SW_HIde);
Frm_Top.Hide;
CanClose:=False;
end;

procedure TFrm_Top.mmi_RestoreClick(Sender: TObject);
begin
// ShowWindow(Handle,SW_SHOW);
Frm_Top.Show;
// Application.Restore;
SetFocus;
end;

end.
 
请看例程:
http://delphi.mychangshu.com/dispdoc.asp?id=540
 
好多相关控件拉,即使编程也很容易实现
你这个分可算是浪费了,
看看以前的帖子吧,多的要命
 
对亚,就是使用API调用,就可以了
没有什么麻烦的
ShowWindows可以用来隐藏窗扣
 
你在dfw输入"托盘"可以找到很多!
 
没有那么复杂。
application.Minimize;
 
to yzhshi:
不好意思,忘了给分,现在补上。
 
多人接受答案了。
 
后退
顶部