1

Тема: AHK: Окно-слайдер

Пример демонстрирует, как можно получить эффект "выдвижения" вспомогательного окна из основного с помощью winapi-функции AnimateWindow(), и привязать вспомогательное окно к основному при передвижении.

Gui, +hwndhGui1
Gui, Add, Button, x125 y40 w70 gButton vButton, % Chr(0x2192)   ; значок стрелки вправо
Gui, Show, w200 h70

Gui, 2:+hwndhGui2 +Owner1 -Caption +Border
Gui, 2:Add, Text,, Здесь какая-то информация
VarSetCapacity(WI, 60)

OnMessage(0x3, "Follow")     ; WM_MOVE = 0x3, отслеживаем передвижение главного окна
OnMessage(0x112, "Follow")   ; WM_SYSCOMMAND = 0x112, отслеживаем минимизацию/восстановление главного окна
return

Button:   ; определяем положение главного окна и его клиентской области
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   if i := !i
      Gui, 2:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt") 
                  . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " hide"

   DllCall("AnimateWindow", Ptr, hGui2, UInt, 400, UInt, 0x40000|(i ? 1 : 0x10002))   ; выдвигаем/задвигаем окно-слайдер
   GuiControl,, Button, % Chr(0x2190|(i ? 0 : 2))   ; меняем стрелку на кнопке
   return
   
GuiClose:
   ExitApp
   
Follow(wp, lp, msg, hwnd)
{
   global hGui1, WI, i
   static k
   if (msg = 0x112)
   {
      if (wp = 0xF020 && k := 1)   ; SC_MINIMIZE = 0xF020
         Gui, 2:Show, Hide   ; скрываем окно-слайдер, если оно выдвинуто, при минимизации основного окна
      
      if (wp = 0xF120 && !(k := 0) && i)   ; SC_RESTORE = 0xF120
         Gui, 2:Show   ; показываем окно-слайдер, если оно было выдвинуто, при восстановлении основного окна
   }
   
   if (!i || hwnd != hGui1 || k = 1)
      return
; привязываем окно-слайдер к правой границе основного окна   
   DllCall("GetWindowInfo", Ptr, hGui1, Ptr, &WI)
   Gui, 2:Show, % "x" NumGet(WI, 12, "UInt") " y" NumGet(WI, 24, "UInt")
               . " h" NumGet(WI, 32, "UInt") - NumGet(WI, 24, "UInt") " NA"
}

Задать вопросы по коду можно в этой теме.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg