<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Серый форум &mdash; AHK: Окно-слайдер]]></title>
	<link rel="self" href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=8942&amp;type=atom" />
	<updated>2013-11-26T12:55:22Z</updated>
	<generator>PunBB</generator>
	<id>http://forum.script-coding.com/viewtopic.php?id=8942</id>
		<entry>
			<title type="html"><![CDATA[AHK: Окно-слайдер]]></title>
			<link rel="alternate" href="http://forum.script-coding.com/viewtopic.php?pid=77566#p77566" />
			<content type="html"><![CDATA[<p>Пример демонстрирует, как можно получить эффект &quot;выдвижения&quot; вспомогательного окна из основного с помощью winapi-функции <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms632669%28v=vs.85%29.aspx">AnimateWindow()</a>, и привязать вспомогательное окно к основному при передвижении.<br /></p><div class="codebox"><pre><code>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, &quot;Follow&quot;)     ; WM_MOVE = 0x3, отслеживаем передвижение главного окна
OnMessage(0x112, &quot;Follow&quot;)   ; WM_SYSCOMMAND = 0x112, отслеживаем минимизацию/восстановление главного окна
return

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

   DllCall(&quot;AnimateWindow&quot;, 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 &amp;&amp; k := 1)   ; SC_MINIMIZE = 0xF020
         Gui, 2:Show, Hide   ; скрываем окно-слайдер, если оно выдвинуто, при минимизации основного окна
      
      if (wp = 0xF120 &amp;&amp; !(k := 0) &amp;&amp; i)   ; SC_RESTORE = 0xF120
         Gui, 2:Show   ; показываем окно-слайдер, если оно было выдвинуто, при восстановлении основного окна
   }
   
   if (!i || hwnd != hGui1 || k = 1)
      return
; привязываем окно-слайдер к правой границе основного окна   
   DllCall(&quot;GetWindowInfo&quot;, Ptr, hGui1, Ptr, &amp;WI)
   Gui, 2:Show, % &quot;x&quot; NumGet(WI, 12, &quot;UInt&quot;) &quot; y&quot; NumGet(WI, 24, &quot;UInt&quot;)
               . &quot; h&quot; NumGet(WI, 32, &quot;UInt&quot;) - NumGet(WI, 24, &quot;UInt&quot;) &quot; NA&quot;
}</code></pre></div><p>Задать вопросы по коду можно в <a href="http://forum.script-coding.com/viewtopic.php?id=8928">этой</a> теме.</p>]]></content>
			<author>
				<name><![CDATA[teadrinker]]></name>
				<uri>http://forum.script-coding.com/profile.php?id=24515</uri>
			</author>
			<updated>2013-11-26T12:55:22Z</updated>
			<id>http://forum.script-coding.com/viewtopic.php?pid=77566#p77566</id>
		</entry>
</feed>
