这个代码主要用于创建自定义的“停靠窗口”系统,能够将某些窗口嵌入屏幕边缘或用户指定的位置,同时提供各种功能,如窗口大小调整、动态移动、视觉效果等。

 

#Include <GDIP> ;<<<<<<<<<<<<<<<<<<---------------------------     gdip.ahk
;~ #Include <PopUpWindow_V2> ; At the bottom of the script 
; https://www.autohotkey.com/boards/viewtopic.php?f=6&t=103165

#SingleInstance, Force
SetBatchLines, -1
Gdip_Startup()
if( !A_IsAdmin )
  Run *RunAs "%A_ScriptFullPath%"

return

;*ESC::ExitApp 

F1::New DockIt() ;New Instance




;####################################################################################################################################################################################
;####################################################################################################################################################################################
;#############################################################################          DockIt          #############################################################################
;####################################################################################################################################################################################
;####################################################################################################################################################################################
class DockIt extends Commands	{
  ;Written By: Hellbent
  ;Date Started: Apr 20th, 2022
  ;Date of Last Edit: Apr 23rd, 2022
  static init := DockIt._SetUp()
  _SetUp(){
    local bd := func( "DockIt._OnExit" ).Bind( this )
    OnExit( bd )
    This.DockedWindowCount := 0
    This.ActiveWindow := ""
    This.MouseTimer := This._MouseHover.Bind( This )
    This.Index := 0
    This.Handles := []
    This.Docks := []
    This.Tabs := []
    This.ChildWindow := []
    OnMessage( 0x0204 , This._ToggleLockState.Bind( This ) )
  }
  _MouseHover(){
    local pos := This.GetMousePos()
    MouseGetPos,,, Win 
    if( !This.ActiveWindow && ( This.Tabs[ Win ].TabWindow.Hwnd = Win || This.Handles[ Win ].MainWindow.Hwnd = Win || This.ChildWindow[ win ].Child.Hwnd = win ) && ( This.Tabs[ Win ].DockedState || This.Handles[ Win ].DockedState || This.ChildWindow[ win ].DockedState ) ){
      if( This.ChildWindow[ win ].Child.Hwnd = win ){
        This.ActiveWindow := This.ChildWindow[ win ].MainWindow.Hwnd
      }else if( This.Tabs[ Win ].TabWindow.Hwnd = Win ){
        if( This.Tabs[ Win ].LockState = 3 )
          return
        Try{
          This.ActiveWindow := This.Tabs[ Win ].MainWindow.Hwnd
          This.Tabs[ Win ].TabWindow.ClearWindow( 1 )
          This.Tabs[ Win ].MainWindow.ShowWindow()
        }
      }else if( This.Handles[ Win ].MainWindow.Hwnd = Win ){
        This.ActiveWindow := This.Handles[ Win ].MainWindow.Hwnd
      }
    }else if( This.ActiveWindow && Win != This.ActiveWindow ){
      if( This.Handles[ This.ActiveWindow ].Child.Hwnd = Win ){
        return
      }
      if( ( This.Tabs[ This.ActiveWindow ].LockState = 2 || This.Handles[ This.ActiveWindow ].LockState = 2 ) ){
        This.ActiveWindow := ""
        return
      }
      if( !This.Tabs[ This.ActiveWindow ].DockedState && !This.Handles[ This.ActiveWindow ].DockedState )
        return
      if( This.Tabs[ This.ActiveWindow ].MainWindow.Hwnd ){
        Try{
          This.Tabs[ This.ActiveWindow ].MainWindow.HideWindow()
          This.Tabs[ This.ActiveWindow ].TabWindow.X := This.Tabs[ This.ActiveWindow ].MainWindow.X
          This.Tabs[ This.ActiveWindow ].TabWindow.Y := This.Tabs[ This.ActiveWindow ].MainWindow.Y
          if( This.Tabs[ This.ActiveWindow ].DockPosition = 3 ){
            This.Tabs[ This.ActiveWindow ].TabWindow.X := A_ScreenWidth - 24
          }
          This.Tabs[ This.ActiveWindow ]._DrawTabWindow()
        }
      }else if(  This.Handles[ This.ActiveWindow ].MainWindow.Hwnd ){
        Try{
          This.Handles[ This.ActiveWindow ].MainWindow.HideWindow()
          This.Handles[ This.ActiveWindow ].TabWindow.X := This.Handles[ This.ActiveWindow ].MainWindow.X
          This.Handles[ This.ActiveWindow ].TabWindow.Y := This.Handles[ This.ActiveWindow ].MainWindow.Y
          if( This.Handles[ This.ActiveWindow ].DockPosition = 3 ){
            This.Handles[ This.ActiveWindow ].TabWindow.X := A_ScreenWidth - 24
          }
          This.Handles[ This.ActiveWindow ]._DrawTabWindow()
        }
      }
      This.ActiveWindow := ""
    }
  }
  _ToggleLockState( p1 , p2 , msg , hwnd ){
    if( !This.Handles[ hwnd ].DockedState && !This.Tabs[ hwnd ].DockedState )
      return
    if( This.Handles[ hwnd ].DockedState ){
      This.ActiveWindow := hwnd
      ( ++This.Handles[ hwnd ].LockState > 3 ) ? ( This.Handles[ hwnd ].LockState := 1 )
      This.Handles[ hwnd ]._DrawCenterPanel()
      This.Handles[ hwnd ]._ReSizeMainWindow()
    }else if( This.Tabs[ hwnd ].DockedState ){
      This.ActiveWindow := This.Tabs[ hwnd ].MainWindow.Hwnd
      ( ++This.Tabs[ hwnd ].LockState > 3 ) ? ( This.Tabs[ hwnd ].LockState := 1 )
      This.Tabs[ hwnd ]._DrawCenterPanel()
      This.Tabs[ hwnd ]._ReSizeMainWindow()
    }
  }
  __New( color := "22262a" ){
    local bd 
    if( !DockIt.Index ){
      bd := This.MouseTimer
      SetTimer, % bd , 200
    }
    This.FT := 1
    This.DockPosition := 0
    
    This.TabState := 0
    This.MoreState := 0
    This.DockedState := 0
    This.LockState := 1
    
    This.LockColors := []
    This.LockColors[ 1 ] := "0x9900FF00"
    This.LockColors[ 2 ] := "0xaaFFFF00"
    This.LockColors[ 3 ] := "0x99FF0000"
    
    ;~ This.Color := "22262a"
    ;~ This.Color := "02060a"
    ;~ This.Color := "880000"
    This.Color := color
    
    This.Alpha := "99"
    
    This.FontColorTop := "0xcc67D5D6"
    This.FontColorBottom := "0xaa000000"
    
    This.Margin := {}
    This.Margin.X := 4
    This.Margin.Y := 4
    
    This.MinWidth := 185 + 2 * This.Margin.X
    
      ;Create the main window
    This._CreateMainWindow()
    
      ;Set the child window and the crop area.
    This._GetChild()
    
      ;Create the top part of the main window and its controls
    This._CreateHeaderPanel()
  
      ;Create the center panel and its controls
    This._CreateCenterPanel()
    
      ;Create the inner panel ( the parent of the target window )
    This._CreateInnerPanel()
    
      ;Create the options panel and its controls
    This._CreateOptionsPanel()
    
      ;Create the small tab window that replaces the main window when in tab form.
    This._CreateTabWindow()
    
      ;Resize the main window
    This._ResizeMainWindow()
    
    DockIt.Docks[ ++DockIt.Index ] := This
    DockIt.Handles[ This.MainWindow.Hwnd ] := This
    DockIt.Tabs[ This.TabWindow.Hwnd ] := This
    DockIt.ChildWindow[ This.Child.Hwnd ] := This
    
    This._SetChild()
    This._MoveChild()
    
  }
  _SetChild(){
    try{
      DllCall("SetParent", "uint", This.Child.Hwnd , "uint", This.InnerPanel.Hwnd )
      WinSet, AlwaysOnTop, On, % "ahk_id " This.Child.Hwnd
    }
  }
  _MoveChild(){
    WinMove, % "ahk_id " This.Child.Hwnd ,, % This.Clip.X , % This.Clip.Y ;, % This.Clip.W , % This.Clip.H
    WinSet, Redraw ,, % "ahk_id " This.Child.Hwnd
  }
  _GetChild(){
    This.Child := {}
    This.Child.Positions := {}
    While( !GetKeyState( "ctrl" ) ){
      ToolTip, Select the target window and then press "ctrl".
      sleep, 30
    }
    ToolTip, 
    This.Child.Hwnd := This.GetWinHwnd()
    This.Child.Title := This.GetWinTitle( This.Child.Hwnd )
    This.Child.Positions.Start := This.GetWinPos( This.Child.Hwnd )
    While( GetKeyState( "ctrl" ) )
      sleep, 30
    This.Child.Positions.ClipStart := New DrawTarget()
    This.Child.Positions.Offset := {}
    This.Child.Positions.Offset.X := This.Child.Positions.ClipStart.X - This.Child.Positions.Start.X
    This.Child.Positions.Offset.Y := This.Child.Positions.ClipStart.Y - This.Child.Positions.Start.Y
    This.Clip := {}
    This.Clip.W := This.Child.Positions.ClipStart.W
    This.Clip.H := This.Child.Positions.ClipStart.H
    if( This.Clip.W < ( This.MinWidth - 2 * This.Margin.X ) )
      This.Clip.W := This.MinWidth - 2 * This.Margin.X
    This.Clip.X := This.Child.Positions.Offset.X * -1
    This.Clip.Y := This.Child.Positions.Offset.Y * -1
  }
  _ReSizeMainWindow(){
    This.MainWindow.W := This.Clip.W + ( 2 * This.Margin.X )
    if( This.FT && !This.FT := !This.FT ){
      This.MainWindow.X := A_ScreenWidth - This.MainWindow.W - This.Margin.X
      This.MainWindow.Y := 120
    }
    if( This.TabState ){
      This.MainWindow.H := This.HeaderPanel.H 
      This.MainWindow.UpdateSettings( "" , 1 )
      
    }else if( This.MoreState ){
      This.MainWindow.H := This.HeaderPanel.H + This.CenterPanel.H + This.OptionsPanel.H 
      This.MainWindow.UpdateSettings( "" , 1 )
    }else{
      This.MainWindow.H := This.HeaderPanel.H + This.CenterPanel.H 
      This.MainWindow.UpdateSettings( "" , 1 )
    }
    This._DrawMainWindow()
  }
  _ToggleTabState(){
    if( This.DockedState )
      return
    This.TabState := !This.TabState
    This._ReSizeMainWindow()
  }
  _ToggleMoreState( p1 , p2 , state := 0 ){
    This.MoreState := !This.MoreState 
    ( state ) ? ( This.MoreState := state - 1 )
    This._DrawCenterPanel()
    This._ReSizeMainWindow()
    
  }
  _MoveDock(){
    local pos , Wpos
    PostMessage, 0xA1, 2,,, % "ahk_id " This.MainWindow.Hwnd
    While( GetKeyState( "LButton" ) )
      Sleep, 30
    Wpos := This.GetWinPos( This.MainWindow.Hwnd )
    This.MainWindow.UpdateSettings( { X: Wpos.X , Y: Wpos.Y , W: Wpos.W , H: Wpos.H } , 1 )
    pos := This.GetMousePos()
    This.DockedState := 0
    if( pos.X < 10 || pos.X > ( A_ScreenWidth - 10 ) || pos.Y < 10 ){
      
      This.TabState := 0
      This.DockedState := 1
      
      SoundBeep
      if( pos.Y < 10 ){
        This.DockPosition := 2
        This.TabWindow.W := 170
        This.TabWindow.H := 24
        This.TabWindow.UpdateSettings( "" , 1 )
      }else if( pos.X < 10 ){
        This.DockPosition := 1
        pos := This.GetMousePos()
        This.MainWindow.X := 0
        This.MainWindow.Y := pos.Y ;- This.MainWindow.H / 2
        ( This.MainWindow.Y < 0 ) ? ( This.MainWindow.Y := 0 )
        
        This.TabWindow.W := 24
        This.TabWindow.H := 170
        This.TabWindow.UpdateSettings( "" , 1 )
        This._DrawMainWindow()
      }else if( pos.X > A_ScreenWidth - 20 ){
        This.DockPosition := 3
        This.TabWindow.W := 24
        This.TabWindow.H := 170
        This.TabWindow.UpdateSettings( "" , 1 )
        pos := This.GetMousePos()
        This.MainWindow.X := A_ScreenWidth - This.MainWindow.W 
        This.MainWindow.Y := pos.Y ;- This.MainWindow.H / 2
        ( This.MainWindow.Y < 0 ) ? ( This.MainWindow.Y := 0 )
        This._DrawMainWindow()
      }
      DockIt.ActiveWindow := This.MainWindow.Hwnd
      This.LockState := 1
    }else if( This.DockedState ){
      This.DockedState := 0
      DockIt.ActiveWindow := ""
      This.LockState := 1
    }
    This._DrawCenterPanel()
    This._ReSizeMainWindow()
  }
  _CloseWindow(){
    DockIt.ActiveWindow := ""
    try{
      DllCall("SetParent", "uint", This.Child.Hwnd , "uint", 0 )
      WinSet, AlwaysOnTop, Off , % "ahk_id " This.Child.Hwnd
      WinMove, % "ahk_id " This.Child.Hwnd ,, % This.Child.Positions.Start.X , % This.Child.Positions.Start.Y
    }
    This.TabWindow.DeleteWindow()
    This.HeaderPanel.DeleteWindow()
    This.CenterPanel.DeleteWindow()
    This.OptionsPanel.DeleteWindow()
    This.MainWindow.DeleteWindow()
  }
  _OnExit(){
    local count
    if( !DockIt.Index ){
      return
    }
    try{
      Loop, % count := DockIt.Docks.Length(){
        DockIt.Docks[ count-- ]._CloseWindow()
      }
    }
    SoundBeep
  }
}

