亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? znhideform.pas

?? 一個(gè)隱藏窗體的代碼例子個(gè)人感覺還不錯(cuò)值得大家學(xué)習(xí)
?? PAS
字號(hào):
{*******************************************************************************
  作者: dmzn dmzn@163.com 2006-02-09
  描述: 使窗體在桌面邊沿停靠的組件,類似QQ自動(dòng)隱藏的樣式

  聲明: 本單元公開源碼,個(gè)人/商業(yè)可免費(fèi)使用,不過請(qǐng)保留此處的說明文字.如果你
  對(duì)本單元作了合理修改,請(qǐng)郵件通知我,謝謝!
*******************************************************************************}
unit ZnHideForm;

interface

uses
  Classes, Controls, ExtCtrls, Forms, Windows, Messages, SysUtils;

type
  TDockPos = (dpNone, dpTop, dpLeft, dpRight);
  TDockEvent = procedure (const nDockPos: TDockPos) of Object;

  TZnHideForm = class(TComponent)
  private
    { Private declarations }
    FWnd: Hwnd;
    FIdle: Cardinal;

    FIsHide: boolean;
    FDockPos: TDockPos;

    FAutoDock: boolean;
    FEdgeSpace: integer;
    FValidSpace: integer;

    FMainForm: TForm;
    FFormRect: TRect;
    FFormProc: TWndMethod;

    FDockEvent: TDockEvent;
    FHideEvent: TDockEvent;
    FShowEvent: TDockEvent;
  protected
    { Protected declarations }
    function FindMainForm: TForm;
    procedure WndProc(var nMsg: TMessage);

    procedure SetFormShow;
    procedure SetFormHide;
    function IsMouseLeave: boolean;

    procedure CaptureMsg(var Message: TMessage);
    procedure DockFormToEdge(const nRect: PRect);

    procedure SetAutoDock(const nValue: boolean);
    procedure SetEdgeSpace(const nSpace: integer);
    procedure SetValidSpace(const nSpace: integer);
  public
    { Public declarations }
    constructor Create(AOwner: TComponent);override;
    destructor Destroy;override;
  published
    { Published declarations }
    property DockPos: TDockPos read FDockPos;
    property AutoDock: Boolean read FAutoDock write SetAutoDock;
    property EdgeSpace: integer read FEdgeSpace write SetEdgeSpace;
    property ValidSpace: integer read FValidSpace write SetValidSpace;

    property DockEvent: TDockEvent read FDockEvent write FDockEvent;
    property OnHideForm: TDockEvent read FHideEvent write FHideEvent;
    property OnShowForm: TDockEvent read FShowEvent write FShowEvent; 
  end;

procedure Register;

implementation

procedure Register;
begin
  RegisterComponents('RunSoft',[TZnHideForm]);
end;

{****************************  TZnHideForm  ****************************}
constructor TZnHideForm.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FMainForm := FindMainForm;
  if not Assigned(FMainForm) then raise Exception.Create('未找到主窗體');

  FIdle := 0;
  FEdgeSpace := 3;
  FValidSpace := 10;
 
  FDockPos := dpNone;  
  FAutoDock := False;

  if not (csDesigning in ComponentState) then
  begin
     FFormRect := FMainForm.BoundsRect;
     FFormProc := FMainForm.WindowProc;
     FMainForm.WindowProc := CaptureMsg;
  end;
end;

destructor TZnHideForm.Destroy;
begin
  if Assigned(FMainForm) and
     Assigned(FFormProc) then FMainForm.WindowProc := FFormProc;

  SetAutoDock(False);
  inherited Destroy;
end;

//Desc: 搜索主窗體
function TZnHideForm.FindMainForm: TForm;
var nComponent: TComponent;
begin
  Result := nil;
  nComponent := Self.Owner;

  while Assigned(nComponent) do
  begin
     if (nComponent is TForm) then
     begin
        Result := nComponent as TForm;
        Break;
     end;
     nComponent := nComponent.GetParentComponent;
  end;
