关于制作象网络蚂蚁那样浮动窗口的问题!

Description of your first forum.

关于制作象网络蚂蚁那样浮动窗口的问题!

帖子miaofeng » 星期日, 2005年3月6日 00:53


RT,就是在程序在托盘中,通过托盘图标的右键菜单创建并且打开这样的浮动窗口,要求这个窗口不在任务栏显示,而且总在最上。
现在这样写是不行的:
 if winFloatWin = nil then
   winFloatWin := TwinFloatWin.CreateParented(GetDesktopWindow);
 winFloatWin.Show;
……
在winFloatWin的OnCreate事件中:
 SetWindowLong(Self.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
现象是,打开窗口后浮动窗口仍然在任务显示,请大家帮助,谢谢!:)
 
 
 

关于制作象网络蚂蚁那样浮动窗口的问题!

帖子gooodlife » 星期日, 2005年3月6日 01:29


SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
 
 
 

关于制作象网络蚂蚁那样浮动窗口的问题!

帖子gooodlife » 星期日, 2005年3月6日 01:34


procedure TForm1.FormCreate(Sender: TObject);
begin
// 不在任务栏显示
SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
//总在最上
SetWindowPos(Form1.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);
end;
 
 
 

关于制作象网络蚂蚁那样浮动窗口的问题!

帖子miaofeng » 星期日, 2005年3月6日 01:55


在winFloatWin 的OnCreate事件中加入了那些代码后,
procedure TwinMain.pmiFWClick(Sender: TObject);
begin
 if winFloatWin = nil then
   winFloatWin := TwinFloatWin.Create(winFloatWin);
 winFloatWin.Show;
……
如上这样Show出来winFloatWin 仍然可以在任务栏中看到
 
 
 

关于制作象网络蚂蚁那样浮动窗口的问题!

帖子miaofeng » 星期日, 2005年3月6日 02:27


如下代码也是不行的:
procedure TwinFloat.FormCreate(Sender: TObject);
begin
 SetWindowLong(Application.Handle, GWL_EXSTYLE, WS_EX_TOOLWINDOW);
end;

procedure TwinFloat.CreateParams(var Params: TCreateParams);
begin
 inherited CreateParams(Params);
 Params.ExStyle := Params.ExStyle or WS_EX_TOPMOST;
 Params.WndParent := GetDesktopWindow;
end;

procedure TwinMain.pmiFWClick(Sender: TObject);
begin
 if winFloat = nil then
   winFloat := TwinFloat.Create(Self);
 winFloat.Show;
 
 
 

关于制作象网络蚂蚁那样浮动窗口的问题!

帖子gooodlife » 星期日, 2005年3月6日 02:28


procedure TF_Main.xxxxxx1Click(Sender: TObject);
begin
 if Not Assigned(Form1) then
   Form1 := TForm1.Create(Application);

 SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
//总在最上
 SetWindowPos(Form1.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);

 Form1.Show;
end;

我试过了.是可以的.不过记得 用 GetWindowLong 取的原来的值
等返回时,再用 SetWindowLong 设回
 
 
 

关于制作象网络蚂蚁那样浮动窗口的问题!

帖子miaofeng » 星期日, 2005年3月6日 02:37


gooodlife,我把您的代码试了一下还是不行,需要说明一下的,我的程序是在托盘中的,不知道这个有没有影响。
 
 
 

关于制作象网络蚂蚁那样浮动窗口的问题!

帖子gooodlife » 星期日, 2005年3月6日 09:37


我也是在托盘中啊

不过我用的是一般的 Form 的 ,不知你同的 winFloatWin 有什么分别呢?
 
 
 

关于制作象网络蚂蚁那样浮动窗口的问题!

帖子miaofeng » 星期日, 2005年3月6日 12:09


我的那个winFloatWin也是一个普通的窗体,就是名字换了。
我的程序是把托盘中的窗口作为主窗口,然后在托盘菜单中打开这个浮动的窗口,按楼上朋友的方法,窗口不能总在最上边,用我的方法,隐藏任务栏按钮和总在最上总是有一个不能正常工作。
 
 
 

关于制作象网络蚂蚁那样浮动窗口的问题!

帖子gooodlife » 星期日, 2005年3月6日 17:20


