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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? magnetic.pas

?? 下面又是翻譯: 韓國人 Silhwan Hyun 改寫。 TMagnetic Class 是一個 Delphi 版本的"cMagneticWnd" 類
?? PAS
?? 第 1 頁 / 共 2 頁
字號:
// unit Magnetic
//
//  TMagnetic object is a Delphi version equivalent of Visual Basic "cMagneticWnd" class
//   written by Emil Weiss.
//  The forms adapting this object snap to each other, and the form defined as Parent
//    form drags its child forms snapped to that, at beging dragged by user.
//  The original "cMagneticWnd" class directly implants hooking code to sub class
//   window message procedure of form, so we do not need to put extra code to sub class
//   at programming Visual Basic application with that.
//  But straight conversioned Delphi object using above method does not work, (There should
//   be some modifications to adjust some differences between Visual Basic and Delphi)
//   and I could not find out solution.
//  So, I decided to use custom message handler which indirectly calls "zSubclass_Proc" of
//   TMagnetic object, for Delphi version.
//  And we should put extra code per each Form unit to define custom message handler to use
//   TMagnetic object.
//
//  Usage :
//
//   A. Define 7 message handlers in Form class definition phrase as follows,
//
//    TAnyForm = class(TForm)
//               .
//               .
//    private
//      { Private declarations }
//               .
//               .
//    public
//      { Public declarations }
//               .
//               .
//      procedure WMEnterSizeMove(var Msg: TMessage); message WM_ENTERSIZEMOVE;
//      procedure WMSizing(var Msg: TMessage); message WM_SIZING;
//      procedure WMMoving(var Msg: TMessage); message WM_MOVING;
//      procedure WMExitSizeMove(var Msg: TMessage); message WM_EXITSIZEMOVE;
//      procedure WMSysCommand(var Msg: TMessage); message WM_SYSCOMMAND;
//      procedure WMCommand(var Msg: TMessage); message WM_COMMAND;
//      procedure WMShowHideWindow(var Msg: TMessage); message WM_WINDOWPOSCHANGED; { for Sub Forms only }
//    end;
//
//
//  B. Define a global variable which will be used a function pointer to the function
//     "Subclass_Proc" in this unit like this,
//
//    MagneticWndProc: TSubClass_Proc;   { TSubClass_Proc is defined in this unit }
//
//
//  C. Write message handling procedures for the messages defined above as follows,
//
//    procedure TAnyForm.WMEnterSizeMove(var Msg: TMessage);
//    var
//      bHandled: Boolean;
//    begin
//      inherited;
//
//      if Assigned(MagneticWndProc) then
//         MagneticWndProc(Self.Handle, WM_ENTERSIZEMOVE, Msg, bHandled);
//    end;
//
//    procedure TAnyForm.WMExitSizeMove(var Msg: TMessage);
//    { Same to above, just change  "if MagneticWndProc(Self.Handle, WM_ENTERSIZEMOVE, ..."
//                           to     "if MagneticWndProc(Self.Handle, WM_EXITSIZEMOVE, .."  }
//
//    procedure TAnyForm.WMSysCommand(var Msg: TMessage);
//    { Same to above, just change  "if MagneticWndProc(Self.Handle, WM_ENTERSIZEMOVE, ..."
//                           to     "if MagneticWndProc(Self.Handle, WM_SYSCOMMAND, .."  }
//    end;
//
//    procedure TAnyForm.WMCommand(var Msg: TMessage);
//    { Same to above, just change  "if MagneticWndProc(Self.Handle, WM_ENTERSIZEMOVE, ..."
//                           to     "if MagneticWndProc(Self.Handle, WM_COMMAND, .."  }
//    end;
//
//    procedure TAnyForm.WMShowHideWindow(var Msg: TMessage);   { for Sub Forms only }
//    { Same to above, just change  "if MagneticWndProc(Self.Handle, WM_ENTERSIZEMOVE, ..."
//                           to     "if MagneticWndProc(Self.Handle, WM_WINDOWPOSCHANGED, .."  }
//    end;
//
//    procedure TAnyForm.WMSizing(var Msg: TMessage);
//    var
//      bHandled: Boolean;
//    begin
//      if not Assigned(MagneticWndProc) then
//         inherited
//      else
//         if MagneticWndProc(Self.Handle, WM_SIZING, Msg, bHandled) then
//         begin
//            if not bHandled then
//               inherited
//         end else
//            inherited;
//    end;
//
//    procedure TAnyForm.WMMoving(var Msg: TMessage);
//    { Same to above, just change  "if MagneticWndProc(Self.Handle, WM_SIZING, ..."
//                           to     "if MagneticWndProc(Self.Handle, WM_MOVING, .."  }
//
//
//  D. Register the forms to be endowed with magnectic effect as below, at Form show
//     procedures.
//
//    if Assigned(MagneticWnd) then
//    begin
//     { p : variable defined as pointer }
//       if MagneticWnd.AddWindow(Self.Handle, 0, p) then                  { for Parent form }
//    // if MagneticWnd.AddWindow(Self.Handle, ParentForm.Handle, p) then  { for Child form }
//          @MagneticWndProc := p;
//    end;
//
//   (note) "Child form" does not mean that it is a child object of "Parent form".
//          "Child form" means only it is subject to be dragged as "Parent form" is
//          moving.
//
//
//  E. Unregister the forms as below, at Form destroy procedures.
//
//    if Assigned(MagneticWnd) then
//       MagneticWnd.RemoveWindow(Self.Handle);   // Stops magnetic effect
//
//
//  F. (for Parent form unit only) Put a sentence to create an instance of TMagnetic object.
//
//  { MagneticWnd is a variable defined in this unit as TMagnetic object. }
//    MagneticWnd := TMagnetic.Create;    // Preferably at form creation procedure
//
//  G. (for Parent form unit only) Put a sentence to release the instance of TMagnetic object.
//
//    MagneticWnd.Free;                   // Preferably at form destroy procedure
//
//  note) You can use a subclssed widnow procedure instead of message handlers.
//        See the units of Demo project.
//
//  Drafter : Emil Weiss
//
//  Rewritten by Silhwan Hyun   ( 04 Dec 2008 )
//


