Delphi實(shí)現(xiàn)QQ窗體的縮入伸出功能

字號(hào):

不知道大家在使用QQ時(shí)有沒(méi)有想到它的縮入伸出的功能是如何實(shí)現(xiàn)的呢?實(shí)現(xiàn)這個(gè)效果的關(guān)鍵在于如何判斷當(dāng)前鼠標(biāo)指針下面的窗體是不是我們的程序窗體。GetCursorPos()是一個(gè)可以獲得鼠標(biāo)指針在屏幕中的坐標(biāo)的API函數(shù),利用它與FindVCLWindow()的結(jié)合就可以輕易地獲得鼠標(biāo)指針下的VCL可視組件,但當(dāng)一個(gè)窗體中不只一個(gè)VCL可視組件,例如可能還有TPanel、TMemo等等類型時(shí),那么我們就必須要查找到它們的Parent級(jí),最終得到TForm,那就是指我們的程序窗體。按照這個(gè)思路我自定義了GetFormNameAt()函數(shù),它可獲得當(dāng)前鼠標(biāo)指針下面的窗體的名稱。以下列出程序的主要實(shí)現(xiàn)代碼,供大家參考:
    //自定義函數(shù)GetFormNameAt,獲得鼠標(biāo)針指下窗體的Name
    function GetFormNameAt ( X, Y : integer ) : string;
    var
    P:TPoint;
    W:TWinControl;
    begin
    P.X := X;
    P.Y := Y;
    W := FindVCLWindow(P); //得到鼠標(biāo)指針下的VCL可視組件
    if ( nil <> W ) then
    begin
    while w.Parent<>nil do //當(dāng)W的上級(jí)Parent不為空時(shí)就繼續(xù)往上找
     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); //得到當(dāng)前鼠標(biāo)指針的在屏幕上的坐標(biāo)
    //當(dāng)鼠標(biāo)指針下的窗體的Name等于form1.name時(shí)
    if form1.name=GetFormNameAt(winpos.X,winpos.Y) then
     {在此我們可以為form1取一個(gè)特別的名稱,以防有別的窗體名稱與它相同}
    begin
     form1.Timer2.Enabled:=false; //停用Timer2
     form1.Top:=0; //form1的Top與屏幕對(duì)齊
    end
    else
    form1.Timer2.Enabled:=true; //開(kāi)啟Timer2
    end;
    end;
    procedure TForm1.Timer2Timer(Sender: TObject);
    begin
    if form1.Top<=20 then
    form1.Top:=-(form1.Height-10);//將form1向上移,在屏幕上方露出10像素
    end;