end;

//Desc: 開啟/關(guān)閉Dock
procedure TZnHideForm.SetAutoDock(const nValue: boolean);
begin
  FAutoDock := nValue;

  if not (csDesigning in ComponentState) then
    if FAutoDock then
    begin
       FWnd := Classes.AllocateHWnd(WndProc);
       SetTimer(FWnd, 1, 558, nil);
    end else

    if FWnd > 0 then
    begin
       KillTimer(FWnd, 1);
       Classes.DeallocateHWnd(FWnd);
       FWnd := 0; FIdle := 0; FDockPos := dpNone;
    end;
end;

//Desc: 計(jì)數(shù)器在查數(shù),^_^
procedure TZnHideForm.WndProc(var nMsg: TMessage);
begin
  with nMsg do
  begin
     if Msg = WM_TIMER then
          Inc(FIdle)
     else Result := DefWindowProc(FWnd, Msg, wParam, lParam);
  end;
end;

//Name: DockFormToEdge
//Parm: nRect,窗體當(dāng)前所在區(qū)域
//Desc: 依據(jù)nRect判斷窗口是否需要Dock到邊沿
procedure TZnHideForm.DockFormToEdge(const nRect: PRect);
begin
  if (nRect.Top < FValidSpace) and (nRect.Top <= FFormRect.Top) then
  //Top
  begin
     nRect.Bottom := nRect.Bottom - nRect.Top;
     nRect.Top := 0;
  end else

  if (nRect.Left < FValidSpace) and (nRect.Left <= FFormRect.Left) then
  //Left
  begin
     nRect.Right := nRect.Right - nRect.Left;
     nRect.Left := 0;
  end else

  if (Screen.Width - nRect.Right < FValidSpace) and (nRect.Left >= FFormRect.Left) then
  //Right
  begin
     nRect.Left := Screen.Width - (nRect.Right - nRect.Left);
     nRect.Right := Screen.Width;
  end;

  if nRect.Top = 0 then
     FDockPos := dpTop else
  if nRect.Left = 0 then
     FDockPos := dpLeft else
  if nRect.Right = Screen.Width then
     FDockPos := dpRight else FDockPos := dpNone;

  FFormRect := nRect^; //Save MainForm Rects
  if (FDockPos <> dpNone) and Assigned(FDockEvent) then FDockEvent(FDockPos);
end;

//Desc: 判斷鼠標(biāo)是否離開主窗體
function TZnHideForm.IsMouseLeave: boolean;
var nPt: TPoint;
begin
  GetCursorPos(nPt);
  if PtInRect(FFormRect, nPt) then
       Result := False
  else Result := True;
end;

procedure TZnHideForm.SetFormHide;
begin
  if IsMouseLeave then
  begin
     FIsHide := True;
     if Assigned(FHideEvent) then
     begin
        FHideEvent(FDockPos); Exit;
     end;

     if FDockPos = dpTop then
        FMainForm.Top := -FMainForm.Height + FEdgeSpace else
     if FDockPos = dpLeft then
        FMainForm.Left := -FMainForm.Width + FEdgeSpace else
     if FDockPos = dpRight then
        FMainForm.Left := Screen.Width - FEdgeSpace;
  end;
end;

procedure TZnHideForm.SetFormShow;
begin
  FIsHide := False;
  if Assigned(FShowEvent) then
  begin
     FShowEvent(FDockPos); Exit;
  end;

  if FDockPos = dpTop then
     FMainForm.Top := 0 else
  if FDockPos = dpLeft then
     FMainForm.Left := 0 else
  if FDockPos = dpRight then
     FMainForm.Left := Screen.Width - FMainForm.Width;
end;

