关于qq界面的问题(200分)

  • 主题发起人 主题发起人 dcba
  • 开始时间 开始时间
D

dcba

Unregistered / Unconfirmed
GUEST, unregistred user!
别的不想问,就像知道怎样作出像qq那样可以自动把窗体缩成一条线,并且鼠标放到上面又出来
并且任务栏里不出现程序的标题
给个思路也行。
 
(利用Timer事件)
p1,p2:Tpoint;
GetCursorpos(p1);//获取屏幕坐标
p2:=ScreenToclient(p1);//转换到屏幕坐标
if autohide and (p2.x>palL) then //palL为palLeft的width,在resize事件改变
palLeft.Visible :=False //窗体的panel控件palleft
else
palLeft.Visible :=True;
 
private里添加
procedure WMMOVE(var Msg: TMessage); message WM_MOVE;
procedure CMMouseEnter(var Msg:TMessage);message CM_MouseEnter;
procedure CMMouseLeave(var Msg:TMessage);message CM_MouseLeave;
自动隐藏窗体实现
procedure TfrmMain.CMMouseEnter(var Msg: TMessage);
begin
Inherited;
if frmMain.Top<0 then frmMain.Top:=0;
Msg.Result:=0;
end;

procedure TfrmMain.CMMouseLeave(var Msg: TMessage);
var pt: TPoint;
begin
Inherited;
GetCursorPos(pt);
if PtInRect(Self.BoundsRect, pt) then Exit;
frmMain.Top:=0-frmMain.Height +5;
end;

procedure TfrmMain.WMMOVE(var Msg: TMessage);
var pt: TPoint;
begin
Inherited;
GetCursorPos(pt);
if PtInRect(Self.BoundsRect, pt) then Exit;
frmMain.Top:=0-frmMain.Height +5;
end;
 
任务栏里不出现程序的标题实现

在formcreat事件里添加
SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
 
怎么才能实现窗体一点点缩短的动画效果呢?
我不想让窗体一下子就没了,一下子又出来,
还有就是怎么让窗体没有标题栏?
先谢谢了
 
让窗体没有标题栏只要将bordersytle设为bsnone就行了
窗体缩短就要用一个循环让窗体的heigth慢慢变小小到一定的值时(自已设定)
就close掉
 
好像有点问题
如果当前的form本身是激活的,那么即使鼠标离开form,只要他还是激活的,就不会触发
CM_MouseLeave,只有我这是在点一下别的程序,它才会发生CM_MouseLeave

同样,如果当前的form本身是激活的,那么即使鼠标进入form,只要他还是激活的,
就不会触发CM_MouseEnter

有什么解决办法么?
 
给你点提示,要用到钩子函数,来判断鼠标的位置
 
有没有对系统资源占用比较少的办法?
 
好像是吧Form的Top改变就好了!
在Form的MouseMove事件发生
 
但是如果鼠标离开form,就不会发生MouseMove事件了
 
还不Easy!
加一个MouseExit事件不就得了!!
 
哪里有MouseExit事件加?
 
我以前查过以前的帖子,提到的一般是两种解决办法
一种就是用timer控件,
一种是用appbar
下面是一个连接你自己看吧

http://www.delphibbs.com/delphibbs/dispq.asp?lid=725073
------------------------------------------------------------------
使用WM_mouseleave确实有问题,我也不知道怎么解决
 
好,我去看看,然后再试试
 
Tianbing2008:
请问appbar是什么?
 
你做一个系统托盘程序就成了
可以解决你的问题

这个如何:

---- 1、如何以小图标形式显示在系统的Tray小图标区?

---- Windows 95/98是基于事件驱动机制的操作系统。任何一个控件都是通过发消息
或对系统消息的处理来实现功能的。系统的Tray小图标区实际上也是一个标准控件。
对它的控制和操纵,与其他的标准控件一样,也是通过发送消息和处理消息进行的。
应用程序通过系统功能调用Shell_NotifyIcon向Tray小图标区发送消息,即可达到我
们的目的。

Shell_NotifyIcon函数包含在单元ShellApi中,说明如下:
function Shell_NotifyIcon(dwMessage: DWORD;
lpData: PNotifyIconData): BOOL; stdcall;
其中:
dwMessage:要发给Tray小图标区的消息,
可以取以下三个值:
NIM_ADD 在Tray小图标区上增加一个图标
NIM_MODIFY 修改一个Tray小图标区的图标
   NIM_DELETE 删除Tray小图标区的一个图标
lpData:指向TNotifyIconDataA结构的指针,
此结构是要增加的图标的信息。
PNotifyIconData = ^TNotifyIconDataA
TNotifyIconDataA = record
   cbSize : DWORD;
   Wnd : HWND;
   uID : UINT;
   uFlags : UINT;
   uCallbackMessage : UINT;
   hIcon : HICON;
   szTip : array [0..63] of AnsiChar;
end;

---- 各字段的含义如下所述:
cbSize:记录TNotifyIconDataA的大小,
设置为SizeOf( TNotifyIconDataA);
Wnd:接收Tray小图标区鼠标事件的窗口
的句柄,例如:MainForm.Handle;
uID:图标的ID(Tray小图标区鼠标
事件的wPara参数的值);
uFlags:此条消息的有效范围(低三位有效)
NIF_MESSAGE 0x1 // uCallbackMessage参数有效
NIF_ICON 0x2 // hIcon is valid参数有效
NIF_TIP 0x4 // szTip is valid参数有效
uCallbackMessage:系统回送消息的ID;
hIcon:显示在Tray小图标区上的图标的句柄;
szTip:鼠标移动到图标上时系统显示的提示信息。

增加小图标程序如下:
procedure TMainForm.InstallIcon;
var IconData: TNotifyIconData;
begin
CdRomIcon := TIcon.Create;
CdRomIcon.LoadFromFile( 'cddrive.ico' );
IconData.cbSize := SizeOf( IconData );
IconData.Wnd := Handle;
IconData.uID := 1;
IconData.uFlags := NIF_ICON
or NIF_MESSAGE or NIF_TIP;
IconData.uCallBackMessage := WM_USER+1;
IconData.hIcon := CdRomIcon.Handle;
IconData.szTip := 'CDROM软开关';
Shell_NotifyIcon( NIM_ADD, @IconData );
end;

---- 记住,在单元的USES子句中,别忘了要加上ShellApi单元。

---- 3、如何响应Tray小图标区上图标的鼠标事件?
---- 当用户在你的图标上移动、点击时,Tray小图标区会向应用程序发送如下的消息:
  messageID = uCallbackMessage
  wParam = uID
  lParam = mouse event (如:WM_LBUTTONDOWN)

---- 我们只需在主窗口的定义中,声明一个过程,来响应这个消息,在它的实现部分就
可以对消息进行处理了。 消息处理函数声明:
procedure IconOnClick(var message:
TMessage); message WM_USER+1;
实现过程:
procedure TMainForm.IconOnClick
( var message: Tmessage);
var p : TPoint;
begin
if (message.lParam = WM_LBUTTONDOWN) then
ShowWindow(Handle, SW_SHOW );
if (message.lParam = WM_RBUTTONDOWN) then
begin
GetCursorPos(p);
pop1.Popup( p.x ,p.y );
end;
end;
---- 其中,pop1为在主窗口中定义的弹出式菜单。

---- 4、如何控制系统任务栏上不显示应用程序?
---- 通常的Windows程序在启动后,会在系统任务栏上显示一个小窗口,我们既然
已有了小图标,就没必要再显示一个小窗口了。
---- 这可以通过下列函数实现
SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
ShowWindow(Handle, SW_HIDE);

 
后退
顶部