unit Magnetic;

interface

uses
  Windows, SysUtils, Messages;

Type
  PWND_INFO = ^TWND_INFO;
  TWND_INFO = record
    h_wnd      : HWND;
    hWndParent : HWND;
    Glue       : Boolean;
  end;

  TSubClass_Proc = function(lng_hWnd: HWND; uMsg: Integer;
                            var Msg: TMessage; var bHandled: Boolean) : boolean;

  TMagnetic = class
    constructor Create;
    Destructor Destroy; Override;

   private
    FSnapWidth    : integer;
    m_uWndInfo    : array of TWND_INFO;
    m_rcWnd       : array of TRECT;
    m_lWndCount   : Integer;
    m_ptAnchor    : TPOINT;
    m_ptOffset    : TPOINT;
    m_ptCurr      : TPOINT;
    m_ptLast      : TPOINT;

    function  GetSnapWidth: Integer;
    procedure SetSnapWidth(const Value: Integer);
    procedure pvSizeRect(Handle: HWND; var rcWnd: TRECT; lfEdge: Integer);
    procedure pvMoveRect(Handle: HWND; var rcWnd: TRECT);
    procedure pvCheckGlueing;
    function  pvWndsConnected(rcWnd1: TRECT; rcWnd2: TRECT): Boolean;
    function  pvWndGetInfoIndex(Handle: HWND): Integer;
    function  pvWndParentGetInfoIndex(hWndParent: HWND): Integer;
    procedure zSubclass_Proc(lng_hWnd: HWND;
                             uMsg, wParam, lParam: Integer;
                             var lReturn: Integer;
                             var bHandled: Boolean);

   public
    function  AddWindow(Handle: HWND; hWndParent: HWND; var FuncPointer : TSubClass_Proc): Boolean;
    function  RemoveWindow(Handle: HWND): Boolean;
    procedure CheckGlueing;
    property  SnapWidth: Integer read GetSnapWidth write SetSnapWidth;
  end;

Const
  LB_RECT = 16;

Var
  MagneticWnd: TMagnetic;


implementation


function Subclass_Proc(lng_hWnd: HWND;
                       uMsg: Integer;
                       var Msg: TMessage;
                       var bHandled: Boolean) : boolean;
begin
   if Assigned(MagneticWnd) then
   begin
      MagneticWnd.zSubclass_Proc(lng_hWnd, uMsg,
                                 Msg.wParam, Msg.lParam, Msg.Result, bHandled);
      result := true;
   end else
      result := false;