class DockItWindows	{
  _CreateMainWindow(){
    This.MainWindow := {}
    This.MainWindow.X := 0
    This.MainWindow.Y := 0
    This.MainWindow.W := 0
    This.MainWindow.H := 0
    This.MainWindow.AutoShow := 1
    This.MainWindow.Options := " +AlwaysOnTop -DPIScale +ToolWindow "
    This.MainWindow := New PopUpWindow( This.MainWindow )
  }
  _CreateHeaderPanel(){
    local k , v , hwnd , bd , cc 
    This.HeaderPanel := {}
    This.HeaderPanel.X := 0
    This.HeaderPanel.Y := 0
    This.HeaderPanel.W := This.Clip.W + ( 2 * This.Margin.X )
    This.HeaderPanel.H := 2 * This.Margin.Y + 18
    This.HeaderPanel.AutoShow := 1
    This.HeaderPanel.Options := " -DPIScale +Parent" This.MainWindow.Hwnd
    This.HeaderPanel := New PopUpWindow( This.HeaderPanel )
    
    This.HeaderPanel.Controls := {}
    
    This.HeaderPanel.Controls.MoveButton := {}
    This.HeaderPanel.Controls.MoveButton.X := This.Margin.X
    This.HeaderPanel.Controls.MoveButton.Y := This.Margin.Y
    This.HeaderPanel.Controls.MoveButton.W := This.HeaderPanel.W - 30 - 20 - 4 * This.Margin.X
    This.HeaderPanel.Controls.MoveButton.H := This.HeaderPanel.H - 2 * This.Margin.Y
    This.HeaderPanel.Controls.MoveButton.Method := "_MoveDock"
    
    This.HeaderPanel.Controls.MinimizeButton := {}
    This.HeaderPanel.Controls.MinimizeButton.X := This.HeaderPanel.W - 2 * This.Margin.X - 30 - 20
    This.HeaderPanel.Controls.MinimizeButton.Y := This.Margin.Y
    This.HeaderPanel.Controls.MinimizeButton.W := 30
    This.HeaderPanel.Controls.MinimizeButton.H := This.HeaderPanel.H - 2 * This.Margin.Y
    This.HeaderPanel.Controls.MinimizeButton.Method := "_ToggleTabState"
    
    This.HeaderPanel.Controls.CloseButton := {}
    This.HeaderPanel.Controls.CloseButton.X := This.HeaderPanel.W - 20 - This.Margin.X
    This.HeaderPanel.Controls.CloseButton.Y := This.Margin.Y
    This.HeaderPanel.Controls.CloseButton.W := 20
    This.HeaderPanel.Controls.CloseButton.H := This.HeaderPanel.H - 2 * This.Margin.Y
    This.HeaderPanel.Controls.CloseButton.Method := "_CloseWindow"
    
    This.HeaderPanel.Text := This.Child.Title
    This.HeaderPanel.Color := "0x" This.Alpha This.Color
    This.HeaderPanel.FontColorTop := This.FontColorTop
    This.HeaderPanel.FontColorBottom := This.FontColorBottom
    
    for k, v in This.HeaderPanel.Controls	{
      cc := This.HeaderPanel.Controls[ k ]
      Gui, % This.HeaderPanel.Hwnd ":Add", Text, % "x" cc.X " y" cc.Y " w" cc.W " h" cc.H " hwndhwnd"
      cc.Hwnd := hwnd
      bd := This[ cc.Method ].Bind( This )
      GuiControl, % This.HeaderPanel.Hwnd ":+G", % hwnd, % bd 
    }
      
    This._DrawHeaderPanel()
  }
  _CreateCenterPanel(){
    This.CenterPanel := {}
    This.CenterPanel.X := 0
    This.CenterPanel.Y := This.HeaderPanel.H
    This.CenterPanel.W := This.Clip.W + 2 * This.Margin.X 
    This.CenterPanel.H := This.Clip.H + 3 * This.Margin.Y + 18
    This.CenterPanel.AutoShow := 1
    This.CenterPanel.Options := " -DPIScale +Parent" This.MainWindow.Hwnd
    This.CenterPanel := New PopUpWindow( This.CenterPanel )
    This.CenterPanel.MoreButton := {}
    This.CenterPanel.MoreButton.X := This.Margin.X
    This.CenterPanel.MoreButton.Y := This.Clip.H + 2 * This.Margin.Y
    This.CenterPanel.MoreButton.W := 60
    This.CenterPanel.MoreButton.H := 18
    This.CenterPanel.MoreButton.Method := "_ToggleMoreState"
    
    cc := This.CenterPanel.MoreButton
    Gui, % This.CenterPanel.Hwnd ":Add", Text, % "x" cc.X " y" cc.Y " w" cc.W " h" cc.H " hwndhwnd"
    cc.Hwnd := hwnd
    bd := This[ cc.Method ].Bind( This )
    GuiControl, % This.CenterPanel.Hwnd ":+G", % hwnd, % bd 
    
    
    This._DrawCenterPanel()
  }
  _CreateInnerPanel(){
    This.InnerPanel := {}
    This.InnerPanel.X := This.Margin.X 
    This.InnerPanel.Y := This.Margin.Y
    This.InnerPanel.W := This.Clip.W
    This.InnerPanel.H := This.Clip.H
    This.InnerPanel.Options := " -Caption -DPIScale +Parent" This.CenterPanel.Hwnd " +E0x02000000 +E0x00080000 "
    Gui, New, % This.InnerPanel.Options " hwndhwnd"
    This.InnerPanel.Hwnd := hwnd
    Gui, Color, % This.Color
    Gui, Show, % "x" This.InnerPanel.X " y" This.InnerPanel.Y " w" This.InnerPanel.W " h" This.InnerPanel.H " NA"
  }
  _CreateOptionsPanel(){
    This.OptionsPanel := {}
    This.OptionsPanel.X := 0
    This.OptionsPanel.Y := This.HeaderPanel.H + This.CenterPanel.H
    This.OptionsPanel.W := 220
    This.OptionsPanel.H := 180
    This.OptionsPanel.AutoShow := 1
    This.OptionsPanel.Options := " -DPIScale +Parent" This.MainWindow.Hwnd
    This.OptionsPanel := New PopUpWindow( This.OptionsPanel )
    
    This.OptionsPanel.ButtonSize := 40
    This.OptionsPanel.YOffset := 15
    This.OptionsPanel.Buttons := {}
    
    This.OptionsPanel.Buttons.UpArrowButton := {}
    This.OptionsPanel.Buttons.UpArrowButton.X := This.Margin.X + This.OptionsPanel.ButtonSize + This.Margin.X
    This.OptionsPanel.Buttons.UpArrowButton.Y := This.Margin.Y + This.OptionsPanel.YOffset
    This.OptionsPanel.Buttons.UpArrowButton.W := This.OptionsPanel.ButtonSize
    This.OptionsPanel.Buttons.UpArrowButton.H := This.OptionsPanel.ButtonSize
    This.OptionsPanel.Buttons.UpArrowButton.Number := 5
    This.OptionsPanel.Buttons.UpArrowButton.Method := "_MoveUp"
    
    This.OptionsPanel.Buttons.DownArrowButton := {}
    This.OptionsPanel.Buttons.DownArrowButton.X := This.Margin.X + This.OptionsPanel.ButtonSize + This.Margin.X
    This.OptionsPanel.Buttons.DownArrowButton.Y := This.Margin.Y + This.OptionsPanel.ButtonSize + This.Margin.Y + This.OptionsPanel.YOffset
    This.OptionsPanel.Buttons.DownArrowButton.W := This.OptionsPanel.ButtonSize
    This.OptionsPanel.Buttons.DownArrowButton.H := This.OptionsPanel.ButtonSize
    This.OptionsPanel.Buttons.DownArrowButton.Number := 6
    This.OptionsPanel.Buttons.DownArrowButton.Method := "_MoveDown"
    
    This.OptionsPanel.Buttons.LeftArrowButton := {}
    This.OptionsPanel.Buttons.LeftArrowButton.X := This.Margin.X
    This.OptionsPanel.Buttons.LeftArrowButton.Y := This.Margin.Y + This.OptionsPanel.ButtonSize / 2 + This.Margin.Y / 2 + This.OptionsPanel.YOffset
    This.OptionsPanel.Buttons.LeftArrowButton.W := This.OptionsPanel.ButtonSize
    This.OptionsPanel.Buttons.LeftArrowButton.H := This.OptionsPanel.ButtonSize
    This.OptionsPanel.Buttons.LeftArrowButton.Number := 3
    This.OptionsPanel.Buttons.LeftArrowButton.Method := "_MoveLeft"
    
    This.OptionsPanel.Buttons.RightArrowButton := {}
    This.OptionsPanel.Buttons.RightArrowButton.X := This.Margin.X + This.OptionsPanel.ButtonSize + This.Margin.X + This.OptionsPanel.ButtonSize + This.Margin.X
    This.OptionsPanel.Buttons.RightArrowButton.Y := This.Margin.Y + This.OptionsPanel.ButtonSize / 2 + This.Margin.Y / 2 + This.OptionsPanel.YOffset
    This.OptionsPanel.Buttons.RightArrowButton.W := This.OptionsPanel.ButtonSize
    This.OptionsPanel.Buttons.RightArrowButton.H := This.OptionsPanel.ButtonSize
    This.OptionsPanel.Buttons.RightArrowButton.Number := 4
    This.OptionsPanel.Buttons.RightArrowButton.Method := "_MoveRight"
    

    
    for k, v in This.OptionsPanel.Buttons	{
      cc := This.OptionsPanel.Buttons[ k ]
      Gui, % This.OptionsPanel.Hwnd ":Add", Text, % "x" cc.X " y" cc.Y " w" cc.W " h" cc.H " hwndhwnd"
      cc.Hwnd := hwnd
      bd := This[ cc.Method ].Bind( This )
      GuiControl, % This.OptionsPanel.Hwnd ":+G", % hwnd, % bd 
    }
      
    
    This._DrawOptionsPanel()
  }
  _CreateTabWindow(){
    This.TabWindow := {}
    This.TabWindow.X := 0
    This.TabWindow.Y := 0
    This.TabWindow.W := 170
    This.TabWindow.H := 24
    This.TabWindow.AutoShow := 1
    This.TabWindow.Options := " +AlwaysOnTop -DPIScale +ToolWindow "
    This.TabWindow := New PopUpWindow( This.TabWindow )
  }
  _MoveUp(){
    if( GetKeyState( "ctrl" ) )
      This.Clip.Y -= 100
    else if( GetKeyState( "shift" ) )
      This.Clip.Y -= 10
    else
      This.Clip.Y -= 1
    This._MoveChild()
  }
  _MoveDown(){
    if( GetKeyState( "ctrl" ) )
      This.Clip.Y += 100
    else if( GetKeyState( "shift" ) )
      This.Clip.Y += 10
    else
      This.Clip.Y += 1
    This._MoveChild()
  }
  _MoveLeft(){
    if( GetKeyState( "ctrl" ) )
      This.Clip.X -= 100
    else if( GetKeyState( "shift" ) )
      This.Clip.X -= 10
    else
      This.Clip.X -= 1
    This._MoveChild()
  }
  _MoveRight(){
    if( GetKeyState( "ctrl" ) )
      This.Clip.X += 100
    else if( GetKeyState( "shift" ) )
      This.Clip.X += 10
    else
      This.Clip.X += 1
    This._MoveChild()
  }
  
}

