<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: ScrollBar]]></title>
		<link>https://forum.script-coding.com/viewtopic.php?id=15504</link>
		<atom:link href="https://forum.script-coding.com/extern.php?action=feed&amp;tid=15504&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: ScrollBar».]]></description>
		<lastBuildDate>Wed, 08 Jul 2020 16:24:16 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: AHK: ScrollBar]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140623#p140623</link>
			<description><![CDATA[<p><strong>serzh82saratov</strong>, во. Теперь работает, благодарю.</p>]]></description>
			<author><![CDATA[null@example.com (kolotilov256)]]></author>
			<pubDate>Wed, 08 Jul 2020 16:24:16 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140623#p140623</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: ScrollBar]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140622#p140622</link>
			<description><![CDATA[<p>Вы сохраняете пустоту, я думал вы проверили свой ини файл, перед тем как описали свою проблему.</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Wed, 08 Jul 2020 16:20:18 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140622#p140622</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: ScrollBar]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140621#p140621</link>
			<description><![CDATA[<p>Тут ошибка.<br /></p><div class="codebox"><pre><code>
Gui, Submit, NoHide
</code></pre></div><p>надо<br /></p><div class="codebox"><pre><code>
Gui, %hGui%:Submit, NoHide
</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Wed, 08 Jul 2020 16:18:17 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140621#p140621</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: ScrollBar]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140620#p140620</link>
			<description><![CDATA[<div class="quotebox"><cite>kolotilov256 пишет:</cite><blockquote><p> а должен быть мой текст</p></blockquote></div><p>У меня нет вашего текста.</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Wed, 08 Jul 2020 16:07:51 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140620#p140620</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: ScrollBar]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140619#p140619</link>
			<description><![CDATA[<p><strong>serzh82saratov</strong>, скопировал в точности ваш код. Не работает.<br />Т.е я запускаю, открывается окошко gui и в нём в каждой строке ERROR. Я ввожу туда какой-то текст, далее закрываю gui окно. Перезагружаю скрипт, открывается окошко gui и в нём в каждой строке простая пустота, а должен быть мой текст.</p>]]></description>
			<author><![CDATA[null@example.com (kolotilov256)]]></author>
			<pubDate>Wed, 08 Jul 2020 16:03:45 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140619#p140619</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: ScrollBar]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140618#p140618</link>
			<description><![CDATA[<div class="quotebox"><cite>serzh82saratov пишет:</cite><blockquote><p>Если ScrollWindow заменить на GuiShow, то никаких тормозов нет с любым количеством контролов.</p></blockquote></div><p>Надо бы ещё в AdjustToParent ScrollWindow заменить, иногда несистемно зависает при ресайзе. У меня не получилось с первой попытки.</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Wed, 08 Jul 2020 14:58:18 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140618#p140618</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: ScrollBar]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140617#p140617</link>
			<description><![CDATA[<p>У меня работает.<br /></p><div class="codebox"><pre><code>
#SingleInstance Force
#Persistent
#NoEnv 

scroll := 1

if scroll
{
	SetBatchLines, -1 
	Gui, New, +hwndhParentGUI
	Gui, New, +hwndhGui +Parent%hParentGUI%
}

Loop 20
{
	IniRead, param%A_Index%, settings.ini, set, param%A_Index%
}

Loop 20
{
	Gui, Add, Edit, % &quot;x10 y&quot; A_Index*30 &quot; w100 h16 w100 vNewParam&quot; A_Index, % param%A_Index%
}

if scroll
{
	SG1 := New ScrollGUI(HGUI, 130, 300, &quot;-Caption -Resize&quot;, 2, 2)
	SG1.SetLine(4, 40) 
	SG1.Show(&quot;ScrollGUI1 Title&quot;, &quot;x0 y0 NA&quot;)
	Gui, %hParentGui%: Show, % &quot;w150 h300&quot;
}
else gui, show
return

GuiClose:
Gui, Submit, NoHide
Loop 20
{
	IniWrite, % NewParam%A_Index%, settings.ini, set, param%A_Index%
}
ExitApp













; https://www.autohotkey.com/boards/viewtopic.php?f=6&amp;t=6316&amp;sid=3d408106d4c70b431530247bb388a9ed
; https://github.com/AHK-just-me/Class_ScrollGUI

; 16:50 05.07.2020 add GetClientPos &amp; ControlGetPos
; 16:03 05.07.2020 add SysGet

; 02:30 05.07.2020 ScrollWindow заменён на GuiShow
; http://forum.script-coding.com/viewtopic.php?pid=140580#p140580

; 23:36 04.07.2020 Добавлены дочерние окна
; http://forum.script-coding.com/viewtopic.php?pid=140567#p140567




; ======================================================================================================================
; Namepace:       ScrollGUI
; Function:       Create a scrollable GUI as a parent for GUI windows.
; Tested with:    AHK 1.1.19.02
; Tested on:      Win 8.1 (x64)
; Change log:     1.0.00.00/2015-02-06/just me        -  initial release on ahkscript.org
;                 1.0.01.00/2015-02-08/just me        -  bug fixes
;                 1.1.00.00/2015-02-09/just me        -  bug fixes and mouse wheel handling
; License:        The Unlicense -&gt; http://unlicense.org
; ======================================================================================================================
Class ScrollGUI {
   Static Instances := []
   Static SM_CXVSCROLL := ScrollGUI.SysGet(2), SM_CYHSCROLL := ScrollGUI.SysGet(3)
   
   ; ===================================================================================================================
   ; __New          Creates a scrollable parent window (ScrollGUI) for the passed GUI.
   ; Parameters:
   ;    HGUI        -  HWND of the GUI child window.
   ;    Width       -  Width of the client area of the ScrollGUI.
   ;                   Pass 0 to set the client area to the width of the child GUI (doesn&#039;t really make sense).
   ;    Height      -  Height of the client area of the ScrollGUI.
   ;                   Pass 0 to set the client area to the height of the child GUI (doesn&#039;t really make sense).
   ;    ----------- Optional:
   ;    GuiOptions  -  GUI options to be used when creating the ScrollGUI (e.g. +LabelMyLabel).
   ;                   Default: empty (no options)
   ;    ScrollBars  -  Scroll bars to register:
   ;                   1 : horizontal
   ;                   2 : vertical
   ;                   3 : both
   ;                   Default: 3
   ;    Wheel       -  Register WM_MOUSEWHEEL / WM_MOUSEHWHEEL messages:
   ;                   1 : register WM_MOUSEHWHEEL for horizontal scrolling
   ;                   2 : register WM_MOUSEWHEEL for vertical scrolling
   ;                   3 : register both
   ;                   4 : register WM_MOUSEWHEEL for vertical and Shift+WM_MOUSEWHEEL for horizontal scrolling
   ;                   Default: 0
   ;                   Add 8 to require the Ctrl key as modifier for wheel messages which shall be processed by the
   ;                   ScrollGUI. Unmodified wheel messages will be passed to the child GUI in this case.
   ; Return values:
   ;    On failure:    False
   ; Remarks:
   ;    The rect of the child GUI is determined using the &#039;AutoSize&#039; option of the &#039;Gui, Show&#039; command, after
   ;    &#039;-Caption&#039; is applied to the child GUI.
   ;    The maximum width and height of the parent GUI will be restricted to the dimensions of the child GUI.
   ;    If you register mouse wheel messages, the messages will be captured to scroll the ScrollGUI.
   ;    You won&#039;t be able to use the wheel to scroll child GUI controls unless Ctrl is required as modifier.
   ; ===================================================================================================================
   __New(HGUI, Width, Height, GuiOptions := &quot;&quot;, ScrollBars := 3, Wheel := 0) {
      Static SB_HORZ := 0, SB_VERT = 1
      Static WM_HSCROLL := 0x0114, WM_VSCROLL := 0x0115
      Static WM_MOUSEWHEEL := 0x020A, WM_MOUSEHWHEEL := 0x020E
      Static WS_HSCROLL := &quot;0x100000&quot;, WS_VSCROLL := &quot;0x200000&quot;
	  
      RequireCtrl := False
      If (Wheel &amp; 8) {
         RequireCtrl := True
         Wheel &amp;= (8 - 1)
      }
      If ((ScrollBars &lt;&gt; 1) &amp;&amp; (ScrollBars &lt;&gt; 2) &amp;&amp; (ScrollBars &lt;&gt; 3))
      || ((Wheel &lt;&gt; 0) &amp;&amp; (Wheel &lt;&gt; 1) &amp;&amp; (Wheel &lt;&gt; 2) &amp;&amp; (Wheel &lt;&gt; 3) &amp;&amp; (Wheel &lt;&gt; 4))
         Return False
      If !DllCall(&quot;User32.dll\IsWindow&quot;, &quot;Ptr&quot;, HGUI, &quot;UInt&quot;)
         Return False
      VarSetCapacity(RC, 16, 0)
      ; Child GUI
      If !This.AutoSize(HGUI, GuiW, GuiH)
         Return False
      Gui, %HGUI%:-Caption -Resize
      Gui, %HGUI%:Show, w%GuiW% h%GuiH% Hide
      MaxH := GuiW
      MaxV := GuiH
      ; Gui, %HGUI%:Show, AutoSize Hide
      ; DllCall(&quot;User32.dll\GetWindowRect&quot;, &quot;Ptr&quot;, HGUI, &quot;Ptr&quot;, &amp;RC)
      ; MaxH := NumGet(RC, 8, &quot;Int&quot;) - NumGet(RC, 0, &quot;Int&quot;)
      ; MaxV := Numget(RC, 12, &quot;Int&quot;) - NumGet(RC, 4, &quot;Int&quot;)
      LineH := Ceil(MaxH / 20)
      LineV := Ceil(MaxV / 20)
      ; ScrollGUI
      If (Width = 0)
         Width := MaxH
      If (Height = 0)
         Height := MaxV
      MX := MY := Styles := &quot;&quot;
	  this.SizeWSCROLL := this.SizeHSCROLL := 0
      If (ScrollBars &amp; 1) {
         MX := MaxH + 1
         Styles .= &quot; +&quot; . WS_HSCROLL
		 this.SizeHSCROLL := this.SM_CYHSCROLL
      }
      If (ScrollBars &amp; 2) {
         Styles .= &quot; +&quot; . WS_VSCROLL
         MY := MaxV + 1
		 this.SizeVSCROLL := this.SM_CXVSCROLL
      } 
      Gui, New, %GuiOptions% %Styles% +hwndHWND
      Gui, %HWND%:Show, w%Width% h%Height% Hide
      If (MX &lt;&gt; &quot;&quot;) || (MY &lt;&gt; &quot;&quot;)
         Gui, %HWND%:+MaxSize%MX%x%MY%
      DllCall(&quot;User32.dll\GetClientRect&quot;, &quot;Ptr&quot;, HWND, &quot;Ptr&quot;, &amp;RC)
	  PageH := NumGet(RC, 8, &quot;Int&quot;) + 1
      PageV := Numget(RC, 12, &quot;Int&quot;) + 1 
      ; Instance variables
      This.HWND := HWND
      This.HGUI := HGUI
      This.Width := Width
      This.Height := Height
      This.RequireCtrl := RequireCtrl
      This.UseShift := False
      If (ScrollBars &amp; 1) {
         This.SetScrollInfo(SB_HORZ, {Max: MaxH, Page: PageH, Pos: 0})
         OnMessage(WM_HSCROLL, &quot;ScrollGUI.On_WM_Scroll&quot;)
         If (Wheel &amp; 1)
            OnMessage(WM_MOUSEHWHEEL, &quot;ScrollGUI.On_WM_Wheel&quot;)
         Else If (Wheel &amp; 4) {
            OnMessage(WM_MOUSEWHEEL, &quot;ScrollGUI.On_WM_Wheel&quot;)
            This.UseShift := True
         }
         This.MaxH := MaxH
         This.LineH := LineH
         This.PageH := PageH
         This.PosH := 0
         This.ScrollH := True
         If (Wheel &amp; 5)
            This.WheelH := True
      }
      If (ScrollBars &amp; 2) {
         This.SetScrollInfo(SB_VERT, {Max: MaxV, Page: PageV, Pos: 0})
         OnMessage(WM_VSCROLL, &quot;ScrollGUI.On_WM_Scroll&quot;)
         If (Wheel &amp; 6)
            OnMessage(WM_MOUSEWHEEL, &quot;ScrollGUI.On_WM_Wheel&quot;)
         This.MaxV := MaxV
         This.LineV := LineV
         This.PageV := PageV
         This.PosV := 0
         This.ScrollV := True
         If (Wheel &amp; 6)
            This.WheelV := True
      }
      ; Set the position of the child GUI
	  WinGet, GuiStyle, Style, ahk_id %HGUI%
	  If (GuiStyle &amp; 0x40000000)  ; WS_CHILD
	  {
         WS_POPUP := 0x80000000, WS_CHILD := 0x40000000
	  	 Gui, %HWND%:+%WS_CHILD% -%WS_POPUP%
		 This.hParentGui := DllCall(&quot;GetParent&quot;, &quot;Ptr&quot;, HGUI)
	  	 DllCall(&quot;SetParent&quot;, &quot;Ptr&quot;, HWND, &quot;Ptr&quot;, This.hParentGui)
		 this.GetClientPos(This.hParentGui, left, top)
		 This.ParentClientX := left
		 This.ParentClientY := top
	  }    
	  WinGetPos, , , W, H, ahk_id %HWND%
	  This.GuiSizeW := W
      This.GuiSizeH := H
      Gui, %HGUI%:+parent%HWND%
      Gui, %HGUI%:Show, x0 y0
      This.Instances[HWND] := &amp;This
   }
   ; ===================================================================================================================
   ; __Delete       Destroy the GUIs, if they still exist.
   ; ===================================================================================================================
   __Delete() {
      This.Destroy()
   }
   ; ===================================================================================================================
   ; Show           Shows the ScrollGUI.
   ; Parameters:
   ;    Title       -  Title of the ScrollGUI window
   ;    ShowOptions -  Gui, Show command options, width or height options are ignored
   ; Return values:
   ;    On success: True
   ;    On failure: False
   ; ===================================================================================================================
   Show(Title := &quot;&quot;, ShowOptions := &quot;&quot;) {
      ShowOptions := RegExReplace(ShowOptions, &quot;i)AutoSize&quot;)
      W := This.Width
      H := This.Height
      Gui, % This.HWND . &quot;:Show&quot;, %ShowOptions% w%W% h%H%, %Title%
      Return True
   }
   ; ===================================================================================================================
   ; Destroy        Destroys the ScrollGUI and the associated child GUI.
   ; Parameters:
   ;    None.
   ; Return values:
   ;    On success: True
   ;    On failure: False
   ; Remarks:
   ;    Use this method instead of &#039;Gui, Destroy&#039; to remove the ScrollGUI from the &#039;Instances&#039; object.
   ; ===================================================================================================================
   Destroy() {
      If This.Instances.HasKey(This.HWND) {
         Gui, % This.HWND . &quot;:Destroy&quot;
         This.Instances.Remove(This.HWND, &quot;&quot;)
         Return True
      }
   }
   SysGet(N) {
      SysGet, OutputVar, %N% 
      Return OutputVar
   }
	GetClientPos(hwnd, ByRef left, ByRef top, ByRef w := &quot;&quot;, ByRef h := &quot;&quot;) {
		Static _ := VarSetCapacity(pwi, 60, 0)
		DllCall(&quot;GetWindowInfo&quot;, &quot;Ptr&quot;, hwnd, &quot;Ptr&quot;, &amp;pwi)
		left := NumGet(pwi, 20, &quot;Int&quot;) - NumGet(pwi, 4, &quot;Int&quot;)
		top := NumGet(pwi, 24, &quot;Int&quot;) - NumGet(pwi, 8, &quot;Int&quot;)
		w := NumGet(pwi, 28, &quot;Int&quot;) - NumGet(pwi, 20, &quot;Int&quot;)
		h := NumGet(pwi, 32, &quot;Int&quot;) - NumGet(pwi, 24, &quot;Int&quot;)
	}
   ; ===================================================================================================================
   ; AdjustToParent Adjust the scroll bars to the new parent dimensions.
   ; Parameters:
   ;    Width       -  New width of the client area of the ScrollGUI in pixels.
   ;                   Default: 0 -&gt; current width
   ;    Height      -  New height of the client area of the ScrollGUI in pixels.
   ;                   Default: 0 -&gt; current height
   ; Return values:
   ;    On success: True
   ;    On failure: False
   ; Remarks:
   ;    Call this method whenever the dimensions of the parent GUI have changed, e.g. after the GUI was resized,
   ;    restored or maximized. If either Width or Height is zero, both values will be set to the current dimensions.
   ; ===================================================================================================================
   AdjustToParent(Width := 0, Height := 0) {
      If (Width = 0) || (Height = 0) {
         VarSetCapacity(RC, 16, 0)
         DllCall(&quot;User32.dll\GetClientRect&quot;, &quot;Ptr&quot;, This.HWND, &quot;Ptr&quot;, &amp;RC)
         Width := NumGet(RC, 8, &quot;Int&quot;)
         Height := Numget(RC, 12, &quot;Int&quot;) 
      } 
	  If This.hParentGui
	  { 
	     ControlGetPos, GuiX, GuiY, GuiW, GuiH, , %  &quot;ahk_id&quot; This.HWND 
	     This.GuiPosX := GuiX - This.ParentClientX
	     This.GuiPosY := GuiY - This.ParentClientY
	     This.GuiSizeW := GuiW
	     This.GuiSizeH := GuiH
	  }
      SH := SV := 0
      If This.ScrollH {
         If (Width &lt;&gt; This.Width) {
            This.SetScrollInfo(0, {Page: Width + 1})
            This.Width := Width
            This.GetScrollInfo(0, SI)
            PosH := NumGet(SI, 20, &quot;Int&quot;)
            SH := This.PosH - PosH
            This.PosH := PosH 
         }
      } 
      If This.ScrollV {
         If (Height &lt;&gt; This.Height) {
            This.SetScrollInfo(1, {Page: Height + 1})
			This.Height := Height
            This.GetScrollInfo(1, SI)
            PosV := NumGet(SI, 20, &quot;Int&quot;)
            SV := This.PosV - PosV
            This.PosV := PosV
         }
      }
      If (SH) || (SV)
	  {
		; ScrollWindow при ресайзе бывает зависает, надо перевести на Gui
		; SH и SV бывают редко оба со значением
		  DllCall(&quot;User32.dll\ScrollWindow&quot;, &quot;Ptr&quot;, This.HWND, &quot;Int&quot;, SH, &quot;Int&quot;, SV, &quot;Ptr&quot;, 0, &quot;Ptr&quot;, 0)
		   
			; This.GetScrollInfo(!ScrollH, SI)
			; c := NumGet(SI, 20, &quot;Int&quot;)
			; If (ScrollH)
				; op := &quot;NA y&quot; -c &quot; x&quot; -PN
			; Else
				; op := &quot;NA x&quot; -c &quot; y&quot; -PN
			; Gui, % This.HGUI . &quot;:Show&quot;, % op
			; ToolTip % c &quot;`n&quot; PN &quot;`n&quot; op &quot;`n&quot; PosV 
	  }
      Return True
   }
   ; ===================================================================================================================
   ; AdjustToChild  Adjust the scroll bars to the new child dimensions.
   ; Parameters:
   ;    None
   ; Return values:
   ;    On success: True
   ;    On failure: False
   ; Remarks:
   ;    Call this method whenever the visible area of the child GUI has to be changed, e.g. after adding, hiding,
   ;    unhiding, resizing, or repositioning controls.
   ;    The client area of the child GUI is determined using the &#039;AutoSize&#039; option of a &#039;Gui, Show&#039; command.
   ; ===================================================================================================================
   AdjustToChild() {
      Static WS_HSCROLL := 0x100000, WS_VSCROLL := 0x200000
      VarSetCapacity(RC, 16, 0)
      DllCall(&quot;User32.dll\GetWindowRect&quot;, &quot;Ptr&quot;, This.HGUI, &quot;Ptr&quot;, &amp;RC)
      PrevW := NumGet(RC, 8, &quot;Int&quot;) - NumGet(RC, 0, &quot;Int&quot;)
      PrevH := Numget(RC, 12, &quot;Int&quot;) - NumGet(RC, 4, &quot;Int&quot;)
      DllCall(&quot;User32.dll\ScreenToClient&quot;, &quot;Ptr&quot;, This.HWND, &quot;Ptr&quot;, &amp;RC)
      XC := XN := NumGet(RC, 0, &quot;Int&quot;)
      YC := YN := NumGet(RC, 4, &quot;Int&quot;)
      If !This.AutoSize(This.HGUI, GuiW, GuiH)
         Return False
      Gui, % This.HGUI . &quot;:Show&quot;, x%XC% y%YC% w%GuiW% h%GuiH%
      MaxH := GuiW
      MaxV := GuiH
      MX := This.ScrollH ? MaxH + 1 : &quot;&quot;
      MY := This.ScrollV ? MaxV + 1 : &quot;&quot;
      If (MX &lt;&gt; &quot;&quot;) || (MY &lt;&gt; &quot;&quot;) {
         Gui, % This.HWND . &quot;:+MaxSize&quot; . MX . &quot;x&quot; . MY
         W := ((MX &lt;&gt; &quot;&quot;) &amp;&amp; (MX &lt; PrevW)) ? &quot;w&quot; . MX : &quot;&quot;
         H := ((MY &lt;&gt; &quot;&quot;) &amp;&amp; (MY &lt; PrevH)) ? &quot;h&quot; . MY : &quot;&quot;
         If (W || H ) {
            Gui, % This.HWND . &quot;:Show&quot;, %W% %H%
            If (W) {
               This.Width := MX
               This.SetScrollInfo(0, {Page: MX + 1})
            }
            If (H) {
               This.Height := MY
               This.SetScrollInfo(1, {Page: MY + 1})
            }
         }
      }
      ; Gui, % This.HGUI . &quot;:Show&quot;, x%XC% y%YC% AutoSize
      ; DllCall(&quot;User32.dll\GetWindowRect&quot;, &quot;Ptr&quot;, This.HGUI, &quot;Ptr&quot;, &amp;RC)
      ; MaxH := NumGet(RC, 8, &quot;Int&quot;) - NumGet(RC, 0, &quot;Int&quot;)
      ; MaxV := Numget(RC, 12, &quot;Int&quot;) - NumGet(RC, 4, &quot;Int&quot;)
      LineH := Ceil(MaxH / 20)
      LineV := Ceil(MaxV / 20)
      If This.ScrollH {
         This.SetMax(1, MaxH)
         This.LineH := LineH
         If (XC + MaxH) &lt; This.Width {
            XN += This.Width - (XC + MaxH)
            If (XN &gt; 0)
               XN := 0
            This.SetScrollInfo(0, {Pos: XN * -1})
            This.GetScrollInfo(0, SI)
            This.PosH := NumGet(SI, 20, &quot;Int&quot;)
         }
      }
      If This.ScrollV {
         This.SetMax(2, MaxV)
         This.LineV := LineV
         If (YC + MaxV) &lt; This.Height {
            YN += This.Height - (YC + MaxV)
            If (YN &gt; 0)
               YN := 0
            This.SetScrollInfo(1, {Pos: YN * -1})
            This.GetScrollInfo(1, SI)
            This.PosV := NumGet(SI, 20, &quot;Int&quot;)
         }
      }
      If (XC &lt;&gt; XN) || (YC &lt;&gt; YN)
         DllCall(&quot;User32.dll\ScrollWindow&quot;, &quot;Ptr&quot;, This.HWND, &quot;Int&quot;, XN - XC, &quot;Int&quot;, YN - YC, &quot;Ptr&quot;, 0, &quot;Ptr&quot;, 0)
      Return True
   }
   ; ===================================================================================================================
   ; SetMax         Sets the width or height of the scrolling area.
   ; Parameters:
   ;    SB          -  Scroll bar to set the value for:
   ;                   1 = horizontal
   ;                   2 = vertical
   ;    Max         -  Width respectively height of the scrolling area in pixels
   ; Return values:
   ;    On success: True
   ;    On failure: False
   ; ===================================================================================================================
   SetMax(SB, Max) {
      Static SB_HORZ := 0, SB_VERT = 1
      SB--
      If (SB &lt;&gt; SB_HORZ) &amp;&amp; (SB &lt;&gt; SB_VERT)
         Return False
      If (SB = SB_HORZ)
         This.MaxH := Max
      Else
         This.MaxV := Max
      Return This.SetScrollInfo(SB, {Max: Max})
   }
   ; ===================================================================================================================
   ; SetLine        Sets the number of pixels to scroll by line.
   ; Parameters:
   ;    SB          -  Scroll bar to set the value for:
   ;                   1 = horizontal
   ;                   2 = vertical
   ;    Line        -  Number of pixels.
   ; Return values:
   ;    On success: True
   ;    On failure: False
   ; ===================================================================================================================
   SetLine(SB, Line) {
      Static SB_HORZ := 0, SB_VERT = 1
      SB--
      If (SB &lt;&gt; SB_HORZ) &amp;&amp; (SB &lt;&gt; SB_VERT)
         Return False
      If (SB = SB_HORZ)
         This.LineH := Line
      Else
         This.LineV := Line
      Return True
   }
   ; ===================================================================================================================
   ; SetPage        Sets the number of pixels to scroll by page.
   ; Parameters:
   ;    SB          -  Scroll bar to set the value for:
   ;                   1 = horizontal
   ;                   2 = vertical
   ;    Page        -  Number of pixels.
   ; Return values:
   ;    On success: True
   ;    On failure: False
   ; Remarks:
   ;    If the ScrollGUI is resizable, the page size will be recalculated automatically while resizing.
   ; ===================================================================================================================
   SetPage(SB, Page) {
      Static SB_HORZ := 0, SB_VERT = 1
      SB--
      If (SB &lt;&gt; SB_HORZ) &amp;&amp; (SB &lt;&gt; SB_VERT)
         Return False
      If (SB = SB_HORZ)
         This.PageH := Page
      Else
         This.PageV := Page
      Return This.SetScrollInfo(SB, {Page: Page})
   }
   ; ===================================================================================================================
   ; Methods for internal or system use!!!
   ; ===================================================================================================================
   AutoSize(HGUI, ByRef Width, ByRef Height) {
      DHW := A_DetectHiddenWindows
      DetectHiddenWindows, On
      VarSetCapacity(RECT, 16, 0)
      Width := Height := 0
      HWND := HGUI
      CMD := 5 ; GW_CHILD
      L := T := R := B := LH := TH := &quot;&quot;
      While (HWND := DllCall(&quot;GetWindow&quot;, &quot;Ptr&quot;, HWND, &quot;UInt&quot;, CMD, &quot;UPtr&quot;)) &amp;&amp; (CMD := 2) {
         WinGetPos, X, Y, W, H, ahk_id %HWND%
         W += X, H += Y
         WinGet, Styles, Style, ahk_id %HWND%
         If (Styles &amp; 0x10000000) { ; WS_VISIBLE
            If (L = &quot;&quot;) || (X &lt; L)
               L := X
            If (T = &quot;&quot;) || (Y &lt; T)
               T := Y
            If (R = &quot;&quot;) || (W &gt; R)
               R := W
            If (B = &quot;&quot;) || (H &gt; B)
               B := H
         }
         Else {
            If (LH = &quot;&quot;) || (X &lt; LH)
               LH := X
            If (TH = &quot;&quot;) || (Y &lt; TH)
               TH := Y
         }
      }
      DetectHiddenWindows, %DHW%
      If (LH &lt;&gt; &quot;&quot;) {
         VarSetCapacity(POINT, 8, 0)
         NumPut(LH, POINT, 0, &quot;Int&quot;)
         DllCall(&quot;ScreenToClient&quot;, &quot;Ptr&quot;, HGUI, &quot;Ptr&quot;, &amp;POINT)
         LH := NumGet(POINT, 0, &quot;Int&quot;)
      }
      If (TH &lt;&gt; &quot;&quot;) {
         VarSetCapacity(POINT, 8, 0)
         NumPut(TH, POINT, 4, &quot;Int&quot;)
         DllCall(&quot;ScreenToClient&quot;, &quot;Ptr&quot;, HGUI, &quot;Ptr&quot;, &amp;POINT)
         TH := NumGet(POINT, 4, &quot;Int&quot;)
      }
      NumPut(L, RECT, 0, &quot;Int&quot;), NumPut(T, RECT,  4, &quot;Int&quot;)
      NumPut(R, RECT, 8, &quot;Int&quot;), NumPut(B, RECT, 12, &quot;Int&quot;)
      DllCall(&quot;MapWindowPoints&quot;, &quot;Ptr&quot;, 0, &quot;Ptr&quot;, HGUI, &quot;Ptr&quot;, &amp;RECT, &quot;UInt&quot;, 2)
      Width := NumGet(RECT, 8, &quot;Int&quot;) + (LH &lt;&gt; &quot;&quot; ? LH : NumGet(RECT, 0, &quot;Int&quot;))
      Height := NumGet(RECT, 12, &quot;Int&quot;) + (TH &lt;&gt; &quot;&quot; ? TH : NumGet(RECT,  4, &quot;Int&quot;))
      Return True
   }
   ; ===================================================================================================================
   GetScrollInfo(SB, ByRef SI) {
      Static SI_SIZE := 28
      Static SIF_ALL := 0x17
      VarSetCapacity(SI, SI_SIZE, 0)
      NumPut(SI_SIZE, SI, 0, &quot;UInt&quot;)
      NumPut(SIF_ALL, SI, 4, &quot;UInt&quot;)
      Return DllCall(&quot;User32.dll\GetScrollInfo&quot;, &quot;Ptr&quot;, This.HWND, &quot;Int&quot;, SB, &quot;Ptr&quot;, &amp;SI, &quot;UInt&quot;)
   }
   ; ===================================================================================================================
   SetScrollInfo(SB, Values) {
      Static SI_SIZE := 28
      Static SIF := {Max: 0x01, Page: 0x02, Pos: 0x04}
      Static Off := {Max: 12, Page: 16, Pos: 20}
      Static SIF_DISABLENOSCROLL := 0x08
      Mask := 0
      VarSetCapacity(SI, SI_SIZE, 0)
      NumPut(SI_SIZE, SI, 0, &quot;UInt&quot;)
      For Key, Value In Values {
         If SIF.HasKey(Key) {
            Mask |= SIF[Key]
            NumPut(Value, SI, Off[Key], &quot;UInt&quot;)
         }
      }
      If (Mask) {
         NumPut(Mask | SIF_DISABLENOSCROLL, SI, 4, &quot;UInt&quot;)
         Return DllCall(&quot;User32.dll\SetScrollInfo&quot;, &quot;Ptr&quot;, This.HWND, &quot;Int&quot;, SB, &quot;Ptr&quot;, &amp;SI, &quot;UInt&quot;, 1, &quot;UInt&quot;)
      }
      Return False
   }
   ; ===================================================================================================================
   On_WM_Scroll(LP, Msg, HWND) {
      Static WM_HSCROLL := 0x0114, WM_VSCROLL := 0x0115 
	   
      If ScrollGUI.Instances.HasKey(HWND) {
         Instance := Object(ScrollGUI.Instances[HWND])
         If ((Msg = WM_HSCROLL) &amp;&amp; Instance.ScrollH)
         || ((Msg = WM_VSCROLL) &amp;&amp; Instance.ScrollV)
            Return Instance.Scroll(This, LP, Msg, HWND)
      }
   }
   ; ===================================================================================================================
   Scroll(WP, LP, Msg, HWND) {
      Static SB_LINEMINUS := 0, SB_LINEPLUS := 1, SB_PAGEMINUS := 2, SB_PAGEPLUS := 3, SB_THUMBTRACK := 5
      Static WM_HSCROLL := 0x0114, WM_VSCROLL := 0x0115
		Static i := 0
      If (LP &lt;&gt; 0)
         Return 
      SB := (Msg = WM_HSCROLL ? 0 : 1) ; SB_HORZ : SB_VERT
      SC := WP &amp; 0xFFFF
      SD := (Msg = WM_HSCROLL ? This.LineH : This.LineV)
      SI := 0
      If !This.GetScrollInfo(SB, SI)
         Return 
		PA := PN := NumGet(SI, 20, &quot;Int&quot;)
		
      If (SC = SB_LINEMINUS)
         PN := PA - SD
      Else If (SC = SB_LINEPLUS)
         PN := PA + SD
      Else If (SC = SB_PAGEMINUS)
         PN := PA - NumGet(SI, 16, &quot;UInt&quot;)
      Else If (SC = SB_PAGEPLUS)
         PN := PA + NumGet(SI, 16, &quot;UInt&quot;)
      Else If (SC = SB_THUMBTRACK)
         PN := NumGet(SI, 24, &quot;Int&quot;)
      If (PA = PN)
         Return 0
      This.SetScrollInfo(SB, {Pos: PN})
      This.GetScrollInfo(SB, SI)
      PN := NumGet(SI, 20, &quot;Int&quot;)
      If (SB = 0)
         This.PosH := PN
      Else
         This.PosV := PN 
      If (PA &lt;&gt; PN) {
		 If 0
         {
	         HS := VS := 0
	         If (Msg = WM_HSCROLL)
	            HS := PA - PN
	         Else
	            VS := PA - PN
			 ; https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-scrollwindow
	         DllCall(&quot;User32.dll\ScrollWindow&quot;, &quot;Ptr&quot;, This.HGUI, &quot;Int&quot;, HS, &quot;Int&quot;, VS, &quot;Ptr&quot;, 0, &quot;Ptr&quot;, &amp;RECT)
         } 
		 Else 
         {
			This.GetScrollInfo((Msg = WM_HSCROLL), SI)
			c := NumGet(SI, 20, &quot;Int&quot;)
			If (Msg = WM_HSCROLL)
				op := &quot;NA y&quot; -c &quot; x&quot; -PN
			Else
				op := &quot;NA x&quot; -c &quot; y&quot; -PN
			Gui, % This.HGUI . &quot;:Show&quot;, % op
         }
      }
      Return 0
   }
   
   ; ===================================================================================================================
   On_WM_Wheel(LP, Msg, HWND) {
      Static MK_CONTROL := 0x0008
      Static MK_SHIFT := 0x0004
      Static WM_HSCROLL := 0x0114, WM_VSCROLL := 0x0115
      Static WM_MOUSEWHEEL := 0x020A, WM_MOUSEHWHEEL := 0x020E
      ; HWND := WinExist(&quot;A&quot;) 
      If ScrollGUI.Instances.HasKey(HWND) {
         Instance := Object(ScrollGUI.Instances[HWND])
         If (Instance.RequireCtrl &amp;&amp; (This &amp; MK_CONTROL)) || (!Instance.RequireCtrl &amp;&amp; !(This &amp; MK_CONTROL))
            If (Instance.WheelH &amp;&amp; (Msg = WM_MOUSEHWHEEL))
            || (Instance.WheelH &amp;&amp; ((Msg = WM_MOUSEWHEEL) &amp;&amp; Instance.UseShift &amp;&amp; (This &amp; MK_SHIFT)))
            || (Instance.WheelV &amp;&amp; (Msg = WM_MOUSEWHEEL))
               Return Instance.Wheel(This, LP, Msg, HWND)
      }
   }
   ; ===================================================================================================================
   Wheel(WP, LP, Msg, H) {
      Static MK_SHIFT := 0x0004
      Static SB_LINEMINUS := 0, SB_LINEPLUS := 1
      Static WM_MOUSEWHEEL := 0x020A, WM_MOUSEHWHEEL := 0x020E
      Static WM_HSCROLL := 0x0114, WM_VSCROLL := 0x0115
      If (Msg = WM_MOUSEWHEEL) &amp;&amp; (WP &amp; MK_SHIFT) &amp;&amp; This.UseShift
         Msg := WM_MOUSEHWHEEL
      MSG := (Msg = WM_MOUSEWHEEL ? WM_VSCROLL : WM_HSCROLL)
      SB := ((WP &gt;&gt; 16) &gt; 0x7FFF) || (WP &lt; 0) ? SB_LINEPLUS : SB_LINEMINUS
      Return This.Scroll(SB, 0, MSG, H)
   }
}


</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Wed, 08 Jul 2020 14:56:57 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140617#p140617</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: ScrollBar]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140595#p140595</link>
			<description><![CDATA[<p><strong>serzh82saratov</strong>, попробовал использовать ваш код в связке с IniRead/IniWrite, и что-то пошло не так...</p><p>При <strong>scroll := 0</strong> всё работает, при <strong>scroll := 1</strong> уже нет. </p><p>Наверно я где-то не до конца корректно использовал ваш код, слишком трудный для меня просто, не до конца вник в его работу) Просьба помочь исправить проблему.</p><div class="codebox"><pre><code>#SingleInstance Force
#Persistent
#NoEnv
#Include %A_Desktop%\Scripts\ScrollGUI.ahk

scroll := 0

if scroll
{
	SetBatchLines, -1 
	Gui, New, +hwndhParentGUI
	Gui, New, +hwndhGui +Parent%hParentGUI%
}

Loop 20
{
	IniRead, param%A_Index%, settings.ini, set, param%A_Index%
}

Loop 20
{
	Gui, Add, Edit, % &quot;x10 y&quot; A_Index*30 &quot; w100 h16 w100 vNewParam&quot; A_Index, % param%A_Index%
}

if scroll
{
	SG1 := New ScrollGUI(HGUI, 130, 300, &quot;-Caption -Resize&quot;, 2, 2)
	SG1.SetLine(4, 40) 
	SG1.Show(&quot;ScrollGUI1 Title&quot;, &quot;x0 y0 NA&quot;)
	Gui, %hParentGui%: Show, % &quot;w150 h300&quot;
}
else gui, show
return

GuiClose:
Gui, Submit, NoHide
Loop 20
{
	IniWrite, % NewParam%A_Index%, settings.ini, set, param%A_Index%
}
ExitApp</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (kolotilov256)]]></author>
			<pubDate>Mon, 06 Jul 2020 08:31:01 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140595#p140595</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: ScrollBar]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140580#p140580</link>
			<description><![CDATA[<p>Если ScrollWindow заменить на GuiShow, то никаких тормозов нет с любым количеством контролов. <br />Таким образом нельзя удалить создаваемое родительское окно.<br />Если использовать ScrollWindowEx без SW_SCROLLCHILDREN, то тормозов нет, но окно перестаёт нормально рендерится, в коде есть для тестов.<br /></p><div class="codebox"><pre><code>

#SingleInstance force
#NoEnv
SetBatchLines, -1 

Gui, New, +hwndhParentGUI
Gui, Color, Red
Gui, New, +hwndhGui +Parent%hParentGUI%

Loop 100
{
   i := A_Index
   Loop 5
   {
      If A_Index = 1 
         Gui, Add, Text, xm y+10 w21 h21 0x201, % i
      Else  
         Gui, Add, Text, x+10 w21 h21 yp 0x201, % i 
      Gui, Add, Edit, x+10 yp w55 hp r1, % A_Index
   }
} 
SG1 := New ScrollGUI(HGUI, 0, 200, &quot;-Caption -Resize&quot;, 2, 2)
SG1.SetLine(2, 31) 

Gui, New, +hwndhGui +Parent%hParentGUI%
Loop 10
{
   i := A_Index
   Loop 5
   {
      If A_Index = 1 
         Gui, Add, Text, xm y+10 w22 0x201, % i  
      Else  
         Gui, Add, Text, x+10 w22 yp 0x201, % i 
      Gui, Add, Edit, x+10 yp w55 hp r1, % A_Index
   }
} 
SG2 := New ScrollGUI(HGUI, 330, 200, &quot;-Caption -Resize&quot;, 3, 4)

SG1.Show(&quot;ScrollGUI1 Title&quot;, &quot;x0 y0 NA&quot;)
SG2.Show(&quot;ScrollGUI2 Title&quot;, &quot;x0 y&quot; SG1.GuiSizeH + 1 &quot; NA&quot;)

Gui, %hParentGui%:Add, Edit, % &quot;+0x100000 +0x4 +0x80 -wrap w&quot; SG1.GuiSizeW - SG2.GuiSizeW - 2
	. &quot; h&quot; SG2.GuiSizeH
	. &quot; x&quot; SG2.GuiSizeW + 2
	. &quot; y&quot; SG1.GuiSizeH + 1
	
Gui, %hParentGui%: Show, % &quot;w&quot; SG1.GuiSizeW &quot; h&quot; SG1.GuiSizeH + SG2.GuiSizeH + 1
Return

GuiClose:
	ExitApp



; 23:36 04.07.2020 Добавлены дочерние окна
; 02:30 05.07.2020 ScrollWindow заменён на GuiShow
; http://forum.script-coding.com/viewtopic.php?pid=140580#p140580



; ======================================================================================================================
; Namepace:       ScrollGUI
; Function:       Create a scrollable GUI as a parent for GUI windows.
; Tested with:    AHK 1.1.19.02
; Tested on:      Win 8.1 (x64)
; Change log:     1.0.00.00/2015-02-06/just me        -  initial release on ahkscript.org
;                 1.0.01.00/2015-02-08/just me        -  bug fixes
;                 1.1.00.00/2015-02-09/just me        -  bug fixes and mouse wheel handling
; License:        The Unlicense -&gt; http://unlicense.org
; ======================================================================================================================
Class ScrollGUI {
   Static Instances := []
   ; ===================================================================================================================
   ; __New          Creates a scrollable parent window (ScrollGUI) for the passed GUI.
   ; Parameters:
   ;    HGUI        -  HWND of the GUI child window.
   ;    Width       -  Width of the client area of the ScrollGUI.
   ;                   Pass 0 to set the client area to the width of the child GUI (doesn&#039;t really make sense).
   ;    Height      -  Height of the client area of the ScrollGUI.
   ;                   Pass 0 to set the client area to the height of the child GUI (doesn&#039;t really make sense).
   ;    ----------- Optional:
   ;    GuiOptions  -  GUI options to be used when creating the ScrollGUI (e.g. +LabelMyLabel).
   ;                   Default: empty (no options)
   ;    ScrollBars  -  Scroll bars to register:
   ;                   1 : horizontal
   ;                   2 : vertical
   ;                   3 : both
   ;                   Default: 3
   ;    Wheel       -  Register WM_MOUSEWHEEL / WM_MOUSEHWHEEL messages:
   ;                   1 : register WM_MOUSEHWHEEL for horizontal scrolling
   ;                   2 : register WM_MOUSEWHEEL for vertical scrolling
   ;                   3 : register both
   ;                   4 : register WM_MOUSEWHEEL for vertical and Shift+WM_MOUSEWHEEL for horizontal scrolling
   ;                   Default: 0
   ;                   Add 8 to require the Ctrl key as modifier for wheel messages which shall be processed by the
   ;                   ScrollGUI. Unmodified wheel messages will be passed to the child GUI in this case.
   ; Return values:
   ;    On failure:    False
   ; Remarks:
   ;    The rect of the child GUI is determined using the &#039;AutoSize&#039; option of the &#039;Gui, Show&#039; command, after
   ;    &#039;-Caption&#039; is applied to the child GUI.
   ;    The maximum width and height of the parent GUI will be restricted to the dimensions of the child GUI.
   ;    If you register mouse wheel messages, the messages will be captured to scroll the ScrollGUI.
   ;    You won&#039;t be able to use the wheel to scroll child GUI controls unless Ctrl is required as modifier.
   ; ===================================================================================================================
   __New(HGUI, Width, Height, GuiOptions := &quot;&quot;, ScrollBars := 3, Wheel := 0) {
      Static SB_HORZ := 0, SB_VERT = 1
      Static WM_HSCROLL := 0x0114, WM_VSCROLL := 0x0115
      Static WM_MOUSEWHEEL := 0x020A, WM_MOUSEHWHEEL := 0x020E
      Static WS_HSCROLL := &quot;0x100000&quot;, WS_VSCROLL := &quot;0x200000&quot;
      RequireCtrl := False
      If (Wheel &amp; 8) {
         RequireCtrl := True
         Wheel &amp;= (8 - 1)
      }
      If ((ScrollBars &lt;&gt; 1) &amp;&amp; (ScrollBars &lt;&gt; 2) &amp;&amp; (ScrollBars &lt;&gt; 3))
      || ((Wheel &lt;&gt; 0) &amp;&amp; (Wheel &lt;&gt; 1) &amp;&amp; (Wheel &lt;&gt; 2) &amp;&amp; (Wheel &lt;&gt; 3) &amp;&amp; (Wheel &lt;&gt; 4))
         Return False
      If !DllCall(&quot;User32.dll\IsWindow&quot;, &quot;Ptr&quot;, HGUI, &quot;UInt&quot;)
         Return False
      VarSetCapacity(RC, 16, 0)
      ; Child GUI
      If !This.AutoSize(HGUI, GuiW, GuiH)
         Return False
      Gui, %HGUI%:-Caption -Resize
      Gui, %HGUI%:Show, w%GuiW% h%GuiH% Hide
      MaxH := GuiW
      MaxV := GuiH
      ; Gui, %HGUI%:Show, AutoSize Hide
      ; DllCall(&quot;User32.dll\GetWindowRect&quot;, &quot;Ptr&quot;, HGUI, &quot;Ptr&quot;, &amp;RC)
      ; MaxH := NumGet(RC, 8, &quot;Int&quot;) - NumGet(RC, 0, &quot;Int&quot;)
      ; MaxV := Numget(RC, 12, &quot;Int&quot;) - NumGet(RC, 4, &quot;Int&quot;)
      LineH := Ceil(MaxH / 20)
      LineV := Ceil(MaxV / 20)
      ; ScrollGUI
      If (Width = 0)
         Width := MaxH
      If (Height = 0)
         Height := MaxV
      MX := MY := Styles := &quot;&quot;
      If (ScrollBars &amp; 1) {
         MX := MaxH + 1
         Styles .= &quot; +&quot; . WS_HSCROLL
      }
      If (ScrollBars &amp; 2) {
         Styles .= &quot; +&quot; . WS_VSCROLL
         MY := MaxV + 1
      } 
      Gui, New, %GuiOptions% %Styles% +hwndHWND
      Gui, %HWND%:Show, w%Width% h%Height% Hide
      If (MX &lt;&gt; &quot;&quot;) || (MY &lt;&gt; &quot;&quot;)
         Gui, %HWND%:+MaxSize%MX%x%MY%
      DllCall(&quot;User32.dll\GetClientRect&quot;, &quot;Ptr&quot;, HWND, &quot;Ptr&quot;, &amp;RC)
	  PageH := NumGet(RC, 8, &quot;Int&quot;) + 1
      PageV := Numget(RC, 12, &quot;Int&quot;) + 1 
      ; Instance variables
      This.HWND := HWND
      This.HGUI := HGUI
      This.Width := Width
      This.Height := Height
      This.RequireCtrl := RequireCtrl
      This.UseShift := False
      If (ScrollBars &amp; 1) {
         This.SetScrollInfo(SB_HORZ, {Max: MaxH, Page: PageH, Pos: 0})
         OnMessage(WM_HSCROLL, &quot;ScrollGUI.On_WM_Scroll&quot;)
         If (Wheel &amp; 1)
            OnMessage(WM_MOUSEHWHEEL, &quot;ScrollGUI.On_WM_Wheel&quot;)
         Else If (Wheel &amp; 4) {
            OnMessage(WM_MOUSEWHEEL, &quot;ScrollGUI.On_WM_Wheel&quot;)
            This.UseShift := True
         }
         This.MaxH := MaxH
         This.LineH := LineH
         This.PageH := PageH
         This.PosH := 0
         This.ScrollH := True
         If (Wheel &amp; 5)
            This.WheelH := True
      }
      If (ScrollBars &amp; 2) {
         This.SetScrollInfo(SB_VERT, {Max: MaxV, Page: PageV, Pos: 0})
         OnMessage(WM_VSCROLL, &quot;ScrollGUI.On_WM_Scroll&quot;)
         If (Wheel &amp; 6)
            OnMessage(WM_MOUSEWHEEL, &quot;ScrollGUI.On_WM_Wheel&quot;)
         This.MaxV := MaxV
         This.LineV := LineV
         This.PageV := PageV
         This.PosV := 0
         This.ScrollV := True
         If (Wheel &amp; 6)
            This.WheelV := True
      }
      ; Set the position of the child GUI
	  WinGet, GuiStyle, Style, ahk_id %HGUI%
	  If (GuiStyle &amp; 0x40000000)  ; WS_CHILD
	  {
         WS_POPUP := 0x80000000, WS_CHILD := 0x40000000
	  	 Gui, %HWND%:+%WS_CHILD% -%WS_POPUP%
		 This.hParentGui := DllCall(&quot;GetParent&quot;, &quot;Ptr&quot;, HGUI)
	  	 DllCall(&quot;SetParent&quot;, &quot;Ptr&quot;, HWND, &quot;Ptr&quot;, This.hParentGui)
	  } 
	  WinGetPos, X, Y, W, H, ahk_id %HWND% 
      This.GuiSizeX := X
      This.GuiSizeY := Y
      This.GuiSizeW := W
      This.GuiSizeH := H
      Gui, %HGUI%:+parent%HWND%
      Gui, %HGUI%:Show, x0 y0
      This.Instances[HWND] := &amp;This
   }
   ; ===================================================================================================================
   ; __Delete       Destroy the GUIs, if they still exist.
   ; ===================================================================================================================
   __Delete() {
      This.Destroy()
   }
   ; ===================================================================================================================
   ; Show           Shows the ScrollGUI.
   ; Parameters:
   ;    Title       -  Title of the ScrollGUI window
   ;    ShowOptions -  Gui, Show command options, width or height options are ignored
   ; Return values:
   ;    On success: True
   ;    On failure: False
   ; ===================================================================================================================
   Show(Title := &quot;&quot;, ShowOptions := &quot;&quot;) {
      ShowOptions := RegExReplace(ShowOptions, &quot;i)AutoSize&quot;)
      W := This.Width
      H := This.Height
      Gui, % This.HWND . &quot;:Show&quot;, %ShowOptions% w%W% h%H%, %Title%
      Return True
   }
   ; ===================================================================================================================
   ; Destroy        Destroys the ScrollGUI and the associated child GUI.
   ; Parameters:
   ;    None.
   ; Return values:
   ;    On success: True
   ;    On failure: False
   ; Remarks:
   ;    Use this method instead of &#039;Gui, Destroy&#039; to remove the ScrollGUI from the &#039;Instances&#039; object.
   ; ===================================================================================================================
   Destroy() {
      If This.Instances.HasKey(This.HWND) {
         Gui, % This.HWND . &quot;:Destroy&quot;
         This.Instances.Remove(This.HWND, &quot;&quot;)
         Return True
      }
   }
   ; ===================================================================================================================
   ; AdjustToParent Adjust the scroll bars to the new parent dimensions.
   ; Parameters:
   ;    Width       -  New width of the client area of the ScrollGUI in pixels.
   ;                   Default: 0 -&gt; current width
   ;    Height      -  New height of the client area of the ScrollGUI in pixels.
   ;                   Default: 0 -&gt; current height
   ; Return values:
   ;    On success: True
   ;    On failure: False
   ; Remarks:
   ;    Call this method whenever the dimensions of the parent GUI have changed, e.g. after the GUI was resized,
   ;    restored or maximized. If either Width or Height is zero, both values will be set to the current dimensions.
   ; ===================================================================================================================
   AdjustToParent(Width := 0, Height := 0) {
      If (Width = 0) || (Height = 0) {
         VarSetCapacity(RC, 16, 0)
         DllCall(&quot;User32.dll\GetClientRect&quot;, &quot;Ptr&quot;, This.HWND, &quot;Ptr&quot;, &amp;RC)
         Width := NumGet(RC, 8, &quot;Int&quot;)
         Height := Numget(RC, 12, &quot;Int&quot;)
      }
      SH := SV := 0
      If This.ScrollH {
         If (Width &lt;&gt; This.Width) {
            This.SetScrollInfo(0, {Page: Width + 1})
            This.Width := Width
            This.GetScrollInfo(0, SI)
            PosH := NumGet(SI, 20, &quot;Int&quot;)
            SH := This.PosH - PosH
            This.PosH := PosH
         }
      }
      If This.ScrollV {
         If (Height &lt;&gt; This.Height) {
            This.SetScrollInfo(1, {Page: Height + 1})
            This.Height := Height
            This.GetScrollInfo(1, SI)
            PosV := NumGet(SI, 20, &quot;Int&quot;)
            SV := This.PosV - PosV
            This.PosV := PosV
         }
      }
      If (SH) || (SV)
         DllCall(&quot;User32.dll\ScrollWindow&quot;, &quot;Ptr&quot;, This.HWND, &quot;Int&quot;, SH, &quot;Int&quot;, SV, &quot;Ptr&quot;, 0, &quot;Ptr&quot;, 0)
      Return True
   }
   ; ===================================================================================================================
   ; AdjustToChild  Adjust the scroll bars to the new child dimensions.
   ; Parameters:
   ;    None
   ; Return values:
   ;    On success: True
   ;    On failure: False
   ; Remarks:
   ;    Call this method whenever the visible area of the child GUI has to be changed, e.g. after adding, hiding,
   ;    unhiding, resizing, or repositioning controls.
   ;    The client area of the child GUI is determined using the &#039;AutoSize&#039; option of a &#039;Gui, Show&#039; command.
   ; ===================================================================================================================
   AdjustToChild() {
      Static WS_HSCROLL := 0x100000, WS_VSCROLL := 0x200000
      VarSetCapacity(RC, 16, 0)
      DllCall(&quot;User32.dll\GetWindowRect&quot;, &quot;Ptr&quot;, This.HGUI, &quot;Ptr&quot;, &amp;RC)
      PrevW := NumGet(RC, 8, &quot;Int&quot;) - NumGet(RC, 0, &quot;Int&quot;)
      PrevH := Numget(RC, 12, &quot;Int&quot;) - NumGet(RC, 4, &quot;Int&quot;)
      DllCall(&quot;User32.dll\ScreenToClient&quot;, &quot;Ptr&quot;, This.HWND, &quot;Ptr&quot;, &amp;RC)
      XC := XN := NumGet(RC, 0, &quot;Int&quot;)
      YC := YN := NumGet(RC, 4, &quot;Int&quot;)
      If !This.AutoSize(This.HGUI, GuiW, GuiH)
         Return False
      Gui, % This.HGUI . &quot;:Show&quot;, x%XC% y%YC% w%GuiW% h%GuiH%
      MaxH := GuiW
      MaxV := GuiH
      MX := This.ScrollH ? MaxH + 1 : &quot;&quot;
      MY := This.ScrollV ? MaxV + 1 : &quot;&quot;
      If (MX &lt;&gt; &quot;&quot;) || (MY &lt;&gt; &quot;&quot;) {
         Gui, % This.HWND . &quot;:+MaxSize&quot; . MX . &quot;x&quot; . MY
         W := ((MX &lt;&gt; &quot;&quot;) &amp;&amp; (MX &lt; PrevW)) ? &quot;w&quot; . MX : &quot;&quot;
         H := ((MY &lt;&gt; &quot;&quot;) &amp;&amp; (MY &lt; PrevH)) ? &quot;h&quot; . MY : &quot;&quot;
         If (W || H ) {
            Gui, % This.HWND . &quot;:Show&quot;, %W% %H%
            If (W) {
               This.Width := MX
               This.SetScrollInfo(0, {Page: MX + 1})
            }
            If (H) {
               This.Height := MY
               This.SetScrollInfo(1, {Page: MY + 1})
            }
         }
      }
      ; Gui, % This.HGUI . &quot;:Show&quot;, x%XC% y%YC% AutoSize
      ; DllCall(&quot;User32.dll\GetWindowRect&quot;, &quot;Ptr&quot;, This.HGUI, &quot;Ptr&quot;, &amp;RC)
      ; MaxH := NumGet(RC, 8, &quot;Int&quot;) - NumGet(RC, 0, &quot;Int&quot;)
      ; MaxV := Numget(RC, 12, &quot;Int&quot;) - NumGet(RC, 4, &quot;Int&quot;)
      LineH := Ceil(MaxH / 20)
      LineV := Ceil(MaxV / 20)
      If This.ScrollH {
         This.SetMax(1, MaxH)
         This.LineH := LineH
         If (XC + MaxH) &lt; This.Width {
            XN += This.Width - (XC + MaxH)
            If (XN &gt; 0)
               XN := 0
            This.SetScrollInfo(0, {Pos: XN * -1})
            This.GetScrollInfo(0, SI)
            This.PosH := NumGet(SI, 20, &quot;Int&quot;)
         }
      }
      If This.ScrollV {
         This.SetMax(2, MaxV)
         This.LineV := LineV
         If (YC + MaxV) &lt; This.Height {
            YN += This.Height - (YC + MaxV)
            If (YN &gt; 0)
               YN := 0
            This.SetScrollInfo(1, {Pos: YN * -1})
            This.GetScrollInfo(1, SI)
            This.PosV := NumGet(SI, 20, &quot;Int&quot;)
         }
      }
      If (XC &lt;&gt; XN) || (YC &lt;&gt; YN)
         DllCall(&quot;User32.dll\ScrollWindow&quot;, &quot;Ptr&quot;, This.HWND, &quot;Int&quot;, XN - XC, &quot;Int&quot;, YN - YC, &quot;Ptr&quot;, 0, &quot;Ptr&quot;, 0)
      Return True
   }
   ; ===================================================================================================================
   ; SetMax         Sets the width or height of the scrolling area.
   ; Parameters:
   ;    SB          -  Scroll bar to set the value for:
   ;                   1 = horizontal
   ;                   2 = vertical
   ;    Max         -  Width respectively height of the scrolling area in pixels
   ; Return values:
   ;    On success: True
   ;    On failure: False
   ; ===================================================================================================================
   SetMax(SB, Max) {
      Static SB_HORZ := 0, SB_VERT = 1
      SB--
      If (SB &lt;&gt; SB_HORZ) &amp;&amp; (SB &lt;&gt; SB_VERT)
         Return False
      If (SB = SB_HORZ)
         This.MaxH := Max
      Else
         This.MaxV := Max
      Return This.SetScrollInfo(SB, {Max: Max})
   }
   ; ===================================================================================================================
   ; SetLine        Sets the number of pixels to scroll by line.
   ; Parameters:
   ;    SB          -  Scroll bar to set the value for:
   ;                   1 = horizontal
   ;                   2 = vertical
   ;    Line        -  Number of pixels.
   ; Return values:
   ;    On success: True
   ;    On failure: False
   ; ===================================================================================================================
   SetLine(SB, Line) {
      Static SB_HORZ := 0, SB_VERT = 1
      SB--
      If (SB &lt;&gt; SB_HORZ) &amp;&amp; (SB &lt;&gt; SB_VERT)
         Return False
      If (SB = SB_HORZ)
         This.LineH := Line
      Else
         This.LineV := Line
      Return True
   }
   ; ===================================================================================================================
   ; SetPage        Sets the number of pixels to scroll by page.
   ; Parameters:
   ;    SB          -  Scroll bar to set the value for:
   ;                   1 = horizontal
   ;                   2 = vertical
   ;    Page        -  Number of pixels.
   ; Return values:
   ;    On success: True
   ;    On failure: False
   ; Remarks:
   ;    If the ScrollGUI is resizable, the page size will be recalculated automatically while resizing.
   ; ===================================================================================================================
   SetPage(SB, Page) {
      Static SB_HORZ := 0, SB_VERT = 1
      SB--
      If (SB &lt;&gt; SB_HORZ) &amp;&amp; (SB &lt;&gt; SB_VERT)
         Return False
      If (SB = SB_HORZ)
         This.PageH := Page
      Else
         This.PageV := Page
      Return This.SetScrollInfo(SB, {Page: Page})
   }
   ; ===================================================================================================================
   ; Methods for internal or system use!!!
   ; ===================================================================================================================
   AutoSize(HGUI, ByRef Width, ByRef Height) {
      DHW := A_DetectHiddenWindows
      DetectHiddenWindows, On
      VarSetCapacity(RECT, 16, 0)
      Width := Height := 0
      HWND := HGUI
      CMD := 5 ; GW_CHILD
      L := T := R := B := LH := TH := &quot;&quot;
      While (HWND := DllCall(&quot;GetWindow&quot;, &quot;Ptr&quot;, HWND, &quot;UInt&quot;, CMD, &quot;UPtr&quot;)) &amp;&amp; (CMD := 2) {
         WinGetPos, X, Y, W, H, ahk_id %HWND%
         W += X, H += Y
         WinGet, Styles, Style, ahk_id %HWND%
         If (Styles &amp; 0x10000000) { ; WS_VISIBLE
            If (L = &quot;&quot;) || (X &lt; L)
               L := X
            If (T = &quot;&quot;) || (Y &lt; T)
               T := Y
            If (R = &quot;&quot;) || (W &gt; R)
               R := W
            If (B = &quot;&quot;) || (H &gt; B)
               B := H
         }
         Else {
            If (LH = &quot;&quot;) || (X &lt; LH)
               LH := X
            If (TH = &quot;&quot;) || (Y &lt; TH)
               TH := Y
         }
      }
      DetectHiddenWindows, %DHW%
      If (LH &lt;&gt; &quot;&quot;) {
         VarSetCapacity(POINT, 8, 0)
         NumPut(LH, POINT, 0, &quot;Int&quot;)
         DllCall(&quot;ScreenToClient&quot;, &quot;Ptr&quot;, HGUI, &quot;Ptr&quot;, &amp;POINT)
         LH := NumGet(POINT, 0, &quot;Int&quot;)
      }
      If (TH &lt;&gt; &quot;&quot;) {
         VarSetCapacity(POINT, 8, 0)
         NumPut(TH, POINT, 4, &quot;Int&quot;)
         DllCall(&quot;ScreenToClient&quot;, &quot;Ptr&quot;, HGUI, &quot;Ptr&quot;, &amp;POINT)
         TH := NumGet(POINT, 4, &quot;Int&quot;)
      }
      NumPut(L, RECT, 0, &quot;Int&quot;), NumPut(T, RECT,  4, &quot;Int&quot;)
      NumPut(R, RECT, 8, &quot;Int&quot;), NumPut(B, RECT, 12, &quot;Int&quot;)
      DllCall(&quot;MapWindowPoints&quot;, &quot;Ptr&quot;, 0, &quot;Ptr&quot;, HGUI, &quot;Ptr&quot;, &amp;RECT, &quot;UInt&quot;, 2)
      Width := NumGet(RECT, 8, &quot;Int&quot;) + (LH &lt;&gt; &quot;&quot; ? LH : NumGet(RECT, 0, &quot;Int&quot;))
      Height := NumGet(RECT, 12, &quot;Int&quot;) + (TH &lt;&gt; &quot;&quot; ? TH : NumGet(RECT,  4, &quot;Int&quot;))
      Return True
   }
   ; ===================================================================================================================
   GetScrollInfo(SB, ByRef SI) {
      Static SI_SIZE := 28
      Static SIF_ALL := 0x17
      VarSetCapacity(SI, SI_SIZE, 0)
      NumPut(SI_SIZE, SI, 0, &quot;UInt&quot;)
      NumPut(SIF_ALL, SI, 4, &quot;UInt&quot;)
      Return DllCall(&quot;User32.dll\GetScrollInfo&quot;, &quot;Ptr&quot;, This.HWND, &quot;Int&quot;, SB, &quot;Ptr&quot;, &amp;SI, &quot;UInt&quot;)
   }
   ; ===================================================================================================================
   SetScrollInfo(SB, Values) {
      Static SI_SIZE := 28
      Static SIF := {Max: 0x01, Page: 0x02, Pos: 0x04}
      Static Off := {Max: 12, Page: 16, Pos: 20}
      Static SIF_DISABLENOSCROLL := 0x08
      Mask := 0
      VarSetCapacity(SI, SI_SIZE, 0)
      NumPut(SI_SIZE, SI, 0, &quot;UInt&quot;)
      For Key, Value In Values {
         If SIF.HasKey(Key) {
            Mask |= SIF[Key]
            NumPut(Value, SI, Off[Key], &quot;UInt&quot;)
         }
      }
      If (Mask) {
         NumPut(Mask | SIF_DISABLENOSCROLL, SI, 4, &quot;UInt&quot;)
         Return DllCall(&quot;User32.dll\SetScrollInfo&quot;, &quot;Ptr&quot;, This.HWND, &quot;Int&quot;, SB, &quot;Ptr&quot;, &amp;SI, &quot;UInt&quot;, 1, &quot;UInt&quot;)
      }
      Return False
   }
   ; ===================================================================================================================
   On_WM_Scroll(LP, Msg, HWND) {
      Static WM_HSCROLL := 0x0114, WM_VSCROLL := 0x0115 
	   
      If ScrollGUI.Instances.HasKey(HWND) {
         Instance := Object(ScrollGUI.Instances[HWND])
         If ((Msg = WM_HSCROLL) &amp;&amp; Instance.ScrollH)
         || ((Msg = WM_VSCROLL) &amp;&amp; Instance.ScrollV)
            Return Instance.Scroll(This, LP, Msg, HWND)
      }
   }
   ; ===================================================================================================================
   Scroll(WP, LP, Msg, HWND) {
      Static SB_LINEMINUS := 0, SB_LINEPLUS := 1, SB_PAGEMINUS := 2, SB_PAGEPLUS := 3, SB_THUMBTRACK := 5
      Static WM_HSCROLL := 0x0114, WM_VSCROLL := 0x0115
		Static i := 0
      If (LP &lt;&gt; 0)
         Return 
      SB := (Msg = WM_HSCROLL ? 0 : 1) ; SB_HORZ : SB_VERT
      SC := WP &amp; 0xFFFF
      SD := (Msg = WM_HSCROLL ? This.LineH : This.LineV)
      SI := 0
      If !This.GetScrollInfo(SB, SI)
         Return 
		PA := PN := NumGet(SI, 20, &quot;Int&quot;)
		
      If (SC = SB_LINEMINUS)
         PN := PA - SD
      Else If (SC = SB_LINEPLUS)
         PN := PA + SD
      Else If (SC = SB_PAGEMINUS)
         PN := PA - NumGet(SI, 16, &quot;UInt&quot;)
      Else If (SC = SB_PAGEPLUS)
         PN := PA + NumGet(SI, 16, &quot;UInt&quot;)
      Else If (SC = SB_THUMBTRACK)
         PN := NumGet(SI, 24, &quot;Int&quot;)
      If (PA = PN)
         Return 0
      This.SetScrollInfo(SB, {Pos: PN})
      This.GetScrollInfo(SB, SI)
      PN := NumGet(SI, 20, &quot;Int&quot;)
      If (SB = 0)
         This.PosH := PN
      Else
         This.PosV := PN 
      If (PA &lt;&gt; PN) { 
		If 0
         {
	         HS := VS := 0
	         If (Msg = WM_HSCROLL)
	            HS := PA - PN
	         Else
	            VS := PA - PN  
	         DllCall(&quot;User32.dll\ScrollWindow&quot;, &quot;Ptr&quot;, This.HWND, &quot;Int&quot;, HS, &quot;Int&quot;, VS, &quot;Ptr&quot;, 0, &quot;Ptr&quot;, 0)
			; SW_SCROLLCHILDREN := 0x1
			; SW_INVALIDATE := 0x2
			; SW_ERASE := 0x4
			; SW_SMOOTHSCROLL := 0x10
	        ; DllCall(&quot;User32.dll\ScrollWindowEx&quot;, &quot;Ptr&quot;, This.HWND, &quot;Int&quot;, HS, &quot;Int&quot;, VS, &quot;Ptr&quot;, 0, &quot;Ptr&quot;, 0, &quot;Ptr&quot;, 0, &quot;Ptr&quot;, 0, &quot;Int&quot;, 0x10)
         } 
		 Else 
         { 
			This.GetScrollInfo((Msg = WM_HSCROLL), SI)
			c := NumGet(SI, 20, &quot;Int&quot;)
	         If (Msg = WM_HSCROLL)
	            op := &quot;NA y&quot; -c &quot; x&quot; -PN
	         Else
	            op := &quot;NA x&quot; -c &quot; y&quot; -PN
			  Gui, % This.HGUI . &quot;:Show&quot;, % op
         }
      }
      Return 0
   }
   
   ; ===================================================================================================================
   On_WM_Wheel(LP, Msg, HWND) {
      Static MK_CONTROL := 0x0008
      Static MK_SHIFT := 0x0004
      Static WM_HSCROLL := 0x0114, WM_VSCROLL := 0x0115
      Static WM_MOUSEWHEEL := 0x020A, WM_MOUSEHWHEEL := 0x020E
      ; HWND := WinExist(&quot;A&quot;) 
      If ScrollGUI.Instances.HasKey(HWND) {
         Instance := Object(ScrollGUI.Instances[HWND])
         If (Instance.RequireCtrl &amp;&amp; (This &amp; MK_CONTROL)) || (!Instance.RequireCtrl &amp;&amp; !(This &amp; MK_CONTROL))
            If (Instance.WheelH &amp;&amp; (Msg = WM_MOUSEHWHEEL))
            || (Instance.WheelH &amp;&amp; ((Msg = WM_MOUSEWHEEL) &amp;&amp; Instance.UseShift &amp;&amp; (This &amp; MK_SHIFT)))
            || (Instance.WheelV &amp;&amp; (Msg = WM_MOUSEWHEEL))
               Return Instance.Wheel(This, LP, Msg, HWND)
      }
   }
   ; ===================================================================================================================
   Wheel(WP, LP, Msg, H) {
      Static MK_SHIFT := 0x0004
      Static SB_LINEMINUS := 0, SB_LINEPLUS := 1
      Static WM_MOUSEWHEEL := 0x020A, WM_MOUSEHWHEEL := 0x020E
      Static WM_HSCROLL := 0x0114, WM_VSCROLL := 0x0115
      If (Msg = WM_MOUSEWHEEL) &amp;&amp; (WP &amp; MK_SHIFT) &amp;&amp; This.UseShift
         Msg := WM_MOUSEHWHEEL
      MSG := (Msg = WM_MOUSEWHEEL ? WM_VSCROLL : WM_HSCROLL)
      SB := ((WP &gt;&gt; 16) &gt; 0x7FFF) || (WP &lt; 0) ? SB_LINEPLUS : SB_LINEMINUS
      Return This.Scroll(SB, 0, MSG, H)
   }
}

</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Sat, 04 Jul 2020 22:15:04 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140580#p140580</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: ScrollBar]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140579#p140579</link>
			<description><![CDATA[<p>Дело в обработке ненужных сообщений, когда скроллинг уже по факту осуществлён, продолжается их обработка. Не пойму как их отфильтровать в методе &quot;Scroll&quot;. Там есть проверка (PA &lt;&gt; PN), но она не помогает.</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Sat, 04 Jul 2020 21:28:15 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140579#p140579</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: ScrollBar]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140578#p140578</link>
			<description><![CDATA[<p>В примере всё из шапки правильно, они могут быть нулевыми.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sat, 04 Jul 2020 20:45:27 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140578#p140578</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: ScrollBar]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140577#p140577</link>
			<description><![CDATA[<p>Даже пример из шапки нормально тормозит.<br />Думаю проблема с ScrollWindow, может это как то связано с двумя последними параметрами, они не используются в примерах на AutoHotkey, в примечании msdn я не особо понял что к чему. <a href="https://docs.microsoft.com/en-us/windows/win32/api/winuser/nf-winuser-scrollwindow">https://docs.microsoft.com/en-us/window … rollwindow</a></p><p>Размер области прокрутки не влияет на производительность, я проверил.</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Sat, 04 Jul 2020 20:40:30 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140577#p140577</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: ScrollBar]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140576#p140576</link>
			<description><![CDATA[<p>Ну, или если нужно что-то вроде таблицы, тогда просто ActiveX с html использовать, там и со скроллингом особо заморачиваться не придётся.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sat, 04 Jul 2020 20:33:33 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140576#p140576</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: ScrollBar]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140575#p140575</link>
			<description><![CDATA[<p>Ну, можно просто окно управления с кнопками к таблице добавить.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Sat, 04 Jul 2020 20:31:59 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140575#p140575</guid>
		</item>
		<item>
			<title><![CDATA[Re: AHK: ScrollBar]]></title>
			<link>https://forum.script-coding.com/viewtopic.php?pid=140574#p140574</link>
			<description><![CDATA[<p>По моему критично. <br />Таблица ексель не айс, может тебе понадобится сделать таблицу со своими кнопками и.т.д.</p>]]></description>
			<author><![CDATA[null@example.com (serzh82saratov)]]></author>
			<pubDate>Sat, 04 Jul 2020 20:29:57 +0000</pubDate>
			<guid>https://forum.script-coding.com/viewtopic.php?pid=140574#p140574</guid>
		</item>
	</channel>
</rss>