end;

constructor TMagnetic.create;

begin
 // Default snap width
  SnapWidth := 10;

 // Initialize registered number of window
  m_lWndCount := 0;
end;


Destructor TMagnetic.Destroy;
begin
   MagneticWnd := nil;
   
   SetLength(m_uWndInfo, 0);  // not sure this is needed
   SetLength(m_rcWnd, 0);     // not sure this is needed

   inherited;
end;


function TMagnetic.GetSnapWidth: Integer;
begin
  Result := FSnapWidth;
end; 

procedure TMagnetic.SetSnapWidth(const Value: Integer);
begin
  FSnapWidth := Value; 
end;

procedure TMagnetic.zSubclass_Proc(lng_hWnd: HWND;
                                   uMsg, wParam, lParam: Integer;
                                   var lReturn: Integer;
                                   var bHandled: Boolean);
{
Parameters:
   lng_hWnd - The window handle
   uMsg     - The message number
   wParam   - Message related data
   lParam   - Message related data
   lReturn  - Set this variable as per your intentions and requirements, see the MSDN
              documentation or each individual message value.
   bHandled - Set this variable to True in a 'before' callback to prevent the message being
              subsequently processed by the default handler... and if set, an 'after' callback
}

{
Notes:
   If you really know what you're doing, it's possible to change the values of the
   lng_hWnd, uMsg, wParam and lParam parameters in a 'before' callback so that different
   values get passed to the default handler.. and optionaly, the 'after' callback
}
Var
  rcWnd : TRECT;
  lC    : Integer;
  pWINDOWPOS : ^TWINDOWPOS;
begin
    bHandled := false;

    Case uMsg of
        // Size/Move starting
        WM_ENTERSIZEMOVE:
        begin
            // Get Desktop area (as first rectangle)
            SystemParametersInfo(SPI_GETWORKAREA, 0, @m_rcWnd[0], 0);

            // Get rectangles of all handled windows
            For lC := 1 To m_lWndCount do
             begin
                // Window maximized ?
                If (IsZoomed(m_uWndInfo[lC].h_wnd)) Then
                  begin
                    // Take work are rectangle
                    CopyMemory(@m_rcWnd[lC], @m_rcWnd[0], LB_RECT);
                  end Else
                    // Get window rectangle
                    GetWindowRect((m_uWndInfo[lC].h_wnd), m_rcWnd[lC]);

                // Is it our current window ?
                If (m_uWndInfo[lC].h_wnd = lng_hWnd) Then
                  begin
                    // Get anchor-offset
                    GetCursorPos(m_ptAnchor);
                    GetCursorPos(m_ptLast);
                    m_ptOffset.x := m_rcWnd[lC].Left - m_ptLast.x;
                    m_ptOffset.y := m_rcWnd[lC].Top - m_ptLast.y;
                  end;
            end;
         end;
        // Sizing
        WM_SIZING:
         begin
            CopyMemory(@rcWnd, pointer(lParam), LB_RECT);
            pvSizeRect(lng_hWnd, rcWnd, wParam);
            CopyMemory(pointer(lParam), @rcWnd, LB_RECT);

            bHandled := True;
            lReturn := 1;
         end;
        // Moving
        WM_MOVING:
          begin
            CopyMemory(@rcWnd, pointer(lParam), LB_RECT);
            pvMoveRect(lng_hWnd, rcWnd);
            CopyMemory(pointer(lParam), @rcWnd, LB_RECT);

            bHandled := True;
            lReturn := 1;
          end;
        // Size/Move finishing
        WM_EXITSIZEMOVE:
          begin
            pvCheckGlueing;
          end;
        // at after Shown or Hidden window
        WM_WINDOWPOSCHANGED:  // ************** Added
          begin
            pWINDOWPOS := pointer(lParam);
            if ((pWINDOWPOS^.flags and SWP_SHOWWINDOW) = SWP_SHOWWINDOW) or
               ((pWINDOWPOS^.flags and SWP_HIDEWINDOW) = SWP_HIDEWINDOW) then
               pvCheckGlueing;
          end;
        // Special case: *menu* call
        WM_SYSCOMMAND:
          begin
            If (wParam = SC_MINIMIZE) Or (wParam = SC_RESTORE) Then
                pvCheckGlueing;

          end;
        // Special case: *control* call
        WM_COMMAND:
          begin
            pvCheckGlueing;
          end;
    End;