class DockItDraw extends DockItWindows {
  _DrawCenterPanel(){
    local x , y , w , h 
    This.CenterPanel.ClearWindow()
    ;move button / banner
    x := This.CenterPanel.MoreButton.X
    y := This.CenterPanel.MoreButton.Y
    w := This.CenterPanel.MoreButton.W
    h := This.CenterPanel.MoreButton.H
    Brush := Gdip_CreateLineBrushFromRect( x , y , w , h , "0x9900aaff" , "0x99222222" , 1 , 1 ) , Gdip_FillRoundedRectangle( This.CenterPanel.G , Brush , x , y , w , h , 3 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( "0x99" This.Color ) , Gdip_FillRoundedRectangle( This.CenterPanel.G , Brush , x + 2  , y + 2 , w - 4  , h - 4 , 3 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( This.FontColorBottom ) , Gdip_TextToGraphics( This.CenterPanel.G , ( !This.MoreState ) ? ( "More" ) : ( "Less" ) , "s" 12 " Center vCenter NoWrap Bold c" Brush " x" x + 1 " y" y + 1  , "Segoe ui" , w  , h ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( This.FontColorTop ) , Gdip_TextToGraphics( This.CenterPanel.G , ( !This.MoreState ) ? ( "More" ) : ( "Less" ) , "s" 12 " Center vCenter NoWrap Bold c" Brush " x" x " y" y  , "Segoe ui" , w  , h ) , Gdip_DeleteBrush( Brush )
    ;~ ToolTip, % "Tip:`n" 
    if( This.DockedState ){
      ;~ ToolTip, % "Tip:`n" 
      x := This.CenterPanel.W - This.Margin.X - 18
      y := This.CenterPanel.MoreButton.Y
      w := This.CenterPanel.MoreButton.H
      h := This.CenterPanel.MoreButton.H
      Brush := Gdip_CreateLineBrushFromRect( x , y , w , h , "0x9900aaff" , "0x99222222" , 1 , 1 ) , Gdip_FillRoundedRectangle( This.CenterPanel.G , Brush , x , y , w , h , 3 ) , Gdip_DeleteBrush( Brush )
      Brush := Gdip_BrushCreateSolid( This.LockColors[ This.LockState ] ) , Gdip_FillRoundedRectangle( This.CenterPanel.G , Brush , x + 2  , y + 2 , w - 4  , h - 4 , 3 ) , Gdip_DeleteBrush( Brush )
    
    }
    
    
    Brush := Gdip_BrushCreateSolid( "0x99" This.Color ) , Gdip_FillRoundedRectangle( This.CenterPanel.G , Brush , This.InnerPanel.X  , This.InnerPanel.Y , This.InnerPanel.W  , This.InnerPanel.H , 3 ) , Gdip_DeleteBrush( Brush )
    
    
    This.CenterPanel.UpdateWindow()
  }
  _DrawMainWindow(){
    This.MainWindow.ClearWindow()
    Brush := Gdip_BrushCreateSolid( "0x" This.Alpha This.Color ) , Gdip_FillRoundedRectangle( This.MainWindow.G , Brush , 0 , 0 , This.MainWindow.W , This.MainWindow.H , 5 ) , Gdip_DeleteBrush( Brush )
    This.MainWindow.UpdateWindow()
  }
  _DrawOptionsPanel(){
    local y , cc
    This.OptionsPanel.ClearWindow()
    
    for k , v in This.OptionsPanel.Buttons	{
      cc := This.OptionsPanel.Buttons[ k ]
      Brush := Gdip_CreateLineBrushFromRect( cc.X , cc.Y , cc.W , cc.H , "0x9900aaff" , "0x99222222" , 1 , 1 ) , Gdip_FillRoundedRectangle( This.OptionsPanel.G , Brush , cc.X , cc.Y , cc.W , cc.H , 5 ) , Gdip_DeleteBrush( Brush )
      Brush := Gdip_BrushCreateSolid( "0x" This.Alpha This.Color ) , Gdip_FillRoundedRectangle( This.OptionsPanel.G , Brush , cc.X + 1 , cc.Y + 1 , cc.W - 2 , cc.H - 2 , 5 ) , Gdip_DeleteBrush( Brush )
      Pen := Gdip_CreatePen( "0x9967D5D6" , 1 ) , Gdip_DrawRectangle( This.OptionsPanel.G , Pen , cc.X + 5 , cc.Y + 5 , cc.W - 10 , cc.H - 12 ) , Gdip_DeletePen( Pen )
      Brush := Gdip_BrushCreateSolid( "0x99000000" ) , Gdip_TextToGraphics( This.OptionsPanel.G , cc.Number , "s" 24 " Center vCenter Bold c" Brush " x" cc.X + 1 " y" cc.Y + 2 , "WebDings" , cc.W , cc.H ) , Gdip_DeleteBrush( Brush )
      Brush := Gdip_BrushCreateSolid( "0x9967D5D6" ) , Gdip_TextToGraphics( This.OptionsPanel.G , cc.Number , "s" 24 " Center vCenter Bold c" Brush " x" cc.X " y" cc.Y + 1 , "WebDings" , cc.W , cc.H ) , Gdip_DeleteBrush( Brush )
    
    }
    
    Brush := Gdip_BrushCreateSolid( "0x99000000" ) , Gdip_TextToGraphics( This.OptionsPanel.G , "+ = 10 ^ = 100 " , "s" 12 "  vCenter Bold c" Brush " x" 141 " y" 36  , "Segoe ui" , 50 , 50 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( "0xaa67D5D6" ) , Gdip_TextToGraphics( This.OptionsPanel.G , "+ = 10 ^ = 100 " , "s" 12 "  vCenter Bold c" Brush " x" 140 " y" 35  , "Segoe ui" , 50 , 50 ) , Gdip_DeleteBrush( Brush )
    
    ;slider 1
    y := 120
    Brush := Gdip_CreateLineBrushFromRect( This.Margin.X , y , 130 , 20 , "0x9900aaff" , "0x99222222" , 1 , 1 ) , Gdip_FillRoundedRectangle( This.OptionsPanel.G , Brush , This.Margin.X , y , 130 , 20 , 5 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( "0x99" This.Color ) , Gdip_FillRoundedRectangle( This.OptionsPanel.G , Brush , This.Margin.X + 1 , y + 1 , 128 , 18 , 5 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( "0x9967D5D6" ) , Gdip_FillRectangle( This.OptionsPanel.G , Brush , This.Margin.X + 10 , y + 8 , 110 , 4 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_CreateLineBrushFromRect( This.Margin.X + 21 , y + 3 , 14 , 14 , "0xaa67D5D6" , "0x99222222" , 1 , 1 ) , Gdip_FillRoundedRectangle( This.OptionsPanel.G , Brush , This.Margin.X + 21 , y + 3 , 14 , 14 , 3 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( "0x99" This.Color ) , Gdip_FillRoundedRectangle( This.OptionsPanel.G , Brush , This.Margin.X + 22 , y + 4 , 12 , 12 , 3 ) , Gdip_DeleteBrush( Brush )
    
    ;slider 2
    y := 150
    Brush := Gdip_CreateLineBrushFromRect( This.Margin.X , y , 130 , 20 , "0xCC00aaff" , "0x99222222" , 1 , 1 ) , Gdip_FillRoundedRectangle( This.OptionsPanel.G , Brush , This.Margin.X , y , 130 , 20 , 5 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( "0x99" This.Color ) , Gdip_FillRoundedRectangle( This.OptionsPanel.G , Brush , This.Margin.X + 1 , y + 1 , 128 , 18 , 5 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( "0x9967D5D6" ) , Gdip_FillRectangle( This.OptionsPanel.G , Brush , This.Margin.X + 10 , y + 8 , 110 , 4 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_CreateLineBrushFromRect( This.Margin.X + 21 , y + 3 , 14 , 14 , "0xaa67D5D6" , "0x99222222" , 1 , 1 ) , Gdip_FillRoundedRectangle( This.OptionsPanel.G , Brush , This.Margin.X + 21 , y + 3 , 14 , 14 , 3 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( "0x99" This.Color ) , Gdip_FillRoundedRectangle( This.OptionsPanel.G , Brush , This.Margin.X + 22 , y + 4 , 12 , 12 , 3 ) , Gdip_DeleteBrush( Brush )
    
    Brush := Gdip_BrushCreateSolid( "0x99000000" ) , Gdip_TextToGraphics( This.OptionsPanel.G , "Width" , "s" 12 " vCenter Bold c" Brush " x" This.Margin.X + 140  " y" 116  , "Segoe ui" , 50 , 30 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( "0xaa67D5D6" ) , Gdip_TextToGraphics( This.OptionsPanel.G , "Width" , "s" 12 " vCenter Bold c" Brush " x" This.Margin.X + 139 " y" 115  , "Segoe ui" , 50 , 30 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( "0x99000000" ) , Gdip_TextToGraphics( This.OptionsPanel.G , "Height" , "s" 12 " vCenter Bold c" Brush " x" This.Margin.X + 140 " y" 146  , "Segoe ui" , 50 , 30 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( "0xaa67D5D6" ) , Gdip_TextToGraphics( This.OptionsPanel.G , "Height" , "s" 12 " vCenter Bold c" Brush " x" This.Margin.X + 139 " y" 145  , "Segoe ui" , 50 , 30 ) , Gdip_DeleteBrush( Brush )
    
    This.OptionsPanel.UpdateWindow()
  }
  _DrawHeaderPanel(){
    local w , x , y , h
    This.HeaderPanel.ClearWindow()
    ;************
    ;~ Brush := Gdip_BrushCreateSolid( "0x33" This.Color ) , Gdip_FillRoundedRectangle( This.HeaderPanel.G , Brush , 0 , 0 , This.HeaderPanel.W , This.HeaderPanel.H , 5 ) , Gdip_DeleteBrush( Brush )
    ;************
    ;move button / banner
    x := This.HeaderPanel.Controls.MoveButton.X
    y := This.HeaderPanel.Controls.MoveButton.Y
    w := This.HeaderPanel.Controls.MoveButton.W
    h := This.HeaderPanel.Controls.MoveButton.H
    Brush := Gdip_CreateLineBrushFromRect( x , y , w , h , "0x9900aaff" , "0x99222222" , 1 , 1 ) , Gdip_FillRoundedRectangle( This.HeaderPanel.G , Brush , x , y , w , h , 3 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( "0x99" This.Color ) , Gdip_FillRoundedRectangle( This.HeaderPanel.G , Brush , x + 2  , y + 2 , w - 4  , h - 4 , 3 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( This.FontColorBottom ) , Gdip_TextToGraphics( This.HeaderPanel.G , This.Child.Title , "s" 12 " Left vCenter NoWrap Bold c" Brush " x" x + 6 " y" y + 3  , "Segoe ui" , w - 10 , h - 4 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( This.FontColorTop ) , Gdip_TextToGraphics( This.HeaderPanel.G , This.Child.Title , "s" 12 " Left vCenter NoWrap Bold c" Brush " x" x + 5 " y" y + 2  , "Segoe ui" , w - 10 , h - 4 ) , Gdip_DeleteBrush( Brush )
    ;tab button
    x := This.HeaderPanel.Controls.MinimizeButton.X
    y := This.HeaderPanel.Controls.MinimizeButton.Y
    w := This.HeaderPanel.Controls.MinimizeButton.W
    h := This.HeaderPanel.Controls.MinimizeButton.H
    Brush := Gdip_CreateLineBrushFromRect( x , y , w , h , "0x9900aaff" , "0x99222222" , 1 , 1 ) , Gdip_FillRoundedRectangle( This.HeaderPanel.G , Brush , x , y , w , h , 3 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( "0x99" This.Color ) , Gdip_FillRoundedRectangle( This.HeaderPanel.G , Brush , x + 2  , y + 2 , w - 4  , h - 4 , 3 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( This.FontColorBottom ) , Gdip_TextToGraphics( This.HeaderPanel.G , "+/-" , "s" 12 " Left vCenter NoWrap Bold c" Brush " x" x + 6 " y" y + 3  , "Segoe ui" , w , h - 4 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( This.FontColorTop ) , Gdip_TextToGraphics( This.HeaderPanel.G , "+/-" , "s" 12 " Left vCenter NoWrap Bold c" Brush " x" x + 5 " y" y + 2  , "Segoe ui" , w , h - 4 ) , Gdip_DeleteBrush( Brush )
    ;close button
    x := This.HeaderPanel.Controls.CloseButton.X
    y := This.HeaderPanel.Controls.CloseButton.Y
    w := This.HeaderPanel.Controls.CloseButton.W
    h := This.HeaderPanel.Controls.CloseButton.H
    Brush := Gdip_CreateLineBrushFromRect( x , y , w , h , "0x9900aaff" , "0x99222222" , 1 , 1 ) , Gdip_FillRoundedRectangle( This.HeaderPanel.G , Brush , x , y , w , h , 3 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( "0x99" This.Color ) , Gdip_FillRoundedRectangle( This.HeaderPanel.G , Brush , x + 2  , y + 2 , w - 4  , h - 4 , 3 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( This.FontColorBottom ) , Gdip_TextToGraphics( This.HeaderPanel.G , "X" , "s" 10 " Center vCenter NoWrap Bold c" Brush " x" x + 1 " y" y + 3  , "Segoe ui" , w , h - 4 ) , Gdip_DeleteBrush( Brush )
    Brush := Gdip_BrushCreateSolid( This.FontColorTop ) , Gdip_TextToGraphics( This.HeaderPanel.G , "X" , "s" 10 " Center vCenter NoWrap Bold c" Brush " x" x  " y" y + 2  , "Segoe ui" , w , h - 4 ) , Gdip_DeleteBrush( Brush )
    This.HeaderPanel.UpdateWindow()
  }
  _DrawTabWindow(){
    This.TabWindow.ClearWindow()
    ;~ Brush := Gdip_BrushCreateSolid( "0x99" This.Color ) , Gdip_FillRoundedRectangle( This.TabWindow.G , Brush , 0  , 0 , 200  , 200 , 3 ) , Gdip_DeleteBrush( Brush )
    
    if( This.DockPosition = 1 ){
      
      Brush := Gdip_CreateLineBrushFromRect( 0 , 1 , 24 , 160 , "0x9900aaff" , "0x99222222" , 0 , 1 ) , Gdip_FillRoundedRectangle( This.TabWindow.G , Brush , 1 , 1 , 20 , 160 , 5 ) , Gdip_DeleteBrush( Brush )
      Brush := Gdip_BrushCreateSolid( "0x99" This.Color ) , Gdip_FillRoundedRectangle( This.TabWindow.G , Brush , 3 , 3 , 16 , 156 , 5 ) , Gdip_DeleteBrush( Brush )
      Brush := Gdip_CreateLineBrushFromRect( 6 , 2 , 9 , 24 , "0x9900aaff" , "0x99222222" , 2 , 1 ) , Gdip_FillRoundedRectangle( This.TabWindow.G , Brush , 5 , 5 , 12 , 20 , 3 ) , Gdip_DeleteBrush( Brush )
      Brush := Gdip_BrushCreateSolid( This.LockColors[ This.LockState ] ) , Gdip_FillRoundedRectangle( This.TabWindow.G , Brush , 6 , 6 , 10 , 18 , 3 ) , Gdip_DeleteBrush( Brush )
      Brush := Gdip_BrushCreateSolid( This.FontColorBottom ) , Gdip_TextToGraphics( This.TabWindow.G , This.Child.Title , "s" 12 " Center  Bold c" Brush " x" 7 " y" 31  , "Segoe ui" , 11 , 116 ) , Gdip_DeleteBrush( Brush )
      Brush := Gdip_BrushCreateSolid( This.FontColorTop ) , Gdip_TextToGraphics( This.TabWindow.G , This.Child.Title , "s" 12 " Center  Bold c" Brush " x" 6 " y" 30  , "Segoe ui" , 11 , 116 ) , Gdip_DeleteBrush( Brush )
      
    }else if( This.DockPosition = 2 ){
      Brush := Gdip_CreateLineBrushFromRect( 2 , 2 , 163 , 19 , "0x9900aaff" , "0x99222222" , 1 , 1 ) , Gdip_FillRoundedRectangle( This.TabWindow.G , Brush , 1 , 1 , 166 , 20 , 5 ) , Gdip_DeleteBrush( Brush )
      Brush := Gdip_BrushCreateSolid( "0x99" This.Color ) , Gdip_FillRoundedRectangle( This.TabWindow.G , Brush , 3 , 3 , 162 , 16 , 5 ) , Gdip_DeleteBrush( Brush )
      Brush := Gdip_CreateLineBrushFromRect( 8 , 6 , 12 , 11 , "0x9900aaff" , "0x99222222" , 1 , 1 ) , Gdip_FillRoundedRectangle( This.TabWindow.G , Brush , 5 , 5 , 16 , 12 , 3 ) , Gdip_DeleteBrush( Brush )
      Brush := Gdip_BrushCreateSolid( This.LockColors[ This.LockState ] ) , Gdip_FillRoundedRectangle( This.TabWindow.G , Brush , 6 , 6 , 14 , 10 , 3 ) , Gdip_DeleteBrush( Brush )
      Brush := Gdip_BrushCreateSolid( This.FontColorBottom ) , Gdip_TextToGraphics( This.TabWindow.G , This.Child.Title , "s" 12 " vCenter NoWrap Bold c" Brush " x" 27 " y" 3  , "Segoe ui" , 140 , 20 ) , Gdip_DeleteBrush( Brush )
      Brush := Gdip_BrushCreateSolid( This.FontColorTop ) , Gdip_TextToGraphics( This.TabWindow.G , This.Child.Title , "s" 12 " vCenter NoWrap Bold c" Brush " x" 26 " y" 2  , "Segoe ui" , 140 , 20 ) , Gdip_DeleteBrush( Brush )
    }else if( This.DockPosition = 3 ){
      
      Brush := Gdip_CreateLineBrushFromRect( 0 , 1 , 24 , 160 , "0x9900aaff" , "0x99222222" , 0 , 1 ) , Gdip_FillRoundedRectangle( This.TabWindow.G , Brush , 1 , 1 , 20 , 160 , 5 ) , Gdip_DeleteBrush( Brush )
      Brush := Gdip_BrushCreateSolid( "0x99" This.Color ) , Gdip_FillRoundedRectangle( This.TabWindow.G , Brush , 3 , 3 , 16 , 156 , 5 ) , Gdip_DeleteBrush( Brush )
      Brush := Gdip_CreateLineBrushFromRect( 6 , 2 , 9 , 24 , "0x9900aaff" , "0x99222222" , 2 , 1 ) , Gdip_FillRoundedRectangle( This.TabWindow.G , Brush , 5 , 5 , 12 , 20 , 3 ) , Gdip_DeleteBrush( Brush )
      Brush := Gdip_BrushCreateSolid( This.LockColors[ This.LockState ] ) , Gdip_FillRoundedRectangle( This.TabWindow.G , Brush , 6 , 6 , 10 , 18 , 3 ) , Gdip_DeleteBrush( Brush )
      Brush := Gdip_BrushCreateSolid( This.FontColorBottom ) , Gdip_TextToGraphics( This.TabWindow.G , This.Child.Title , "s" 12 " Center  Bold c" Brush " x" 7 " y" 31  , "Segoe ui" , 11 , 116 ) , Gdip_DeleteBrush( Brush )
      Brush := Gdip_BrushCreateSolid( This.FontColorTop ) , Gdip_TextToGraphics( This.TabWindow.G , This.Child.Title , "s" 12 " Center  Bold c" Brush " x" 6 " y" 30  , "Segoe ui" , 11 , 116 ) , Gdip_DeleteBrush( Brush )
      
      
    }
    
    This.TabWindow.UpdateWindow()
  }
  
  
}

class Commands	extends DockItDraw {
  GetWinHwnd( option := "A" ){
    return WinActive( option )
  }
  GetWinTitle( hwnd ){
    local out 
    WinGetTitle, out , % "ahk_id " hwnd
    return out
  }
  GetWinPos( hwnd ){
    local x , y , w , h 
    WinGetPos, x , y , w , h , % "ahk_id " hwnd 
    return { X: x , Y: y , W: w , H: h }
  }
  GetMousePos( mode := "Screen" ){
    local x , y 
    CoordMode, Mouse, % mode
    MouseGetPos, x , y 
    return { X: x , Y: y }
  }
}

class DrawTarget extends Commands	{
  __New(){
    local pos := This.GetMousePos()
    This.State := 0
    This.Color := "0xFFFF0000"
    This.X1 := pos.X
    This.X2 := 0
    This.Y1 := pos.Y
    This.Y2 := 0
    This.X := pos.X
    This.Y := pos.Y
    This.W := 0
    This.H := 0
    This.Gui1 := New PopUpWindow( { AutoShow: 1 , X: pos.X - 500 , Y: pos.Y - 500 , W: 1001 , H: 1001 , Options: " +AlwaysOnTop -DPIScale +ToolWindow +E0x20" } ) 
    This._SetStartingPos()
    This._SetEndingPos()
    return { X: This.X , Y: This.Y , W: This.W , H: This.H }
  }
  _SetStartingPos(){
    while( !GetKeyState( "ctrl" ) ){
      ToolTip, Press "ctrl" to set the starting position. `n`nTop left corner.
      pos := This.GetMousePos()
      This.Gui1.UpdateSettings( { X: pos.X - 501 , Y: pos.Y - 501 } )
      This.Draw()
      
      sleep, 30
    }
    This.X1 := pos.X 
    This.Y1 := pos.Y
    This.State := 1
    While( GetKeyState( "ctrl" ) )
      sleep, 30
  }
  _SetEndingPos(){
    while( !GetKeyState( "ctrl" ) ){
      ToolTip, Press "ctrl" to set the starting position. `n`nTop left corner.
      pos := This.GetMousePos()
      This.X2 := pos.X 
      This.Y2 := pos.Y
      
      ( This.X1 <= This.X2 ) ? ( This.X := This.X1 , This.W := This.X2 - This.X1 ) : ( This.X := This.X2 , This.W := This.X1 - This.X2 )
      ( This.Y1 <= This.Y2 ) ? ( This.Y := This.Y1 , This.H := This.Y2 - This.Y1 ) : ( This.Y := This.Y2 , This.H := This.Y1 - This.Y2 )
      This.Gui1.UpdateSettings( { X: This.X - 1 , Y: This.Y - 1 , W: This.W + 2 , H: This.H + 2 } , 1 )
      This.Draw()
      
      sleep, 30
    }
    ToolTip,
    While( GetKeyState( "ctrl" ) )
      sleep, 30
    This.Gui1.DeleteWindow()
  }
  Draw(){
    This.Gui1.ClearWindow()
    if( !This.State ){
      Pen := Gdip_CreatePen( This.Color , 1 ) , Gdip_DrawLine( This.Gui1.G , Pen , 501 , 0 , 501 , 1001 ) , Gdip_DeletePen( Pen )
      Pen := Gdip_CreatePen( This.Color , 1 ) , Gdip_DrawLine( This.Gui1.G , Pen , 0 , 501 , 1001 , 501 ) , Gdip_DeletePen( Pen )
    }else if( This.State = 1 ){
      Pen := Gdip_CreatePen( This.Color , 1 ) , Gdip_DrawRectangle( This.Gui1.G , Pen , 1 , 1  , This.W , This.H ) , Gdip_DeletePen( Pen )
    }
    This.Gui1.UpdateWindow()
  }
}
;####################################################################################################################################################################################
;####################################################################################################################################################################################
;#############################################################################          DockIt          #############################################################################
;####################################################################################################################################################################################
;####################################################################################################################################################################################
;####################################################################################################################################################################################
;####################################################################################################################################################################################
;####################################################################################################################################################################################
;####################################################################################################################################################################################
class PopUpWindow	{
;PopUpWindow v2.2
;Date Written: Oct 28th, 2021
;Last Edit: Feb 7th, 2022 :Changed the trigger method.
;Written By: Hellbent aka CivReborn
;SpcThanks: teadrinker , malcev 
  static Index := 0 , Windows := [] , Handles := [] , EditHwnd , HelperHwnd
  __New( obj := "" ){
    This._SetDefaults()
    This.UpdateSettings( obj )
    This._CreateWindow()
    This._CreateWindowGraphics()
    if( This.AutoShow )
      This.ShowWindow( This.Title )
  }
  _SetDefaults(){
    This.X := 10
    This.Y := 10
    This.W := 10
    This.H := 10
    This.Smoothing := 2
    This.Options := " -DPIScale +AlwaysOnTop "
    This.AutoShow := 0
    This.GdipStartUp := 0
    This.Title := ""
    
    This.Controls := []
    This.Handles := []
    This.Index := 0 
  }
  AddTrigger( obj ){
    local k , v , cc , bd
    
    This.Controls[ ++This.Index ] := { 	X:		10
                    ,	Y:		10
                    ,	W:		10
                    ,	H:		10	}
    for k, v in obj
      This.Controls[ This.Index ][ k ] := obj[ k ] 
    cc := This.Controls[ This.Index ]
    Gui, % This.Hwnd ":Add", Text, % "x" cc.X " y" cc.Y " w" cc.W " h" cc.H " hwndhwnd"
    This.Handles[ hwnd ] := This.Index
    This.Controls[ This.Index ].Hwnd := hwnd
    
    if( IsObject( cc.Label ) ){
      bd := cc.Label
      GuiControl, % This.Hwnd ":+G" , % hwnd , % bd
    }else{
      bd := This._TriggerCall.Bind( This )
      GuiControl, % This.Hwnd ":+G" , % hwnd , % bd
    }
    return hwnd
    
  }
  _TriggerCall(){
    MouseGetPos,,,, ctrl, 2
    Try
      ;~ SetTimer, % This.Controls[ This.Handles[ ctrl ] ].Label, -0
      gosub, % This.Controls[ This.Handles[ ctrl ] ].Label
    
        
  }
  DrawTriggers( color := "0xFFFF0000" , AutoUpdate := 0 ){
    local brush , cc 
    Brush := Gdip_BrushCreateSolid( color ) 
    Gdip_SetSmoothingMode( This.G , 3 )
    loop, % This.Controls.Length()	{
      cc := This.Controls[ A_Index ]
      Gdip_FillRectangle( This.G , Brush , cc.x , cc.y , cc.w , cc.h )
    
    }
    Gdip_DeleteBrush( Brush )
    Gdip_SetSmoothingMode( This.G , This.Smoothing )
    if( AutoUpdate )
      This.UpdateWindow()
  }
  UpdateSettings( obj := "" , UpdateGraphics := 0 ){
    local k , v
    if( IsObject( obj ) )
      for k, v in obj
        This[ k ] := obj[ k ]
    ( This.X = "Center" ) ? ( This.X := ( A_ScreenWidth - This.W ) / 2 ) 	
    ( This.Y = "Center" ) ? ( This.Y := ( A_ScreenHeight - This.H ) / 2 ) 	
    if( UpdateGraphics ){
      This._DestroyWindowsGraphics()
      This._CreateWindowGraphics()
    }
  }
  _CreateWindow(){
    local hwnd
    Gui , New, % " +LastFound +E0x80000 hwndhwnd -Caption  " This.Options
    PopUpWindow.Index++
    This.Index := PopUpWindow.Index
    PopUpWindow.Windows[ PopUpWindow.Index ] := This
    This.Hwnd := hwnd
    PopUpWindow.Handles[ hwnd ] := PopUpWindow.Index
    if( This.GdipStartUp && !PopUpWindow.pToken )
      PopUpWindow.pToken := GDIP_STARTUP()
  }
  _DestroyWindowsGraphics(){
    Gdip_DeleteGraphics( This.G )
    SelectObject( This.hdc , This.obm )
    DeleteObject( This.hbm )
    DeleteDC( This.hdc )
  }
  _CreateWindowGraphics(){
    This.hbm := CreateDIBSection( This.W , This.H )
    This.hdc := CreateCompatibleDC()
    This.obm := SelectObject( This.hdc , This.hbm )
    This.G := Gdip_GraphicsFromHDC( This.hdc )
    Gdip_SetSmoothingMode( This.G , This.Smoothing )
  }
  ShowWindow( Title := "" ){
    Gui , % This.Hwnd ":Show", % "x" This.X " y" This.Y " w" This.W " h" This.H " NA", % Title
  }
  HideWindow(){
    Gui , % This.Hwnd ":Hide",
  }
  UpdateWindow( alpha := 255 ){
    UpdateLayeredWindow( This.hwnd , This.hdc , This.X , This.Y , This.W , This.H , alpha )
  }
  ClearWindow( AutoUpdate := 0 ){
    Gdip_GraphicsClear( This.G )
    if( Autoupdate )
      This.UpdateWindow()
  }
  DrawBitmap( pBitmap , obj , dispose := 1 , AutoUpdate := 0 ){
    Gdip_DrawImage( This.G , pBitmap , obj.X , obj.Y , obj.W , obj.H )
    if( dispose )
      Gdip_DisposeImage( pBitmap )
    if( Autoupdate )
      This.UpdateWindow()
  }
  PaintBackground( color := "0xFF000000" , AutoUpdate := 0 ){
    if( isObject( color ) ){
      Brush := Gdip_BrushCreateSolid( ( color.HasKey( "Color" ) ) ? ( color.Color ) : ( "0xFF000000" ) ) 
      if( color.Haskey( "Round" ) )
        Gdip_FillRoundedRectangle( This.G , Brush , color.X , color.Y , color.W , color.H , color.Round )
      else
        Gdip_FillRectangle( This.G , Brush , color.X , color.Y , color.W , color.H ) 
    }else{
      Brush := Gdip_BrushCreateSolid( color ) 
      Gdip_FillRectangle( This.G , Brush , -1 , -1 , This.W + 2 , This.H + 2 ) 
    }
    Gdip_DeleteBrush( Brush )
    if( AutoUpdate )
      This.UpdateWindow()
  }
  DeleteWindow( GDIPShutdown := 0 ){
    Gui, % This.Hwnd ":Destroy"
    SelectObject( This.hdc , This.obm )
    DeleteObject( This.hbm )
    DeleteDC( This.hdc )
    Gdip_DeleteGraphics( This.G )
    hwnd := This.Hwnd
    for k, v in PopUpWindow.Windows[ Hwnd ]
      This[k] := ""
    PopUpWindow.Windows[ Hwnd ] := ""
    if( GDIPShutdown ){
      Gdip_Shutdown( PopUpWindow.pToken )
      PopUpWindow.pToken := ""
    }
  }
  _OnClose( wParam ){
    if( wParam = 0xF060 ){	;SC_CLOSE ;[ clicking on the gui close button ]
      Try{
        Gui, % PopUpWindow.HelperHwnd ":Destroy"
        SoundBeep, 555
      }
    }
  }
  CreateCachedBitmap( pBitmap , Dispose := 0 ){
    local pCachedBitmap
    if( This.CachedBitmap )
      This.DisposeCachedbitmap()
    DllCall( "gdiplus\GdipCreateCachedBitmap" , "Ptr" , pBitmap , "Ptr" , this.G , "PtrP" , pCachedBitmap )
    This.CachedBitmap := pCachedBitmap
    if( Dispose )
      Gdip_DisposeImage( pBitmap )
  }
  DrawCachedBitmap( AutoUpdate := 0 ){
    DllCall( "gdiplus\GdipDrawCachedBitmap" , "Ptr" , this.G , "Ptr" , This.CachedBitmap , "Int" , 0 , "Int" , 0 )
    if( AutoUpdate )
      This.UpdateWindow()
  }
  DisposeCachedbitmap(){
    DllCall( "gdiplus\GdipDeleteCachedBitmap" , "Ptr" , This.CachedBitmap )
  }
  Helper(){
    local hwnd , MethodList := ["__New","UpdateSettings","ShowWindow","HideWindow","UpdateWindow","ClearWindow","DrawBitmap","PaintBackground","DeleteWindow" , "AddTrigger" , "DrawTriggers", "CreateCachedBitmap" , "DrawCachedBitmap" , "DisposeCachedbitmap" ]
    Gui, New, +AlwaysOnTop +ToolWindow +HwndHwnd
    PopUpWindow.HelperHwnd := hwnd
    Gui, Add, Edit, xm ym w250 r1 Center hwndhwnd, Gui1
    PopUpWindow.EditHwnd := hwnd
    loop, % MethodList.Length()	
      Gui, Add, Button, xm y+1 w250 r1 gPopUpWindow._HelperClip, % MethodList[ A_Index ]
    Gui, Show,,
    OnMessage( 0x112 , This._OnClose.Bind( hwnd ) )
  }
  _HelperClip(){
    local ClipList 
    
    GuiControlGet, out, % PopUpWindow.HelperHwnd ":", % PopUpWindow.EditHwnd	
    
    ClipList := 		{ 	__New: 					" := New PopUpWindow( { AutoShow: 1 , X: 0 , Y: 0 , W: A_ScreenWidth , H: A_ScreenHeight , Options: "" -DPIScale +AlwaysOnTop "" } )"
              ,	UpdateSettings:			".UpdateSettings( { X: """" , Y: """" , W: """" , H: """" } , UpdateGraphics := 0 )"
              ,	ShowWindow:				".ShowWindow( Title := """" )"
              ,	HideWindow:				".HideWindow()"
              ,	UpdateWindow:			".UpdateWindow()"
              ,	ClearWindow:			".ClearWindow( AutoUpdate := 0 )"
              ,	DrawBitmap:				".DrawBitmap( pBitmap := """" , { X: 0 , Y: 0 , W: " Out ".W , H: " Out ".H } , dispose := 1 , AutoUpdate := 0 )"
              ,	PaintBackground:		".PaintBackground( color := ""0xFF000000"" , AutoUpdate := 0 )  "  ";{ Color: ""0xFF000000"" , X: 2 , Y: 2 , W: " Out ".W - 4 , H: " Out ".H - 4 , Round: 10 }"
              ,	DeleteWindow:			".DeleteWindow( GDIPShutdown := 0 )"
              ,	AddTrigger:				".AddTrigger( { X: """" , Y: """" , W: """" , H: """" , Value: """" , Label: """" } )"	
              ,	DrawTriggers:			".DrawTriggers( color := ""0xFFFF0000"" , AutoUpdate := 0 )"	
              ,	CreateCachedBitmap:		".CreateCachedBitmap( pBitmap , Dispose := 0 )"	
              ,	DrawCachedBitmap: 		".DrawCachedBitmap( AutoUpdate := 0 )"	
              ,	DisposeCachedbitmap:	".DisposeCachedbitmap()"	}
              
    clipboard := Out ClipList[ A_GuiControl ]
    
  }
}

 

声明:站内资源为整理优化好的代码上传分享与学习研究,如果是开源代码基本都会标明出处,方便大家扩展学习路径。请不要恶意搬运,破坏站长辛苦整理维护的劳动成果。本站为爱好者分享站点,所有内容不作为商业行为。如若本站上传内容侵犯了原著者的合法权益,请联系我们进行删除下架。