procedure TZnHideForm.SetEdgeSpace(const nSpace: integer);
begin
  if (nSpace > 0) and (nSpace < 51) then
       FEdgeSpace := nSpace
  else raise Exception.Create('請(qǐng)?zhí)顚?-50以內(nèi)的數(shù)字'); 
end;

procedure TZnHideForm.SetValidSpace(const nSpace: integer);
begin
  if (nSpace > 4) and (nSpace < 51) then
       FValidSpace := nSpace
  else raise Exception.Create('請(qǐng)?zhí)顚?-50以內(nèi)的數(shù)字'); 
end;

procedure TZnHideForm.CaptureMsg(var Message: TMessage);
begin
  if Assigned(FFormProc) then FFormProc(Message);
  
  if FAutoDock then
  case Message.Msg of
    CM_MOUSEENTER : if FIsHide then SetFormShow;
    CM_MOUSELEAVE : if FDockPos <> dpNone then SetFormHide;
    WM_MOVING     : DockFormToEdge(PRect(Message.lParam));
  end;
end;

end.

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美123| 日韩欧美综合在线| 成人国产在线观看| 国产高清在线精品| 风流少妇一区二区| av成人免费在线观看| 成人免费高清在线观看| 成人激情小说乱人伦| av成人动漫在线观看| 在线影视一区二区三区| 欧美日韩大陆一区二区| 91精品国产麻豆国产自产在线| 欧美一区二区三区免费大片 | 欧美日韩日本视频| 欧美一区二区三区精品| 久久―日本道色综合久久 | a4yy欧美一区二区三区| 欧美电影免费观看完整版| 欧美一级片免费看| 精品国产sm最大网站免费看| 国产日韩成人精品| 亚洲另类色综合网站| 同产精品九九九| 国产一区二区电影| 色国产综合视频| 欧美一区二区人人喊爽| 国产亚洲综合色| 亚洲精品成a人| 久久精品国产亚洲一区二区三区| 国产99久久久国产精品潘金 | 中文字幕亚洲一区二区va在线| 亚洲日本va在线观看| 秋霞电影网一区二区| 成a人片亚洲日本久久| 欧美日韩一区二区在线观看| wwww国产精品欧美| 亚洲综合色区另类av| 激情小说欧美图片| 中文字幕免费不卡| 午夜欧美大尺度福利影院在线看 | 久久久久久久性| 亚洲一线二线三线视频| 成人中文字幕合集| 日韩亚洲电影在线| 一区二区三区在线不卡| 韩国女主播一区| 制服丝袜一区二区三区| 亚洲精品中文在线观看| 国产**成人网毛片九色| 欧美军同video69gay| 中文字幕一区二区三| 国产高清不卡一区二区| 日韩一区二区三区免费观看| 亚洲免费在线电影| 成人国产精品视频| 久久精品夜色噜噜亚洲aⅴ| 日韩黄色小视频| 欧美网站大全在线观看| 亚洲欧美另类在线| a级高清视频欧美日韩| 国产日产欧美一区二区视频| 久久99精品国产.久久久久久| 欧美高清一级片在线| 一区二区三区产品免费精品久久75| 粉嫩久久99精品久久久久久夜| 精品成人在线观看| 精品一区二区免费| 精品国产凹凸成av人网站| 麻豆精品一二三| 91精品国产aⅴ一区二区| 亚洲va国产天堂va久久en| 欧美在线不卡一区| 亚洲午夜精品17c| 欧美最猛性xxxxx直播| 亚洲综合在线五月| 欧美性色aⅴ视频一区日韩精品| 亚洲老妇xxxxxx| 欧美亚洲高清一区二区三区不卡| 亚洲精品免费一二三区| 91丨porny丨首页| 亚洲综合图片区| 在线播放视频一区| 理论电影国产精品| 国产色综合一区| 91蜜桃婷婷狠狠久久综合9色| 日韩美女视频19| 欧美三级电影网站| 日韩av电影免费观看高清完整版| 在线不卡一区二区| 久久电影国产免费久久电影 | 色婷婷国产精品综合在线观看| 亚洲欧洲av一区二区三区久久| 色噜噜狠狠色综合中国| 图片区日韩欧美亚洲| 日韩一级黄色大片| 国产91在线|亚洲| 亚洲三级电影全部在线观看高清| 欧美日韩一区不卡| 精东粉嫩av免费一区二区三区| 亚洲国产高清在线观看视频| 欧美在线|欧美| 久久97超碰国产精品超碰| 亚洲欧美一区二区视频| 91麻豆精品国产91久久久久| 精品一区二区成人精品| 亚洲乱码国产乱码精品精98午夜| 91精品国产福利在线观看| 不卡一卡二卡三乱码免费网站| 亚洲成人中文在线| 欧美激情在线免费观看| 91精品国产综合久久久蜜臀粉嫩| 国产高清久久久久| 日本欧美久久久久免费播放网| 国产精品乱人伦中文| 337p亚洲精品色噜噜| 91麻豆精品在线观看| 国内久久婷婷综合| 日韩中文字幕亚洲一区二区va在线| 久久久久久久久岛国免费| 欧美日韩国产bt| 97se亚洲国产综合自在线不卡 | 盗摄精品av一区二区三区| 亚洲国产精品自拍| 亚洲丝袜另类动漫二区| 精品福利在线导航| 欧美电影在哪看比较好| 91一区二区三区在线观看| 国产裸体歌舞团一区二区| 日韩av网站免费在线| 亚洲自拍偷拍图区| 中文字幕一区二区三区av| 国产日韩欧美综合在线| 欧美电影免费观看高清完整版| 日本精品视频一区二区| 成人精品一区二区三区四区| 久久99久久久欧美国产| 日日骚欧美日韩| 亚洲福利一区二区| 亚洲精品v日韩精品| 中文字幕亚洲精品在线观看| 国产无人区一区二区三区| 欧美v日韩v国产v| 日韩欧美一区二区免费| 欧美日韩成人综合天天影院| 在线精品视频一区二区三四| 色综合久久综合网欧美综合网| 99久久精品免费看国产免费软件| 国产精品18久久久| 成人黄色小视频| av亚洲精华国产精华精华| 成人午夜私人影院| 99久久er热在这里只有精品15| 91香蕉视频在线| 色狠狠桃花综合| 欧美日韩一区二区三区四区五区| 在线精品视频小说1| 在线观看视频91| 欧美丝袜丝交足nylons| 欧美一区欧美二区| 欧美v国产在线一区二区三区| 精品福利视频一区二区三区| 久久久不卡网国产精品一区| 欧美激情综合网| 一区二区日韩av| 日韩国产欧美在线观看| 捆绑调教美女网站视频一区| 国产一区二区福利| 99视频国产精品| 欧美日韩午夜在线视频| 欧美一区二区三区电影| 国产亚洲欧美激情| 亚洲日本一区二区| 日韩成人免费在线| 国产成人亚洲综合a∨婷婷图片| 99精品视频免费在线观看| 欧美色国产精品| 久久精品免视看| 午夜日韩在线电影| 国产福利一区二区三区在线视频| 91色.com| 欧美成人猛片aaaaaaa| 欧美激情综合网| 三级欧美在线一区| 豆国产96在线|亚洲| 欧美日韩免费一区二区三区| 欧美精品一区二区三区很污很色的| 国产精品色婷婷久久58| 日本欧美在线观看| 97se亚洲国产综合自在线不卡 | 亚洲国产激情av| 粉嫩欧美一区二区三区高清影视 | 欧美一级久久久久久久大片| 久久精品综合网| 亚洲va欧美va天堂v国产综合| 国产一区二区三区最好精华液| 99国产精品国产精品久久| 日韩欧美第一区| 一区二区三区不卡在线观看| 国产成人欧美日韩在线电影| 欧美日韩国产小视频|