End;


function TMagnetic.AddWindow(Handle: HWND; hWndParent: HWND; var FuncPointer : TSubClass_Proc): Boolean;
Var
  lC : Integer;

begin
    Result := false;  // assume failure
    FuncPointer := nil;
    
    // Already in collection ?
    For lC := 1 To m_lWndCount do
      begin
        If (Handle = m_uWndInfo[lC].h_wnd) Then
          Exit;
      end;

    // Validate windows
    If IsWindow(Handle) And (IsWindow(hWndParent) Or (hWndParent = 0)) Then  //********* Changed
    begin
        // Increase count
        inc(m_lWndCount);

        // Resize arrays
        SetLength(m_uWndInfo, m_lWndCount+1);
        SetLength(m_rcWnd, m_lWndCount+1);

        // Add info
        m_uWndInfo[m_lWndCount].h_wnd := Handle;
        if hWndParent = Handle then      // Parent window is Self window ?       //******** Added
           m_uWndInfo[m_lWndCount].hWndParent := 0  // Then same to "no parent"  //******** Added
        else
           m_uWndInfo[m_lWndCount].hWndParent := hWndParent;

        // Check glueing for first time
        pvCheckGlueing;

        FuncPointer := Subclass_Proc;

        // Success
        Result := True;
    End;
End;


function TMagnetic.RemoveWindow(Handle: HWND): Boolean;
Var
  lc1 : Integer;
  lc2 : Integer;

