Тема: 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"
}
Задать вопросы по коду можно в этой теме.