| 導購 | 订阅 | 在线投稿
分享
 
 
 

Delphi實現QQ窗體的縮入伸出功能

2008-05-21 03:27:31  編輯來源:互聯網  简体版  手機版  移動版  評論  字體: ||

不知道大家在使用QQ時有沒有想到它的縮入伸出的功能是如何實現的呢?實現這個效果的關鍵在于如何判斷當前鼠標指針下面的窗體是不是我們的程序窗體。GetCursorPos()是一個可以獲得鼠標指針在屏幕中的坐標的API函數,利用它與FindVCLWindow()的結合就可以輕易地獲得鼠標指針下的VCL可視組件,但當一個窗體中不只一個VCL可視組件,例如可能還有TPanel、TMemo等等類型時,那麽我們就必須要查找到它們的Parent級,最終得到TForm,那就是指我們的程序窗體。按照這個思路我自定義了GetFormNameAt()函數,它可獲得當前鼠標指針下面的窗體的名稱。以下列出程序的主要實現代碼,供大家參考:

//自定義函數GetFormNameAt,獲得鼠標針指下窗體的Name

function GetFormNameAt ( X, Y : integer ) : string;

var

P:TPoint;

W:TWinControl;

begin

P.X := X;

P.Y := Y;

W := FindVCLWindow(P); //得到鼠標指針下的VCL可視組件

if ( nil <> W ) then

begin

while w.Parent<>nil do //當W的上級Parent不爲空時就繼續往上找

w:=w.Parent;

Result := W.Name;//最後返回窗體的名稱Name

end

else

begin

Result := 』』;

end;

end;

procedure TForm1.Timer1Timer(Sender: TObject);

var

winPos:TPoint;

begin

if (form1.Top<=3) or (form1.Left>=screen.Width-form1.Width-3) then //判?

begin

GetCursorPos(winpos); //得到當前鼠標指針的在屏幕上的坐標

//當鼠標指針下的窗體的Name等于form1.name時

if form1.name=GetFormNameAt(winpos.X,winpos.Y) then

{在此我們可以爲form1取一個特別的名稱,以防有別的窗體名稱與它相同}

begin

form1.Timer2.Enabled:=false; //停用Timer2

form1.Top:=0; //form1的Top與屏幕對齊

end

else

form1.Timer2.Enabled:=true; //開啓Timer2

end;

end;

procedure TForm1.Timer2Timer(Sender: TObject);

begin

if form1.Top<=20 then

form1.Top:=-(form1.Height-10);//將form1向上移,在屏幕上方露出10像素

end;

  不知道大家在使用QQ時有沒有想到它的縮入伸出的功能是如何實現的呢?實現這個效果的關鍵在于如何判斷當前鼠標指針下面的窗體是不是我們的程序窗體。GetCursorPos()是一個可以獲得鼠標指針在屏幕中的坐標的API函數,利用它與FindVCLWindow()的結合就可以輕易地獲得鼠標指針下的VCL可視組件,但當一個窗體中不只一個VCL可視組件,例如可能還有TPanel、TMemo等等類型時,那麽我們就必須要查找到它們的Parent級,最終得到TForm,那就是指我們的程序窗體。按照這個思路我自定義了GetFormNameAt()函數,它可獲得當前鼠標指針下面的窗體的名稱。以下列出程序的主要實現代碼,供大家參考:            //自定義函數GetFormNameAt,獲得鼠標針指下窗體的Name   function GetFormNameAt ( X, Y : integer ) : string;   var   P:TPoint;   W:TWinControl;   begin   P.X := X;   P.Y := Y;   W := FindVCLWindow(P); //得到鼠標指針下的VCL可視組件   if ( nil <> W ) then   begin   while w.Parent<>nil do //當W的上級Parent不爲空時就繼續往上找   w:=w.Parent;   Result := W.Name;//最後返回窗體的名稱Name   end   else   begin   Result := 』』;   end;   end;   procedure TForm1.Timer1Timer(Sender: TObject);   var   winPos:TPoint;   begin   if (form1.Top<=3) or (form1.Left>=screen.Width-form1.Width-3) then //判?   begin   GetCursorPos(winpos); //得到當前鼠標指針的在屏幕上的坐標   //當鼠標指針下的窗體的Name等于form1.name時   if form1.name=GetFormNameAt(winpos.X,winpos.Y) then   {在此我們可以爲form1取一個特別的名稱,以防有別的窗體名稱與它相同}   begin   form1.Timer2.Enabled:=false; //停用Timer2   form1.Top:=0; //form1的Top與屏幕對齊   end   else   form1.Timer2.Enabled:=true; //開啓Timer2   end;   end;   procedure TForm1.Timer2Timer(Sender: TObject);   begin   if form1.Top<=20 then   form1.Top:=-(form1.Height-10);//將form1向上移,在屏幕上方露出10像素   end;
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有