begin
    Result := false;  // assume failure

    For lc1 := 1 To m_lWndCount do
    begin
        If (Handle = m_uWndInfo[lc1].h_wnd) Then
        begin
            // Move down
            For lc2 := lc1 To (m_lWndCount - 1) do
            begin
                m_uWndInfo[lc2] := m_uWndInfo[lc2 + 1];
            end;

            // Resize arrays
              dec(m_lWndCount);
              SetLength(m_uWndInfo, m_lWndCount+1);
              SetLength(m_rcWnd, m_lWndCount+1);

            // Remove parent relationships
            For lc2 := 1 To m_lWndCount do
            begin
                If (m_uWndInfo[lc2].hWndParent = Handle) Then
                    m_uWndInfo[lc2].hWndParent := 0;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久色在线观看| 日本女优在线视频一区二区| 成人免费高清在线观看| 亚洲sss视频在线视频| 久久综合999| 欧美丝袜丝交足nylons| 国产在线看一区| 亚洲欧美日韩国产一区二区三区| 在线观看欧美精品| 国产一区二区91| 夜夜精品视频一区二区| 久久久www成人免费毛片麻豆| 91免费看视频| 国产精品影音先锋| 日本欧美肥老太交大片| 一区二区三区.www| 中文字幕一区二区日韩精品绯色| 日日摸夜夜添夜夜添国产精品| 精品久久久久久久久久久院品网 | 国产91清纯白嫩初高中在线观看| 麻豆精品在线视频| 中文字幕一区二区三区四区不卡| 欧美性感一区二区三区| 国产成人啪免费观看软件| 视频一区视频二区中文| 国产精品国产三级国产| 欧美精品久久一区| 99国产精品久久久久| 国产综合久久久久影院| 亚洲国产sm捆绑调教视频 | 另类小说图片综合网| 亚洲小说春色综合另类电影| 亚洲综合在线电影| 午夜视频一区二区| 免费不卡在线视频| 国产69精品久久久久毛片| 成人激情文学综合网| 91黄色免费看| 欧美日韩国产123区| 日韩欧美亚洲一区二区| 国产欧美va欧美不卡在线| 1024成人网| 美美哒免费高清在线观看视频一区二区| 日本成人在线看| 国产在线播放一区| 在线观看www91| 欧美第一区第二区| 精品国产一区a| av在线播放不卡| 欧美日本国产视频| 日韩黄色在线观看| 26uuu亚洲| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 欧美网站一区二区| 国产精品你懂的| 国内成+人亚洲+欧美+综合在线 | 99久久精品免费| 制服丝袜一区二区三区| 亚洲天堂免费在线观看视频| 免费在线观看一区| 在线不卡一区二区| 亚洲国产一区二区在线播放| 欧美主播一区二区三区美女| 亚洲视频一区二区在线观看| 日韩中文字幕不卡| 6080日韩午夜伦伦午夜伦| 亚洲成人av中文| 欧美一区二区在线视频| 同产精品九九九| 欧美一区二区视频在线观看2020| 中文字幕精品综合| 91麻豆免费在线观看| 中文字幕精品三区| 菠萝蜜视频在线观看一区| 久久综合中文字幕| 国产精品系列在线观看| 欧美精品一区二区精品网| 美女视频一区二区| 日本一区二区视频在线| 成人av第一页| 日本最新不卡在线| 国产精品久久777777| 欧美性色综合网| 国产剧情一区在线| 精品亚洲国产成人av制服丝袜 | 亚洲女同一区二区| 欧美精品视频www在线观看| 国产福利一区在线| 精品亚洲国内自在自线福利| 精品国产精品网麻豆系列| 国产suv一区二区三区88区| 亚洲黄网站在线观看| 精品福利一二区| www.亚洲色图.com| 亚洲精品va在线观看| 国产三级精品视频| 911精品国产一区二区在线| 国产高清精品久久久久| 亚洲国产精品一区二区www| 国产精品久久一级| 国产精品视频一二| 91精品国产一区二区三区蜜臀 | 精品一区中文字幕| 日韩激情在线观看| 亚洲v日本v欧美v久久精品| 中文字幕一区二区视频| 欧美国产一区在线| 中文字幕一区免费在线观看 | 日韩一级免费一区| 7878成人国产在线观看| 欧美三级中文字| 欧美精品久久一区| 精品久久久久久久久久久院品网| 日韩一区二区不卡| 久久久夜色精品亚洲| 国产三级精品视频| 亚洲美腿欧美偷拍| 亚洲第一福利一区| 精品一区免费av| www.亚洲色图| 欧美乱妇一区二区三区不卡视频| 欧美日韩一区三区| 久久中文字幕电影| 亚洲综合网站在线观看| 日本aⅴ免费视频一区二区三区| 蜜桃av噜噜一区二区三区小说| 国产在线不卡一卡二卡三卡四卡| 不卡一二三区首页| 欧美一区二区精美| 国产欧美日韩另类一区| 一级中文字幕一区二区| 久久成人综合网| 日本高清不卡在线观看| 精品国产一区a| 亚洲大片一区二区三区| 成人在线综合网| 精品国产污污免费网站入口 | 欧美日韩卡一卡二| 日本一区二区三区免费乱视频| 日韩成人av影视| 色视频成人在线观看免| 欧美精品一区二区三区蜜桃视频| 一区二区三区国产| 成人av综合一区| 国产精品人成在线观看免费| 免费高清在线一区| 欧美美女直播网站| 亚洲永久免费视频| 91成人在线观看喷潮| 亚洲欧美一区二区三区久本道91| 国产精品99久久久久久久女警| 精品免费国产二区三区| 国内精品伊人久久久久av影院 | 欧美成人vps| 国内欧美视频一区二区| 久久精品无码一区二区三区| 国产精品99久久久| 中文字幕一区二区不卡| 欧美日韩你懂的| 午夜精品久久久久久久| 日韩一级在线观看| 成人app软件下载大全免费| 国产精品乱码妇女bbbb| 在线观看亚洲成人| 国产一区二区三区四区五区入口| 精品国产露脸精彩对白| 国产成+人+日韩+欧美+亚洲| 国产精品国产三级国产| 欧美精品丝袜久久久中文字幕| 精品一区二区三区的国产在线播放| www亚洲一区| 色久综合一二码| 国产美女娇喘av呻吟久久| 一区二区三区鲁丝不卡| 中文字幕av免费专区久久| 91麻豆免费看| 懂色av一区二区夜夜嗨| 天天综合网 天天综合色| 久久久精品人体av艺术| 日韩午夜激情av| 欧美精品高清视频| 成a人片国产精品| 国产一区二区三区观看| 人人爽香蕉精品| 亚洲综合激情小说| 亚洲欧洲精品一区二区精品久久久| 欧美一区二区女人| 欧美一区二区久久久| 欧美日韩精品免费| 欧美吞精做爰啪啪高潮| av成人动漫在线观看| 波多野结衣亚洲| 大陆成人av片| 91福利在线免费观看| 在线看日本不卡| 欧美情侣在线播放| 制服丝袜在线91| 久久综合五月天婷婷伊人| 国产午夜精品在线观看| 欧美韩国日本不卡|