给你一个完整的例子啦
-------dpr-------------
program Project1;

uses
 Forms,
 Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.ShowMainForm := False;
 Application.Run;
end.
--------------------------------------
----------.pas--------------------------
unit Unit1;

interface

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

Const
 WM_BARICON=WM_USER+200;
 
type
 TForm1 = class(TForm)
   PopupMenu1: TPopupMenu;
   N1: TMenuItem;
   N2: TMenuItem;
   procedure N2Click(Sender: TObject);
   procedure N1Click(Sender: TObject);
   procedure FormShow(Sender: TObject);
   procedure FormDestroy(Sender: TObject);
   procedure FormCreate(Sender: TObject);
 private
   R_lpData : PNotifyIconData;  // 2004-06-03 用于托盘
   procedure WMSysCommand(var Message: TMessage); message WM_SYSCOMMAND;
   procedure WMBarIcon(var Message:TMessage); message WM_BARICON; { Private declarations }
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.WMBarIcon(var Message: TMessage);
var
 pos : TPoint;
Begin
 Case  Message.LParam Of
 WM_LBUTTONDBLCLK:
 begin
   //如果用户双击击任务栏图标则将图标删除并回复窗口。
   Form1.Visible := True;
 end;
 WM_RBUTTONDOWN:  //用户单击右键,则弹出菜单
 begin
   GetCursorPos(pos);
   PopupMenu1.Popup(pos.x,pos.y);
 end;
 end; // end case  Message.LParam of
end;

procedure TForm1.WMSysCommand(var Message: TMessage);
begin
 if Message.WParam = SC_ICON then
 begin
   Form1.Visible := False;
 end
 else
 if Message.WParam = SC_CLOSE then
 begin
   Form1.Visible := False;
 end
 else
 begin
   DefWindowProc(Form1.Handle,Message.Msg,Message.WParam,Message.LParam);
 end;
end;

procedure TForm1.N2Click(Sender: TObject);
begin
 Form1.Visible := Not(Form1.Visible);
end;

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

procedure TForm1.FormShow(Sender: TObject);
begin
 // 结束托盘
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 Shell_NotifyIcon(NIM_DELETE,R_lpData);
 Dispose(R_lpData);
end;

procedure TForm1.FormCreate(Sender: TObject);
var
 nDevs, TapiVersion : LongInt;
begin
 SetWindowLong(Application.Handle, GWL_EXSTYLE,WS_EX_TOOLWINDOW);
//总在最上
 SetWindowPos(Form1.Handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOSIZE or SWP_NOMOVE);



 Self.Icon.Handle := Application.Icon.Handle;

 R_lpData := New(PNotifyIconDataA);
 R_lpData.cbSize := SizeOf(PNotifyIconDataA) ; // 88;
 R_lpData.Wnd :=  Form1.Handle;
 R_lpData.hIcon := Form1.Icon.Handle ;
 R_lpData.uCallbackMessage := WM_BARICON;
 R_lpData.uID := 0;
 R_lpData.szTip := 'QSecurity';
 R_lpData.uFlags := NIF_ICON or NIF_MESSAGE or NIF_TIP;

 Shell_NotifyIcon(NIM_ADD,R_lpData);

 Form1.Show;
end;

end.
 
 
 

关于制作象网络蚂蚁那样浮动窗口的问题!

帖子miaofeng » 星期日, 2005年3月6日 18:41


感谢楼上朋友的代码,很感谢!!
在我的程序中,Form1不是浮动窗口,而是一个在托盘菜单中打开的窗口。
 
 
 

关于制作象网络蚂蚁那样浮动窗口的问题!

帖子gooodlife » 星期日, 2005年3月6日 21:55


应该的....能帮到你我好开心

不过你没有给分的?
 
 
 

关于制作象网络蚂蚁那样浮动窗口的问题!

帖子miaofeng » 星期日, 2005年3月6日 23:14


哦,我没有说清楚,用楼上的代码仍然不行的,不过我已经用其它的办法解决了问题,就是单独使用了一个应用程序作为浮动窗口。不过仍然感谢楼上的!
 
 
 

关于制作象网络蚂蚁那样浮动窗口的问题!

帖子miaofeng » 星期日, 2005年3月6日 23:15


多人接受答案了。