ListBox 滚动条如何重绘 ( 积分: 200 )

  • 主题发起人 主题发起人 小陵
  • 开始时间 开始时间

小陵

Unregistered / Unconfirmed
GUEST, unregistred user!
滚动条好像都是系统默认的样式,但这样程序发布的时候,如果是在2000或98下,滚动条就会很难看。有没有办法自定义滚动条的形状和颜色啊?<br><br>不考虑使用第三方控件,想知道自己做的话应该怎么样实现
 
[转]版权属于原作者!<br><br>unit&nbsp;SkinSB;<br><br>interface<br><br>uses<br>&nbsp;&nbsp;SysUtils,&nbsp;Classes,&nbsp;Windows,&nbsp;Messages,&nbsp;Graphics;<br><br>const<br>&nbsp;&nbsp;SKINSB_PROP&nbsp;=&nbsp;'{8BC6661E-5880-4353-878D-C3B3784CFC5F}';<br><br>type<br><br>&nbsp;&nbsp;TBarPosCode&nbsp;=&nbsp;(&nbsp;bpcNone,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcHArrowL,&nbsp;bpcHArrowR,&nbsp;bpcHPageL,&nbsp;bpcHPageR,&nbsp;bpcHThumb,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcVArrowU,&nbsp;bpcVArrowD,&nbsp;bpcVPageU,&nbsp;bpcVPageD,&nbsp;bpcVThumb,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcCross&nbsp;);<br><br>&nbsp;&nbsp;TWindowProc&nbsp;=&nbsp;function&nbsp;(hWnd:&nbsp;HWND;&nbsp;uMsg:&nbsp;UINT;&nbsp;wParam:&nbsp;WPARAM;&nbsp;lParam:&nbsp;LPARAM):&nbsp;LRESULT;&nbsp;stdcall;<br><br>&nbsp;&nbsp;PSkinSBInfo&nbsp;=&nbsp;^TSkinSBInfo;<br>&nbsp;&nbsp;TSkinSBInfo&nbsp;=&nbsp;packed&nbsp;record<br>&nbsp;&nbsp;&nbsp;&nbsp;OldWndProc:&nbsp;TWindowProc;<br>&nbsp;&nbsp;&nbsp;&nbsp;Prevent:&nbsp;Boolean;&nbsp;//&nbsp;prevent&nbsp;style&nbsp;change&nbsp;message<br>&nbsp;&nbsp;&nbsp;&nbsp;Scrolling:&nbsp;Boolean;<br>&nbsp;&nbsp;&nbsp;&nbsp;Style:&nbsp;Cardinal;&nbsp;//&nbsp;real&nbsp;style<br>&nbsp;&nbsp;&nbsp;&nbsp;ThumbTrack:&nbsp;Boolean;<br>&nbsp;&nbsp;&nbsp;&nbsp;ThumbPos:&nbsp;Integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;Tracking:&nbsp;Boolean;&nbsp;//&nbsp;tracking:&nbsp;click&nbsp;arrow&nbsp;or&nbsp;track&nbsp;thumb<br>&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;TSkinSB&nbsp;=&nbsp;class<br>&nbsp;&nbsp;protected<br>&nbsp;&nbsp;&nbsp;&nbsp;FBitmap:&nbsp;TBitmap;<br>&nbsp;&nbsp;&nbsp;&nbsp;constructor&nbsp;CreateInstance;<br>&nbsp;&nbsp;public<br>&nbsp;&nbsp;&nbsp;&nbsp;constructor&nbsp;Create;<br>&nbsp;&nbsp;&nbsp;&nbsp;destructor&nbsp;Destroy;&nbsp;override;<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;InitSkinSB(H:&nbsp;HWND);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;UnInitSkinSB(H:&nbsp;HWND);<br>&nbsp;&nbsp;&nbsp;&nbsp;procedure&nbsp;DrawElem(H:&nbsp;HWND;&nbsp;Code:&nbsp;TBarPosCode;&nbsp;R:&nbsp;TRect;&nbsp;Down:&nbsp;Boolean);<br>&nbsp;&nbsp;end;<br><br>function&nbsp;GetSkinSB:&nbsp;TSkinSB;<br><br>function&nbsp;SkinSBWndProc(hWnd:&nbsp;HWND;&nbsp;uMsg:&nbsp;UINT;&nbsp;wParam:&nbsp;WPARAM;&nbsp;lParam:&nbsp;LPARAM):&nbsp;LRESULT;&nbsp;stdcall;<br>function&nbsp;GetSkinSBInfo(hWnd:&nbsp;HWND):&nbsp;PSkinSBInfo;<br><br>implementation<br><br>uses<br>&nbsp;&nbsp;CommCtrl;<br><br>{$R&nbsp;*.res}&nbsp;&nbsp;<br><br>var<br>&nbsp;&nbsp;l_SkinSB:&nbsp;TSkinSB;<br>&nbsp;&nbsp;l_SkinSB_Prop:&nbsp;TATOM;<br><br>type<br>&nbsp;&nbsp;PImageImportDescriptor&nbsp;=&nbsp;^TImageImportDescriptor;<br>&nbsp;&nbsp;TImageImportDescriptor&nbsp;=&nbsp;packed&nbsp;record<br>&nbsp;&nbsp;&nbsp;&nbsp;originalFirstThunk:&nbsp;DWORD;&nbsp;&nbsp;//&nbsp;or&nbsp;Characteristics:&nbsp;DWORD<br>&nbsp;&nbsp;&nbsp;&nbsp;TimeDateStamp:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;ForwarderChain:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;Name:&nbsp;DWORD;<br>&nbsp;&nbsp;&nbsp;&nbsp;FirstThunk:&nbsp;DWORD;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;PImageChunkData&nbsp;=&nbsp;^TImageChunkData;<br>&nbsp;&nbsp;TImageChunkData&nbsp;=&nbsp;packed&nbsp;record<br>&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;Integer&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0:&nbsp;(&nbsp;ForwarderString:&nbsp;DWORD&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1:&nbsp;(&nbsp;Func:&nbsp;DWORD&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2:&nbsp;(&nbsp;ordinal:&nbsp;DWORD&nbsp;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3:&nbsp;(&nbsp;AddressOfData:&nbsp;DWORD&nbsp;);<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;PImageImportByName&nbsp;=&nbsp;^TImageImportByName;<br>&nbsp;&nbsp;TImageImportByName&nbsp;=&nbsp;packed&nbsp;record<br>&nbsp;&nbsp;&nbsp;&nbsp;Hint:&nbsp;Word;<br>&nbsp;&nbsp;&nbsp;&nbsp;Name:&nbsp;array[0..0]&nbsp;of&nbsp;Byte;<br>&nbsp;&nbsp;end;<br><br>type<br>&nbsp;&nbsp;PHookRec&nbsp;=&nbsp;^THookRec;<br>&nbsp;&nbsp;THookRec&nbsp;=&nbsp;packed&nbsp;record<br>&nbsp;&nbsp;&nbsp;&nbsp;OldFunc:&nbsp;Pointer;<br>&nbsp;&nbsp;&nbsp;&nbsp;NewFunc:&nbsp;Pointer;<br>&nbsp;&nbsp;end;<br><br>var<br>&nbsp;&nbsp;_HookGetScrollInfo:&nbsp;THookRec;&nbsp;&nbsp;<br><br>procedure&nbsp;HookApiInMod(ImageBase:&nbsp;Cardinal;&nbsp;ApiName:&nbsp;PChar;&nbsp;PHook:&nbsp;PHookRec);<br>var<br>&nbsp;&nbsp;pidh:&nbsp;PImageDosHeader;<br>&nbsp;&nbsp;pinh:&nbsp;PImageNtHeaders;<br>&nbsp;&nbsp;pSymbolTable:&nbsp;PIMAGEDATADIRECTORY;<br>&nbsp;&nbsp;piid:&nbsp;PIMAGEIMPORTDESCRIPTOR;<br>&nbsp;&nbsp;pitd_org,&nbsp;pitd_1st:&nbsp;PImageChunkData;<br>&nbsp;&nbsp;piibn:&nbsp;PImageImportByName;<br>&nbsp;&nbsp;pAPIFunction:&nbsp;Pointer;<br>&nbsp;&nbsp;written,&nbsp;oldAccess:&nbsp;DWORD;<br>begin<br>&nbsp;&nbsp;if&nbsp;ImageBase&nbsp;=&nbsp;0&nbsp;then&nbsp;Exit;<br>&nbsp;&nbsp;pidh&nbsp;:=&nbsp;PImageDosHeader(ImageBase);<br>&nbsp;&nbsp;pinh&nbsp;:=&nbsp;PImageNtHeaders(DWORD(ImageBase)&nbsp;+&nbsp;Cardinal(pidh^._lfanew));<br>&nbsp;&nbsp;pSymbolTable&nbsp;:=&nbsp;@pinh^.OptionalHeader.DataDirectory[1];<br>&nbsp;&nbsp;piid&nbsp;:=&nbsp;PImageImportDescriptor(DWORD(ImageBase)&nbsp;+&nbsp;pSymbolTable^.VirtualAddress);<br>&nbsp;&nbsp;repeat<br>&nbsp;&nbsp;&nbsp;&nbsp;pitd_org&nbsp;:=&nbsp;PImageChunkData(DWORD(ImageBase)&nbsp;+&nbsp;piid^.OriginalFirstThunk);<br>&nbsp;&nbsp;&nbsp;&nbsp;pitd_1st&nbsp;:=&nbsp;PImageChunkData(DWORD(ImageBase)&nbsp;+&nbsp;piid^.FirstThunk);<br>&nbsp;&nbsp;&nbsp;&nbsp;repeat<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;piibn&nbsp;:=&nbsp;PImageImportByName(DWORD(ImageBase)&nbsp;+&nbsp;LPDWORD(pitd_org)^);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pAPIFunction&nbsp;:=&nbsp;Pointer(pitd_1st^.Func);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;StrComp(ApiName,&nbsp;@piibn^.Name)&nbsp;=&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PHook^.OldFunc&nbsp;:=&nbsp;pAPIFunction;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VirtualProtect(@(pitd_1st^.Func),&nbsp;SizeOf(DWORD),&nbsp;PAGE_WRITECOPY,&nbsp;oldAccess);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WriteProcessMemory(GetCurrentProcess(),&nbsp;@(pitd_1st^.Func),&nbsp;@PHook^.NewFunc,&nbsp;SizeOf(DWORD),&nbsp;written);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;VirtualProtect(@(pitd_1st^.Func),&nbsp;SizeOf(DWORD),&nbsp;oldAccess,&nbsp;oldAccess);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inc(pitd_org);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Inc(pitd_1st);<br>&nbsp;&nbsp;&nbsp;&nbsp;until&nbsp;pitd_1st^.Func&nbsp;=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;Inc(piid);<br>&nbsp;&nbsp;until&nbsp;piid^.FirstThunk&nbsp;+&nbsp;piid^.OriginalFirstThunk&nbsp;+&nbsp;piid^.ForwarderChain&nbsp;+&nbsp;piid^.Name&nbsp;=&nbsp;0;<br>end;<br><br>function&nbsp;GetSkinSBInfo(hWnd:&nbsp;HWND):&nbsp;PSkinSBInfo;<br>begin<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;PSkinSBInfo(&nbsp;GetProp(hWnd,&nbsp;MAKEINTATOM(l_SkinSB_Prop))&nbsp;);<br>end;<br><br>function&nbsp;GetSkinSB:&nbsp;TSkinSB;<br>begin<br>&nbsp;&nbsp;if&nbsp;l_SkinSB&nbsp;=&nbsp;nil&nbsp;then&nbsp;l_SkinSB&nbsp;:=&nbsp;TSkinSB.CreateInstance;<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;l_SkinSB;<br>end;<br><br>function&nbsp;CalcScrollBarRect(H:&nbsp;HWND;&nbsp;nBarCode:&nbsp;Cardinal):&nbsp;TRect;<br>var<br>&nbsp;&nbsp;Style,&nbsp;ExStyle:&nbsp;Cardinal;<br>begin<br>&nbsp;&nbsp;SetRect(Result,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;0);<br>&nbsp;&nbsp;Style&nbsp;:=&nbsp;GetWindowLong(H,&nbsp;GWL_STYLE);<br>&nbsp;&nbsp;ExStyle&nbsp;:=&nbsp;GetWindowLong(H,&nbsp;GWL_EXSTYLE);<br>&nbsp;&nbsp;if&nbsp;(nBarCode&nbsp;=&nbsp;SB_HORZ)&nbsp;and&nbsp;((Style&nbsp;and&nbsp;WS_HSCROLL)&nbsp;=&nbsp;0)&nbsp;then&nbsp;Exit;<br>&nbsp;&nbsp;if&nbsp;(nBarCode&nbsp;=&nbsp;SB_VERT)&nbsp;and&nbsp;((Style&nbsp;and&nbsp;WS_VSCROLL)&nbsp;=&nbsp;0)&nbsp;then&nbsp;Exit;<br>&nbsp;&nbsp;GetWindowRect(H,&nbsp;Result);<br>&nbsp;&nbsp;OffsetRect(Result,&nbsp;-Result.Left,&nbsp;-Result.Top);<br>&nbsp;&nbsp;if&nbsp;((ExStyle&nbsp;and&nbsp;WS_EX_DLGMODALFRAME)&nbsp;&lt;&gt;&nbsp;0)<br>&nbsp;&nbsp;&nbsp;&nbsp;or&nbsp;((ExStyle&nbsp;and&nbsp;WS_EX_CLIENTEDGE)&nbsp;&lt;&gt;&nbsp;0)&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;InflateRect(Result,&nbsp;-GetSystemMetrics(SM_CXEDGE),&nbsp;-GetSystemMetrics(SM_CYEDGE));<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;//&nbsp;special:&nbsp;returns&nbsp;the&nbsp;cross<br>&nbsp;&nbsp;if&nbsp;nBarCode&nbsp;=&nbsp;SB_BOTH&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((Style&nbsp;and&nbsp;WS_HSCROLL)&nbsp;=&nbsp;0)&nbsp;or&nbsp;((Style&nbsp;and&nbsp;WS_VSCROLL)&nbsp;=&nbsp;0)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetRect(Result,&nbsp;0,&nbsp;0,&nbsp;0,&nbsp;0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;Result.Top&nbsp;:=&nbsp;Result.Bottom&nbsp;-&nbsp;GetSystemMetrics(SM_CYVSCROLL);<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ExStyle&nbsp;and&nbsp;WS_EX_LEFTSCROLLBAR)&nbsp;&lt;&gt;&nbsp;0&nbsp;then&nbsp;Result.Right&nbsp;:=&nbsp;Result.Left&nbsp;+&nbsp;GetSystemMetrics(SM_CXHSCROLL)<br>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;Result.Left&nbsp;:=&nbsp;Result.Right&nbsp;-&nbsp;GetSystemMetrics(SM_CXHSCROLL);<br>&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;if&nbsp;nBarCode&nbsp;=&nbsp;SB_HORZ&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;//&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ExStyle&nbsp;and&nbsp;WS_EX_TOPSCROLLBAR)&nbsp;&lt;&gt;&nbsp;0&nbsp;then&nbsp;Result.Bottom&nbsp;:=&nbsp;Result.Top&nbsp;+&nbsp;GetSystemMetrics(SM_CYVSCROLL)<br>&nbsp;&nbsp;&nbsp;&nbsp;Result.Top&nbsp;:=&nbsp;Result.Bottom&nbsp;-&nbsp;GetSystemMetrics(SM_CYVSCROLL);<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((Style&nbsp;and&nbsp;WS_VSCROLL)&nbsp;&lt;&gt;&nbsp;0)&nbsp;then&nbsp;Dec(Result.Right,&nbsp;GetSystemMetrics(SM_CYVSCROLL));<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;if&nbsp;nBarCode&nbsp;=&nbsp;SB_VERT&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ExStyle&nbsp;and&nbsp;WS_EX_LEFTSCROLLBAR)&nbsp;&lt;&gt;&nbsp;0&nbsp;then&nbsp;Result.Right&nbsp;:=&nbsp;Result.Left&nbsp;+&nbsp;GetSystemMetrics(SM_CXHSCROLL)<br>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;Result.Left&nbsp;:=&nbsp;Result.Right&nbsp;-&nbsp;GetSystemMetrics(SM_CXHSCROLL);<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;((Style&nbsp;and&nbsp;WS_HSCROLL)&nbsp;&lt;&gt;&nbsp;0)&nbsp;then&nbsp;Dec(Result.Bottom,&nbsp;GetSystemMetrics(SM_CXHSCROLL));<br>&nbsp;&nbsp;end;<br>end;<br><br>type<br>&nbsp;&nbsp;TBarElem&nbsp;=&nbsp;(beArrow1,&nbsp;beBG,&nbsp;beThumb,&nbsp;beArrow2);<br>&nbsp;&nbsp;TBarElemRects&nbsp;=&nbsp;array[TBarElem]&nbsp;of&nbsp;TRect;<br><br>function&nbsp;CalcBarElemRects(hWnd:&nbsp;HWND;&nbsp;nBarCode:&nbsp;Integer):&nbsp;TBarElemRects;<br>var<br>&nbsp;&nbsp;R:&nbsp;TRect;<br>&nbsp;&nbsp;SI:&nbsp;TScrollInfo;<br>&nbsp;&nbsp;ThumbSize:&nbsp;Integer;<br>&nbsp;&nbsp;X,&nbsp;L,&nbsp;H,&nbsp;BlockH,&nbsp;BlockV:&nbsp;Integer;<br>begin<br>&nbsp;&nbsp;R&nbsp;:=&nbsp;CalcScrollBarRect(hWnd,&nbsp;nBarCode);<br>&nbsp;&nbsp;SI.cbSize&nbsp;:=&nbsp;SizeOf(SI);<br>&nbsp;&nbsp;SI.fMask&nbsp;:=&nbsp;SIF_ALL;<br>&nbsp;&nbsp;GetScrollInfo(hWnd,&nbsp;nBarCode,&nbsp;SI);<br>&nbsp;&nbsp;Result[beArrow1]&nbsp;:=&nbsp;R;<br>&nbsp;&nbsp;Result[beArrow2]&nbsp;:=&nbsp;R;<br>&nbsp;&nbsp;Result[beBG]&nbsp;:=&nbsp;R;<br>&nbsp;&nbsp;Result[beThumb]&nbsp;:=&nbsp;R;<br>&nbsp;&nbsp;if&nbsp;nBarCode&nbsp;=&nbsp;SB_VERT&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;BlockV&nbsp;:=&nbsp;GetSystemMetrics(SM_CYVSCROLL);<br>&nbsp;&nbsp;&nbsp;&nbsp;L&nbsp;:=&nbsp;Result[beArrow1].Top&nbsp;+&nbsp;BlockV;<br>&nbsp;&nbsp;&nbsp;&nbsp;H&nbsp;:=&nbsp;Result[beArrow2].Bottom&nbsp;-&nbsp;BlockV;<br>&nbsp;&nbsp;&nbsp;&nbsp;Result[beArrow1].Bottom&nbsp;:=&nbsp;L;<br>&nbsp;&nbsp;&nbsp;&nbsp;Result[beArrow2].Top&nbsp;:=&nbsp;H;<br>//&nbsp;&nbsp;&nbsp;&nbsp;Inc(L);<br>//&nbsp;&nbsp;&nbsp;&nbsp;Dec(H);<br>&nbsp;&nbsp;&nbsp;&nbsp;Result[beBG].Top&nbsp;:=&nbsp;L;<br>&nbsp;&nbsp;&nbsp;&nbsp;Result[beBG].Bottom&nbsp;:=&nbsp;H;<br>&nbsp;&nbsp;end<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;BlockH&nbsp;:=&nbsp;GetSystemMetrics(SM_CXHSCROLL);<br>&nbsp;&nbsp;&nbsp;&nbsp;L&nbsp;:=&nbsp;Result[beArrow1].Left&nbsp;+&nbsp;BlockH;<br>&nbsp;&nbsp;&nbsp;&nbsp;H&nbsp;:=&nbsp;Result[beArrow2].Right&nbsp;-&nbsp;BlockH;<br>&nbsp;&nbsp;&nbsp;&nbsp;Result[beArrow1].Right&nbsp;:=&nbsp;L;<br>&nbsp;&nbsp;&nbsp;&nbsp;Result[beArrow2].Left&nbsp;:=&nbsp;H;<br>//&nbsp;&nbsp;&nbsp;&nbsp;Inc(L);<br>//&nbsp;&nbsp;&nbsp;&nbsp;Dec(H);<br>&nbsp;&nbsp;&nbsp;&nbsp;Result[beBG].Left&nbsp;:=&nbsp;L;<br>&nbsp;&nbsp;&nbsp;&nbsp;Result[beBG].Right&nbsp;:=&nbsp;H;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;if&nbsp;SI.nMax&nbsp;-&nbsp;SI.nMin&nbsp;-&nbsp;Integer(SI.nPage)&nbsp;+&nbsp;1&nbsp;&lt;=&nbsp;0&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;max&nbsp;thumb,&nbsp;no&nbsp;thumb<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;nBarCode&nbsp;=&nbsp;SB_VERT&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result[beThumb].Top&nbsp;:=&nbsp;L;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result[beThumb].Bottom&nbsp;:=&nbsp;H;<br>&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result[beThumb].Left&nbsp;:=&nbsp;L;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result[beThumb].Right&nbsp;:=&nbsp;H;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;ThumbSize&nbsp;:=&nbsp;MulDiv(H&nbsp;-&nbsp;L,&nbsp;SI.nPage,&nbsp;SI.nMax&nbsp;-&nbsp;SI.nMin&nbsp;+&nbsp;1);<br>&nbsp;&nbsp;X&nbsp;:=&nbsp;L&nbsp;+&nbsp;MulDiv(SI.nTrackPos,&nbsp;H&nbsp;-&nbsp;ThumbSize&nbsp;-&nbsp;L,&nbsp;SI.nMax&nbsp;-&nbsp;Integer(SI.nPage)&nbsp;-&nbsp;SI.nMin&nbsp;+&nbsp;1);<br>&nbsp;&nbsp;if&nbsp;nBarCode&nbsp;=&nbsp;SB_VERT&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;Result[beThumb].Top&nbsp;:=&nbsp;X;<br>&nbsp;&nbsp;&nbsp;&nbsp;Result[beThumb].Bottom&nbsp;:=&nbsp;X&nbsp;+&nbsp;ThumbSize;<br>&nbsp;&nbsp;end<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;Result[beThumb].Left&nbsp;:=&nbsp;X;<br>&nbsp;&nbsp;&nbsp;&nbsp;Result[beThumb].Right&nbsp;:=&nbsp;X&nbsp;+&nbsp;ThumbSize;<br>&nbsp;&nbsp;end;<br>end;<br><br>function&nbsp;GetPtBarPos(H:&nbsp;HWND;&nbsp;Pt:&nbsp;TPoint):&nbsp;TBarPosCode;<br>var<br>&nbsp;&nbsp;R:&nbsp;TRect;<br>&nbsp;&nbsp;BR:&nbsp;TBarElemRects;<br>begin<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;bpcNone;<br>&nbsp;&nbsp;R&nbsp;:=&nbsp;CalcScrollBarRect(H,&nbsp;SB_HORZ);<br>&nbsp;&nbsp;InflateRect(R,&nbsp;GetSystemMetrics(SM_CXEDGE),&nbsp;GetSystemMetrics(SM_CYEDGE));<br>&nbsp;&nbsp;if&nbsp;PtInRect(R,&nbsp;Pt)&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;BR&nbsp;:=&nbsp;CalcBarElemRects(H,&nbsp;SB_HORZ);<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;PtInRect(BR[beArrow1],&nbsp;Pt)&nbsp;then&nbsp;Result&nbsp;:=&nbsp;bpcHArrowL<br>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;PtInRect(BR[beThumb],&nbsp;Pt)&nbsp;then&nbsp;Result&nbsp;:=&nbsp;bpcHThumb<br>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;PtInRect(BR[beArrow2],&nbsp;Pt)&nbsp;then&nbsp;Result&nbsp;:=&nbsp;bpcHArrowR<br>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;Pt.X&nbsp;&lt;&nbsp;BR[beThumb].Left&nbsp;then&nbsp;Result&nbsp;:=&nbsp;bpcHPageL<br>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;Result&nbsp;:=&nbsp;bpcHPageR;<br>&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;R&nbsp;:=&nbsp;CalcScrollBarRect(H,&nbsp;SB_VERT);<br>&nbsp;&nbsp;InflateRect(R,&nbsp;GetSystemMetrics(SM_CXEDGE),&nbsp;GetSystemMetrics(SM_CYEDGE));&nbsp;&nbsp;<br>&nbsp;&nbsp;if&nbsp;PtInRect(R,&nbsp;Pt)&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;BR&nbsp;:=&nbsp;CalcBarElemRects(H,&nbsp;SB_VERT);<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;PtInRect(BR[beArrow1],&nbsp;Pt)&nbsp;then&nbsp;Result&nbsp;:=&nbsp;bpcVArrowU<br>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;PtInRect(BR[beThumb],&nbsp;Pt)&nbsp;then&nbsp;Result&nbsp;:=&nbsp;bpcVThumb<br>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;PtInRect(BR[beArrow2],&nbsp;Pt)&nbsp;then&nbsp;Result&nbsp;:=&nbsp;bpcVArrowD<br>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;Pt.Y&nbsp;&lt;&nbsp;BR[beThumb].Top&nbsp;then&nbsp;Result&nbsp;:=&nbsp;bpcVPageU<br>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;Result&nbsp;:=&nbsp;bpcVPageD;<br>&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;end;<br>end;<br><br>type<br>&nbsp;&nbsp;TGetScrollInfoFunc&nbsp;=&nbsp;function&nbsp;(H:&nbsp;HWND;&nbsp;Code:&nbsp;Integer;&nbsp;var&nbsp;SI:&nbsp;TScrollInfo):&nbsp;Boolean;&nbsp;stdcall;<br><br>function&nbsp;_SkinSB_GetScrollInfo(H:&nbsp;HWND;&nbsp;Code:&nbsp;Integer;&nbsp;var&nbsp;SI:&nbsp;TScrollInfo):&nbsp;Boolean;&nbsp;stdcall;<br>var<br>&nbsp;&nbsp;P:&nbsp;PSkinSBInfo;<br>begin<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;TGetScrollInfoFunc(_HookGetScrollInfo.OldFunc)(H,&nbsp;Code,&nbsp;SI);<br>&nbsp;&nbsp;P&nbsp;:=&nbsp;GetSkinSBInfo(H);<br>&nbsp;&nbsp;if&nbsp;(P&nbsp;&lt;&gt;&nbsp;nil)&nbsp;and&nbsp;P^.ThumbTrack&nbsp;and&nbsp;((SI.fMask&nbsp;and&nbsp;SIF_TRACKPOS)&nbsp;&lt;&gt;&nbsp;0)&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;SI.nTrackPos&nbsp;:=&nbsp;P^.ThumbPos;<br>&nbsp;&nbsp;end;<br>end;<br><br>{&nbsp;TSkinSB&nbsp;}<br><br>constructor&nbsp;TSkinSB.Create;<br>begin<br>&nbsp;&nbsp;raise&nbsp;Exception.Create('use&nbsp;GetSkinSB.');<br>end;<br><br>constructor&nbsp;TSkinSB.CreateInstance;<br>begin<br>&nbsp;&nbsp;inherited;<br>&nbsp;&nbsp;_HookGetScrollInfo.OldFunc&nbsp;:=&nbsp;nil;<br>&nbsp;&nbsp;_HookGetScrollInfo.NewFunc&nbsp;:=&nbsp;@_SkinSB_GetScrollInfo;<br>&nbsp;&nbsp;HookApiInMod(&nbsp;GetModuleHandle('comctl32.dll'),&nbsp;'GetScrollInfo',&nbsp;@_HookGetScrollInfo&nbsp;);<br>&nbsp;&nbsp;FBitmap&nbsp;:=&nbsp;TBitmap.Create;<br>&nbsp;&nbsp;FBitmap.LoadFromResourceName(hInstance,&nbsp;'scrollbar');<br>end;<br><br>destructor&nbsp;TSkinSB.Destroy;<br>begin<br>&nbsp;&nbsp;FreeAndNil(FBitmap);<br>&nbsp;&nbsp;inherited;<br>end;<br><br>procedure&nbsp;TSkinSB.DrawElem(H:&nbsp;HWND;&nbsp;Code:&nbsp;TBarPosCode;&nbsp;R:&nbsp;TRect;<br>&nbsp;&nbsp;Down:&nbsp;Boolean);<br>var<br>&nbsp;&nbsp;Canvas:&nbsp;TCanvas;<br>begin<br>&nbsp;&nbsp;Canvas&nbsp;:=&nbsp;TCanvas.Create;<br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;Canvas.Handle&nbsp;:=&nbsp;GetWindowDC(H);<br>&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;Code&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcHArrowL:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Down&nbsp;then&nbsp;BitBlt(Canvas.Handle,&nbsp;R.Left,&nbsp;R.Top,&nbsp;16,&nbsp;16,&nbsp;FBitmap.Canvas.Handle,&nbsp;64,&nbsp;0,&nbsp;SRCCOPY)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;BitBlt(Canvas.Handle,&nbsp;R.Left,&nbsp;R.Top,&nbsp;16,&nbsp;16,&nbsp;FBitmap.Canvas.Handle,&nbsp;0,&nbsp;0,&nbsp;SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcHArrowR:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Down&nbsp;then&nbsp;BitBlt(Canvas.Handle,&nbsp;R.Left,&nbsp;R.Top,&nbsp;16,&nbsp;16,&nbsp;FBitmap.Canvas.Handle,&nbsp;80,&nbsp;0,&nbsp;SRCCOPY)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;BitBlt(Canvas.Handle,&nbsp;R.Left,&nbsp;R.Top,&nbsp;16,&nbsp;16,&nbsp;FBitmap.Canvas.Handle,&nbsp;16,&nbsp;0,&nbsp;SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcHThumb:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BitBlt(Canvas.Handle,&nbsp;R.Left,&nbsp;R.Top,&nbsp;2,&nbsp;16,&nbsp;FBitmap.Canvas.Handle,&nbsp;128,&nbsp;0,&nbsp;SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BitBlt(Canvas.Handle,&nbsp;R.Right&nbsp;-&nbsp;2,&nbsp;R.Top,&nbsp;2,&nbsp;16,&nbsp;FBitmap.Canvas.Handle,&nbsp;142,&nbsp;0,&nbsp;SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StretchBlt(Canvas.Handle,&nbsp;R.Left&nbsp;+&nbsp;2,&nbsp;R.Top,&nbsp;R.Right&nbsp;-&nbsp;R.Left&nbsp;-&nbsp;4,&nbsp;16,&nbsp;FBitmap.Canvas.Handle,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;130,&nbsp;0,&nbsp;12,&nbsp;16,&nbsp;SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcHPageL,&nbsp;bpcHPageR:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;R.Right&nbsp;-&nbsp;R.Left&nbsp;&lt;&nbsp;4&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StretchBlt(Canvas.Handle,&nbsp;R.Left,&nbsp;R.Top,&nbsp;R.Right&nbsp;-&nbsp;R.Left,&nbsp;16,&nbsp;FBitmap.Canvas.Handle,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;160,&nbsp;0,&nbsp;16,&nbsp;16,&nbsp;SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BitBlt(Canvas.Handle,&nbsp;R.Left,&nbsp;R.Top,&nbsp;2,&nbsp;16,&nbsp;FBitmap.Canvas.Handle,&nbsp;160,&nbsp;0,&nbsp;SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BitBlt(Canvas.Handle,&nbsp;R.Right&nbsp;-&nbsp;2,&nbsp;R.Top,&nbsp;2,&nbsp;16,&nbsp;FBitmap.Canvas.Handle,&nbsp;174,&nbsp;0,&nbsp;SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StretchBlt(Canvas.Handle,&nbsp;R.Left&nbsp;+&nbsp;2,&nbsp;R.Top,&nbsp;R.Right&nbsp;-&nbsp;R.Left&nbsp;-&nbsp;4,&nbsp;16,&nbsp;FBitmap.Canvas.Handle,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;162,&nbsp;0,&nbsp;12,&nbsp;16,&nbsp;SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcVArrowU:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Down&nbsp;then&nbsp;BitBlt(Canvas.Handle,&nbsp;R.Left,&nbsp;R.Top,&nbsp;16,&nbsp;16,&nbsp;FBitmap.Canvas.Handle,&nbsp;96,&nbsp;0,&nbsp;SRCCOPY)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;BitBlt(Canvas.Handle,&nbsp;R.Left,&nbsp;R.Top,&nbsp;16,&nbsp;16,&nbsp;FBitmap.Canvas.Handle,&nbsp;32,&nbsp;0,&nbsp;SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcVArrowD:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Down&nbsp;then&nbsp;BitBlt(Canvas.Handle,&nbsp;R.Left,&nbsp;R.Top,&nbsp;16,&nbsp;16,&nbsp;FBitmap.Canvas.Handle,&nbsp;112,&nbsp;0,&nbsp;SRCCOPY)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;BitBlt(Canvas.Handle,&nbsp;R.Left,&nbsp;R.Top,&nbsp;16,&nbsp;16,&nbsp;FBitmap.Canvas.Handle,&nbsp;48,&nbsp;0,&nbsp;SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcVThumb:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BitBlt(Canvas.Handle,&nbsp;R.Left,&nbsp;R.Top,&nbsp;16,&nbsp;2,&nbsp;FBitmap.Canvas.Handle,&nbsp;144,&nbsp;0,&nbsp;SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BitBlt(Canvas.Handle,&nbsp;R.Left,&nbsp;R.Bottom&nbsp;-&nbsp;2,&nbsp;16,&nbsp;2,&nbsp;FBitmap.Canvas.Handle,&nbsp;144,&nbsp;14,&nbsp;SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StretchBlt(Canvas.Handle,&nbsp;R.Left,&nbsp;R.Top&nbsp;+&nbsp;2,&nbsp;16,&nbsp;R.Bottom&nbsp;-&nbsp;R.Top&nbsp;-&nbsp;4,&nbsp;FBitmap.Canvas.Handle,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;144,&nbsp;2,&nbsp;16,&nbsp;12,&nbsp;SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcVPageU,&nbsp;bpcVPageD:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;R.Bottom&nbsp;-&nbsp;R.Top&nbsp;&lt;&nbsp;4&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StretchBlt(Canvas.Handle,&nbsp;R.Left,&nbsp;R.Top,&nbsp;16,&nbsp;R.Bottom&nbsp;-&nbsp;R.Top,&nbsp;FBitmap.Canvas.Handle,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;176,&nbsp;0,&nbsp;16,&nbsp;16,&nbsp;SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BitBlt(Canvas.Handle,&nbsp;R.Left,&nbsp;R.Top,&nbsp;16,&nbsp;2,&nbsp;FBitmap.Canvas.Handle,&nbsp;176,&nbsp;0,&nbsp;SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BitBlt(Canvas.Handle,&nbsp;R.Left,&nbsp;R.Bottom&nbsp;-&nbsp;2,&nbsp;16,&nbsp;2,&nbsp;FBitmap.Canvas.Handle,&nbsp;176,&nbsp;14,&nbsp;SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StretchBlt(Canvas.Handle,&nbsp;R.Left,&nbsp;R.Top&nbsp;+&nbsp;2,&nbsp;16,&nbsp;R.Bottom&nbsp;-&nbsp;R.Top&nbsp;-&nbsp;4,&nbsp;FBitmap.Canvas.Handle,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;176,&nbsp;2,&nbsp;16,&nbsp;12,&nbsp;SRCCOPY);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Canvas.Pen.Color&nbsp;:=&nbsp;clBlack;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Canvas.Brush.Color&nbsp;:=&nbsp;clWhite;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Canvas.Rectangle(R);<br>&nbsp;&nbsp;&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ReleaseDC(H,&nbsp;Canvas.Handle);<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;Canvas.Handle&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;FreeAndNil(Canvas);<br>&nbsp;&nbsp;end;<br>end;<br><br>procedure&nbsp;TSkinSB.InitSkinSB(H:&nbsp;HWND);<br>var<br>&nbsp;&nbsp;PInfo:&nbsp;PSkinSBInfo;<br>begin<br>&nbsp;&nbsp;PInfo&nbsp;:=&nbsp;GetSkinSBInfo(H);<br>&nbsp;&nbsp;if&nbsp;PInfo&nbsp;&lt;&gt;&nbsp;nil&nbsp;then&nbsp;Exit;&nbsp;//&nbsp;already&nbsp;inited<br>&nbsp;&nbsp;New(PInfo);<br>&nbsp;&nbsp;PInfo^.OldWndProc&nbsp;:=&nbsp;TWindowProc(GetWindowLong(H,&nbsp;GWL_WNDPROC));<br>&nbsp;&nbsp;PInfo^.Style&nbsp;:=&nbsp;GetWindowLong(H,&nbsp;GWL_STYLE);<br>&nbsp;&nbsp;PInfo^.Prevent&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;PInfo^.Scrolling&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;PInfo^.ThumbTrack&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;SetWindowLong(H,&nbsp;GWL_WNDPROC,&nbsp;Cardinal(@SkinSBWndProc));<br>&nbsp;&nbsp;SetProp(H,&nbsp;MAKEINTATOM(l_SkinSB_Prop),&nbsp;Cardinal(PInfo));<br>end;<br><br>procedure&nbsp;TSkinSB.UnInitSkinSB(H:&nbsp;HWND);<br>var<br>&nbsp;&nbsp;PInfo:&nbsp;PSkinSBInfo;<br>begin<br>&nbsp;&nbsp;PInfo&nbsp;:=&nbsp;GetSkinSBInfo(H);<br>&nbsp;&nbsp;if&nbsp;PInfo&nbsp;=&nbsp;nil&nbsp;then&nbsp;Exit;&nbsp;//&nbsp;not&nbsp;inited<br>&nbsp;&nbsp;RemoveProp(H,&nbsp;MAKEINTATOM(l_SkinSB_Prop));<br>&nbsp;&nbsp;SetWindowLong(H,&nbsp;GWL_WNDPROC,&nbsp;Cardinal(@PInfo^.OldWndProc));<br>&nbsp;&nbsp;Dispose(PInfo);<br>end;<br><br>const<br>&nbsp;&nbsp;WM_REPEAT_CLICK&nbsp;=&nbsp;WM_USER&nbsp;+&nbsp;$6478;<br><br>procedure&nbsp;OnRepeatClickTimer(hWnd:&nbsp;HWND;&nbsp;uMsg:&nbsp;UINT;&nbsp;idEvent:&nbsp;UINT;&nbsp;dwTime:&nbsp;DWORD);&nbsp;stdcall;<br>begin<br>&nbsp;&nbsp;KillTimer(0,&nbsp;idEvent);<br>&nbsp;&nbsp;PostThreadMessage(MainThreadID,&nbsp;WM_REPEAT_CLICK,&nbsp;0,&nbsp;0);<br>end;<br><br>procedure&nbsp;RedrawScrollBars(hWnd:&nbsp;HWND);<br>var<br>&nbsp;&nbsp;RHBar,&nbsp;RVBar,&nbsp;RCross:&nbsp;TRect;<br>&nbsp;&nbsp;BR:&nbsp;TBarElemRects;<br>begin<br>&nbsp;&nbsp;RHBar&nbsp;:=&nbsp;CalcScrollBarRect(hWnd,&nbsp;SB_HORZ);<br>&nbsp;&nbsp;if&nbsp;not&nbsp;IsRectEmpty(RHBar)&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;BR&nbsp;:=&nbsp;CalcBarElemRects(hWnd,&nbsp;SB_HORZ);<br>&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcHPageL,&nbsp;Rect(BR[beBG].Left,&nbsp;BR[beBG].Top,&nbsp;BR[beThumb].Left,&nbsp;BR[beBG].Bottom),&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcHPageR,&nbsp;Rect(BR[beThumb].Right,&nbsp;BR[beBG].Top,&nbsp;BR[beBG].Right,&nbsp;BR[beBG].Bottom),&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcHThumb,&nbsp;BR[beThumb],&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcHArrowL,&nbsp;BR[beArrow1],&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcHArrowR,&nbsp;BR[beArrow2],&nbsp;False);<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;RVBar&nbsp;:=&nbsp;CalcScrollBarRect(hWnd,&nbsp;SB_VERT);<br>&nbsp;&nbsp;if&nbsp;not&nbsp;IsRectEmpty(RVBar)&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;BR&nbsp;:=&nbsp;CalcBarElemRects(hWnd,&nbsp;SB_VERT);<br>&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcVPageU,&nbsp;Rect(BR[beBG].Left,&nbsp;BR[beBG].Top,&nbsp;BR[beBG].Right,&nbsp;BR[beThumb].Top),&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcVPageD,&nbsp;Rect(BR[beBG].Left,&nbsp;BR[beThumb].Bottom,&nbsp;BR[beBG].Right,&nbsp;BR[beBG].Bottom),&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcVThumb,&nbsp;BR[beThumb],&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcVArrowU,&nbsp;BR[beArrow1],&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcVArrowD,&nbsp;BR[beArrow2],&nbsp;False);<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;RCross&nbsp;:=&nbsp;CalcScrollBarRect(hWnd,&nbsp;SB_BOTH);<br>&nbsp;&nbsp;if&nbsp;not&nbsp;IsRectEmpty(RCross)&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcCross,&nbsp;RCross,&nbsp;False);<br>&nbsp;&nbsp;end;<br>end;<br><br>procedure&nbsp;TrackBar(hWnd:&nbsp;HWND;&nbsp;nBarCode:&nbsp;Integer;&nbsp;PosCode:&nbsp;TBarPosCode;&nbsp;BarElem:&nbsp;TBarElem;&nbsp;MsgCode:&nbsp;Integer);<br>var<br>&nbsp;&nbsp;BR:&nbsp;TBarElemRects;<br>&nbsp;&nbsp;Msg:&nbsp;tagMSG;<br>&nbsp;&nbsp;Pt:&nbsp;TPoint;<br>&nbsp;&nbsp;R:&nbsp;TRect;<br>&nbsp;&nbsp;ScrollMsg:&nbsp;Cardinal;<br>&nbsp;&nbsp;RepeatClick:&nbsp;Boolean;<br>&nbsp;&nbsp;idEvent:&nbsp;UINT;<br>&nbsp;&nbsp;SI:&nbsp;TScrollInfo;<br><br>&nbsp;&nbsp;procedure&nbsp;RefreshRect;<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;BR&nbsp;:=&nbsp;CalcBarElemRects(hWnd,&nbsp;nBarCode);<br>&nbsp;&nbsp;&nbsp;&nbsp;R&nbsp;:=&nbsp;BR[BarElem];<br>&nbsp;&nbsp;end;<br><br>begin<br>&nbsp;&nbsp;RepeatClick&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;BR&nbsp;:=&nbsp;CalcBarElemRects(hWnd,&nbsp;nBarCode);<br>&nbsp;&nbsp;R&nbsp;:=&nbsp;BR[BarElem];<br>&nbsp;&nbsp;GetScrollInfo(hWnd,&nbsp;nBarCode,&nbsp;SI);<br>&nbsp;&nbsp;if&nbsp;nBarCode&nbsp;=&nbsp;SB_HORZ&nbsp;then&nbsp;ScrollMsg&nbsp;:=&nbsp;WM_HSCROLL<br>&nbsp;&nbsp;else&nbsp;ScrollMsg&nbsp;:=&nbsp;WM_VSCROLL;<br>&nbsp;&nbsp;if&nbsp;BarElem&nbsp;=&nbsp;beBG&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;PosCode&nbsp;=&nbsp;bpcHPageL&nbsp;then&nbsp;R.Right&nbsp;:=&nbsp;BR[beThumb].Left<br>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;PosCode&nbsp;=&nbsp;bpcHPageR&nbsp;then&nbsp;R.Left&nbsp;:=&nbsp;BR[beThumb].Right<br>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;PosCode&nbsp;=&nbsp;bpcVPageU&nbsp;then&nbsp;R.Bottom&nbsp;:=&nbsp;BR[beThumb].Top<br>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;PosCode&nbsp;=&nbsp;bpcVPageD&nbsp;then&nbsp;R.Top&nbsp;:=&nbsp;BR[beThumb].Bottom;<br>&nbsp;&nbsp;end;<br>&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;PosCode,&nbsp;R,&nbsp;True);<br>&nbsp;&nbsp;GetSkinSBInfo(hWnd)^.Tracking&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;idEvent&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;SetCapture(hWnd);<br>&nbsp;&nbsp;&nbsp;&nbsp;idEvent&nbsp;:=&nbsp;SetTimer(0,&nbsp;0,&nbsp;1000,&nbsp;@OnRepeatClickTimer);<br>&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;GetCapture&nbsp;=&nbsp;hWnd&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;GetMessage(Msg,&nbsp;0,&nbsp;0,&nbsp;0)&nbsp;then&nbsp;Break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(Msg.hwnd&nbsp;=&nbsp;0)&nbsp;and&nbsp;(Msg.message&nbsp;=&nbsp;WM_REPEAT_CLICK)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetCursorPos(Pt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScreenToClient(hWnd,&nbsp;Pt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;PtInRect(R,&nbsp;Pt)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RepeatClick&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(hWnd,&nbsp;ScrollMsg,&nbsp;MsgCode,&nbsp;0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(hWnd,&nbsp;ScrollMsg,&nbsp;SB_ENDSCROLL,&nbsp;0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RefreshRect;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;PosCode,&nbsp;R,&nbsp;True);<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;MsgCode&nbsp;=&nbsp;SB_LINEDOWN&nbsp;then&nbsp;SetScrollPos(hWnd,&nbsp;nBarCode,&nbsp;GetScrollPos(hWnd,&nbsp;nBarCode)&nbsp;+&nbsp;1,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;MsgCode&nbsp;=&nbsp;SB_PAGEDOWN&nbsp;then&nbsp;SetScrollPos(hWnd,&nbsp;nBarCode,&nbsp;GetScrollPos(hWnd,&nbsp;nBarCode)&nbsp;+&nbsp;Integer(SI.nPage),&nbsp;False);<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;MsgCode&nbsp;=&nbsp;SB_LINEUP&nbsp;then&nbsp;SetScrollPos(hWnd,&nbsp;nBarCode,&nbsp;GetScrollPos(hWnd,&nbsp;nBarCode)&nbsp;-&nbsp;1,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;MsgCode&nbsp;=&nbsp;SB_PAGEUP&nbsp;then&nbsp;SetScrollPos(hWnd,&nbsp;nBarCode,&nbsp;GetScrollPos(hWnd,&nbsp;nBarCode)&nbsp;-&nbsp;Integer(SI.nPage),&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RedrawScrollBars(hWnd);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetTimer(0,&nbsp;0,&nbsp;80,&nbsp;@OnRepeatClickTimer);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;if&nbsp;Msg.hwnd&nbsp;=&nbsp;hWnd&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;Msg.message&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WM_LBUTTONUP:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;RepeatClick&nbsp;then&nbsp;Break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetCursorPos(Pt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScreenToClient(hWnd,&nbsp;Pt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;PtInRect(R,&nbsp;Pt)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(hWnd,&nbsp;ScrollMsg,&nbsp;MsgCode,&nbsp;0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(hWnd,&nbsp;ScrollMsg,&nbsp;SB_ENDSCROLL,&nbsp;0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RefreshRect;<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;MsgCode&nbsp;=&nbsp;SB_LINEDOWN&nbsp;then&nbsp;SetScrollPos(hWnd,&nbsp;nBarCode,&nbsp;GetScrollPos(hWnd,&nbsp;nBarCode)&nbsp;+&nbsp;1,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;MsgCode&nbsp;=&nbsp;SB_PAGEDOWN&nbsp;then&nbsp;SetScrollPos(hWnd,&nbsp;nBarCode,&nbsp;GetScrollPos(hWnd,&nbsp;nBarCode)&nbsp;+&nbsp;Integer(SI.nPage),&nbsp;False);<br>//&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;MsgCode&nbsp;=&nbsp;SB_LINEUP&nbsp;then&nbsp;SetScrollPos(hWnd,&nbsp;nBarCode,&nbsp;GetScrollPos(hWnd,&nbsp;nBarCode)&nbsp;-&nbsp;1,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;MsgCode&nbsp;=&nbsp;SB_PAGEUP&nbsp;then&nbsp;SetScrollPos(hWnd,&nbsp;nBarCode,&nbsp;GetScrollPos(hWnd,&nbsp;nBarCode)&nbsp;-&nbsp;Integer(SI.nPage),&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DispatchMessage(Msg);<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;idEvent&nbsp;&lt;&gt;&nbsp;0&nbsp;then&nbsp;KillTimer(0,&nbsp;idEvent);<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;IsWindow(hWnd)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetCapture&nbsp;=&nbsp;hWnd&nbsp;then&nbsp;ReleaseCapture;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;PosCode,&nbsp;R,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSBInfo(hWnd)^.Tracking&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;end;<br>end;<br><br>procedure&nbsp;TrackThumb(hWnd:&nbsp;HWND;&nbsp;nBarCode:&nbsp;Integer;&nbsp;PosCode:&nbsp;TBarPosCode;&nbsp;BarElem:&nbsp;TBarElem);<br>var<br>&nbsp;&nbsp;BR:&nbsp;TBarElemRects;<br>&nbsp;&nbsp;Msg:&nbsp;tagMSG;<br>&nbsp;&nbsp;Pt:&nbsp;TPoint;<br>&nbsp;&nbsp;DragX:&nbsp;Integer;<br>&nbsp;&nbsp;R:&nbsp;TRect;<br>&nbsp;&nbsp;ScrollMsg:&nbsp;Cardinal;<br>&nbsp;&nbsp;SI,&nbsp;SI2:&nbsp;TScrollInfo;<br>&nbsp;&nbsp;Pos:&nbsp;Integer;<br>&nbsp;&nbsp;H,&nbsp;L,&nbsp;ThumbSize,&nbsp;X:&nbsp;Integer;<br>&nbsp;&nbsp;Pushed:&nbsp;Boolean;<br><br>&nbsp;&nbsp;function&nbsp;ValidDragArea(ARect:&nbsp;TRect;&nbsp;APt:&nbsp;TPoint):&nbsp;Boolean;<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;nBarCode&nbsp;=&nbsp;SB_HORZ&nbsp;then&nbsp;Result&nbsp;:=&nbsp;Abs((ARect.Bottom&nbsp;+&nbsp;ARect.Top)&nbsp;div&nbsp;2&nbsp;-&nbsp;APt.Y)&nbsp;&lt;&nbsp;150<br>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;Result&nbsp;:=&nbsp;Abs((ARect.Left&nbsp;+&nbsp;ARect.Right)&nbsp;div&nbsp;2&nbsp;-&nbsp;APt.X)&nbsp;&lt;&nbsp;150;<br>&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;function&nbsp;CalcPos(ARect:&nbsp;TRect;&nbsp;APt:&nbsp;TPoint;&nbsp;ADragX:&nbsp;Integer):&nbsp;Integer;<br>&nbsp;&nbsp;var<br>&nbsp;&nbsp;&nbsp;&nbsp;NewX:&nbsp;Integer;<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;nBarCode&nbsp;=&nbsp;SB_HORZ&nbsp;then&nbsp;NewX&nbsp;:=&nbsp;APt.X&nbsp;-&nbsp;ADragX<br>&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;NewX&nbsp;:=&nbsp;APt.Y&nbsp;-&nbsp;ADragX;<br>&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;SI.nMin&nbsp;+&nbsp;MulDiv(NewX&nbsp;-&nbsp;L,&nbsp;SI.nMax&nbsp;-&nbsp;Integer(SI.nPage)&nbsp;-&nbsp;SI.nMin&nbsp;+&nbsp;1,&nbsp;H&nbsp;-&nbsp;L&nbsp;-&nbsp;ThumbSize);<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Result&nbsp;&lt;&nbsp;SI.nMin&nbsp;then&nbsp;Result&nbsp;:=&nbsp;SI.nMin;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Result&nbsp;&gt;&nbsp;SI.nMax&nbsp;-&nbsp;Integer(SI.nPage)&nbsp;+&nbsp;1&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;SI.nMax&nbsp;-&nbsp;Integer(SI.nPage)&nbsp;+&nbsp;1;<br>&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;procedure&nbsp;UpdateDragBar(ADown:&nbsp;Boolean;&nbsp;APos:&nbsp;Integer&nbsp;=&nbsp;-10000);<br>&nbsp;&nbsp;var<br>&nbsp;&nbsp;&nbsp;&nbsp;W:&nbsp;Integer;<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;BR&nbsp;:=&nbsp;CalcBarElemRects(hWnd,&nbsp;nBarCode);<br>&nbsp;&nbsp;&nbsp;&nbsp;R&nbsp;:=&nbsp;BR[BarElem];<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;nBarCode&nbsp;=&nbsp;SB_HORZ&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;APos&nbsp;&lt;&gt;&nbsp;-10000&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;W&nbsp;:=&nbsp;R.Right&nbsp;-&nbsp;R.Left;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;APos&nbsp;&lt;&nbsp;BR[beArrow1].Right&nbsp;then&nbsp;APos&nbsp;:=&nbsp;BR[beArrow1].Right;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;APos&nbsp;+&nbsp;W&nbsp;&gt;&nbsp;BR[beArrow2].Left&nbsp;then&nbsp;APos&nbsp;:=&nbsp;BR[beArrow2].Left&nbsp;-&nbsp;W;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R.Left&nbsp;:=&nbsp;APos;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R.Right&nbsp;:=&nbsp;APos&nbsp;+&nbsp;W;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcHPageL,&nbsp;Rect(BR[beBG].Left,&nbsp;BR[beBG].Top,&nbsp;R.Left,&nbsp;BR[beBG].Bottom),&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcHPageR,&nbsp;Rect(R.Right,&nbsp;BR[beBG].Top,&nbsp;BR[beBG].Right,&nbsp;BR[beBG].Bottom),&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;APos&nbsp;&lt;&gt;&nbsp;-10000&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;W&nbsp;:=&nbsp;R.Bottom&nbsp;-&nbsp;R.Top;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;APos&nbsp;&lt;&nbsp;BR[beArrow1].Bottom&nbsp;then&nbsp;APos&nbsp;:=&nbsp;BR[beArrow1].Bottom;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;APos&nbsp;+&nbsp;W&nbsp;&gt;=&nbsp;BR[beArrow2].Top&nbsp;then&nbsp;APos&nbsp;:=&nbsp;BR[beArrow2].Top&nbsp;-&nbsp;W&nbsp;-&nbsp;1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R.Top&nbsp;:=&nbsp;APos;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;R.Bottom&nbsp;:=&nbsp;APos&nbsp;+&nbsp;W;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcVPageU,&nbsp;Rect(BR[beBG].Left,&nbsp;BR[beBG].Top,&nbsp;BR[beBG].Right,&nbsp;R.Top),&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcVPageD,&nbsp;Rect(BR[beBG].Left,&nbsp;R.Bottom,&nbsp;BR[beBG].Right,&nbsp;BR[beBG].Bottom),&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;PosCode,&nbsp;R,&nbsp;ADown);<br>&nbsp;&nbsp;&nbsp;&nbsp;OutputDebugString(PChar(Format('R=(%d,%d,%d,%d)',&nbsp;[R.Left,&nbsp;R.Top,&nbsp;R.Right,&nbsp;R.Bottom])));<br>&nbsp;&nbsp;end;<br><br>begin<br>&nbsp;&nbsp;BR&nbsp;:=&nbsp;CalcBarElemRects(hWnd,&nbsp;nBarCode);<br>&nbsp;&nbsp;R&nbsp;:=&nbsp;BR[BarElem];<br>&nbsp;&nbsp;if&nbsp;nBarCode&nbsp;=&nbsp;SB_HORZ&nbsp;then&nbsp;ScrollMsg&nbsp;:=&nbsp;WM_HSCROLL<br>&nbsp;&nbsp;else&nbsp;ScrollMsg&nbsp;:=&nbsp;WM_VSCROLL;<br>&nbsp;&nbsp;SI.cbSize&nbsp;:=&nbsp;SizeOf(SI);<br>&nbsp;&nbsp;SI.fMask&nbsp;:=&nbsp;SIF_ALL;<br>&nbsp;&nbsp;GetScrollInfo(hWnd,&nbsp;nBarCode,&nbsp;SI);<br>&nbsp;&nbsp;GetCursorPos(Pt);<br>&nbsp;&nbsp;ScreenToClient(hWnd,&nbsp;Pt);<br>&nbsp;&nbsp;if&nbsp;nBarCode&nbsp;=&nbsp;SB_HORZ&nbsp;then<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;DragX&nbsp;:=&nbsp;Pt.X&nbsp;-&nbsp;BR[beThumb].Left;<br>&nbsp;&nbsp;&nbsp;&nbsp;ThumbSize&nbsp;:=&nbsp;BR[beThumb].Right&nbsp;-&nbsp;BR[beThumb].Left;<br>&nbsp;&nbsp;&nbsp;&nbsp;L&nbsp;:=&nbsp;BR[beArrow1].Right;<br>&nbsp;&nbsp;&nbsp;&nbsp;H&nbsp;:=&nbsp;BR[beArrow2].Left;<br>&nbsp;&nbsp;end<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;DragX&nbsp;:=&nbsp;Pt.Y&nbsp;-&nbsp;BR[beThumb].Top;<br>&nbsp;&nbsp;&nbsp;&nbsp;ThumbSize&nbsp;:=&nbsp;BR[beThumb].Bottom&nbsp;-&nbsp;BR[beThumb].Top;<br>&nbsp;&nbsp;&nbsp;&nbsp;L&nbsp;:=&nbsp;BR[beArrow1].Bottom;<br>&nbsp;&nbsp;&nbsp;&nbsp;H&nbsp;:=&nbsp;BR[beArrow2].Top;<br>&nbsp;&nbsp;end;<br>{&nbsp;&nbsp;if&nbsp;nBarCode&nbsp;=&nbsp;SB_HORZ&nbsp;then&nbsp;SendMessage(hWnd,&nbsp;WM_SYSCOMMAND,&nbsp;SC_HSCROLL,&nbsp;MAKELPARAM(Pt.X,&nbsp;Pt.Y))<br>&nbsp;&nbsp;else&nbsp;SendMessage(hWnd,&nbsp;WM_SYSCOMMAND,&nbsp;SC_VSCROLL,&nbsp;MAKELPARAM(Pt.X,&nbsp;Pt.Y));&nbsp;}<br>&nbsp;&nbsp;GetSkinSBInfo(hWnd)^.Tracking&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;UpdateDragBar(True);<br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;SetCapture(hWnd);<br>&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;GetCapture&nbsp;=&nbsp;hWnd&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;GetMessage(Msg,&nbsp;0,&nbsp;0,&nbsp;0)&nbsp;then&nbsp;Break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;Msg.hwnd&nbsp;=&nbsp;hWnd&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;Msg.message&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WM_MOUSEMOVE:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pushed&nbsp;:=&nbsp;ValidDragArea(R,&nbsp;Pt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetCursorPos(Pt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScreenToClient(hWnd,&nbsp;Pt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;ValidDragArea(R,&nbsp;Pt)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pos&nbsp;:=&nbsp;CalcPos(R,&nbsp;Pt,&nbsp;DragX);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;nBarCode&nbsp;=&nbsp;SB_HORZ&nbsp;then&nbsp;X&nbsp;:=&nbsp;Pt.X&nbsp;-&nbsp;DragX<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;X&nbsp;:=&nbsp;Pt.Y&nbsp;-&nbsp;DragX;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pos&nbsp;:=&nbsp;SI.nPos;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;X&nbsp;:=&nbsp;DragX;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSBInfo(hWnd)^.ThumbPos&nbsp;:=&nbsp;Pos;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSBInfo(hWnd)^.ThumbTrack&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(hWnd,&nbsp;ScrollMsg,&nbsp;MAKEWPARAM(SB_THUMBTRACK,&nbsp;Pos),&nbsp;0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSBInfo(hWnd)^.ThumbTrack&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UpdateDragBar(Pushed,&nbsp;X);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WM_LBUTTONUP:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetCursorPos(Pt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScreenToClient(hWnd,&nbsp;Pt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;ValidDragArea(R,&nbsp;Pt)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pos&nbsp;:=&nbsp;CalcPos(R,&nbsp;Pt,&nbsp;DragX);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SI2.cbSize&nbsp;:=&nbsp;SizeOf(SI2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SI2.fMask&nbsp;:=&nbsp;SIF_ALL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetScrollInfo(hWnd,&nbsp;nBarCode,&nbsp;SI2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SI2.nPos&nbsp;:=&nbsp;Pos;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SI2.nTrackPos&nbsp;:=&nbsp;Pos;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetScrollInfo(hWnd,&nbsp;nBarCode,&nbsp;SI2,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SI2.nTrackPos&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SI2.nPos&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetScrollInfo(hWnd,&nbsp;nBarCode,&nbsp;SI2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(hWnd,&nbsp;ScrollMsg,&nbsp;MAKEWPARAM(SB_THUMBPOSITION,&nbsp;Pos),&nbsp;0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(hWnd,&nbsp;ScrollMsg,&nbsp;SB_ENDSCROLL,&nbsp;0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Break;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DispatchMessage(Msg);<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;IsWindow(hWnd)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetCapture&nbsp;=&nbsp;hWnd&nbsp;then&nbsp;ReleaseCapture;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSBInfo(hWnd)^.Tracking&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;UpdateDragBar(False);<br>&nbsp;&nbsp;end;<br>end;<br><br>function&nbsp;SkinSBWndProc(hWnd:&nbsp;HWND;&nbsp;uMsg:&nbsp;UINT;&nbsp;wParam:&nbsp;WPARAM;&nbsp;lParam:&nbsp;LPARAM):&nbsp;LRESULT;<br>var<br>&nbsp;&nbsp;PInfo:&nbsp;PSkinSBInfo;<br>&nbsp;&nbsp;Style,&nbsp;ExStyle:&nbsp;Cardinal;<br>&nbsp;&nbsp;R,&nbsp;RHBar,&nbsp;RVBar,&nbsp;RCross:&nbsp;TRect;<br>&nbsp;&nbsp;Pt:&nbsp;TPoint;<br>&nbsp;&nbsp;Rgn,&nbsp;Rgn2:&nbsp;HRGN;<br>&nbsp;&nbsp;PR:&nbsp;PRect;<br>&nbsp;&nbsp;BR:&nbsp;TBarElemRects;<br>&nbsp;&nbsp;XBar,&nbsp;YBar:&nbsp;Integer;<br>begin<br>&nbsp;&nbsp;PInfo&nbsp;:=&nbsp;GetSkinSBInfo(hWnd);<br>&nbsp;&nbsp;if&nbsp;PInfo&nbsp;=&nbsp;nil&nbsp;then&nbsp;Result&nbsp;:=&nbsp;DefWindowProc(hWnd,&nbsp;uMsg,&nbsp;wParam,&nbsp;lParam)&nbsp;////&nbsp;error!!!<br>&nbsp;&nbsp;else<br>&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;uMsg&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WM_NCHITTEST:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetCursorPos(Pt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ScreenToClient(hWnd,&nbsp;Pt);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case&nbsp;GetPtBarPos(hWnd,&nbsp;Pt)&nbsp;of<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcHArrowL:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(GetKeyState(VK_LBUTTON)&nbsp;and&nbsp;$8000)&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetCapture&nbsp;&lt;&gt;&nbsp;hWnd&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TrackBar(hWnd,&nbsp;SB_HORZ,&nbsp;bpcHArrowL,&nbsp;beArrow1,&nbsp;SB_LINELEFT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;HTNOWhere;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcHArrowR:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(GetKeyState(VK_LBUTTON)&nbsp;and&nbsp;$8000)&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetCapture&nbsp;&lt;&gt;&nbsp;hWnd&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TrackBar(hWnd,&nbsp;SB_HORZ,&nbsp;bpcHArrowR,&nbsp;beArrow2,&nbsp;SB_LINERIGHT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;HTNOWhere;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcHPageL:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(GetKeyState(VK_LBUTTON)&nbsp;and&nbsp;$8000)&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetCapture&nbsp;&lt;&gt;&nbsp;hWnd&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TrackBar(hWnd,&nbsp;SB_HORZ,&nbsp;bpcHPageL,&nbsp;beBG,&nbsp;SB_PAGELEFT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RedrawScrollBars(hWnd);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;HTNOWhere;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcHPageR:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(GetKeyState(VK_LBUTTON)&nbsp;and&nbsp;$8000)&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetCapture&nbsp;&lt;&gt;&nbsp;hWnd&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TrackBar(hWnd,&nbsp;SB_HORZ,&nbsp;bpcHPageR,&nbsp;beBG,&nbsp;SB_PAGERIGHT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RedrawScrollBars(hWnd);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;HTNOWhere;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcHThumb:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(GetKeyState(VK_LBUTTON)&nbsp;and&nbsp;$8000)&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetCapture&nbsp;&lt;&gt;&nbsp;hWnd&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TrackThumb(hWnd,&nbsp;SB_HORZ,&nbsp;bpcHThumb,&nbsp;beThumb);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;HTNOWhere;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcVArrowU:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(GetKeyState(VK_LBUTTON)&nbsp;and&nbsp;$8000)&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetCapture&nbsp;&lt;&gt;&nbsp;hWnd&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TrackBar(hWnd,&nbsp;SB_VERT,&nbsp;bpcVArrowU,&nbsp;beArrow1,&nbsp;SB_LINELEFT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;HTNOWhere;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcVArrowD:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(GetKeyState(VK_LBUTTON)&nbsp;and&nbsp;$8000)&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetCapture&nbsp;&lt;&gt;&nbsp;hWnd&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TrackBar(hWnd,&nbsp;SB_VERT,&nbsp;bpcVArrowD,&nbsp;beArrow2,&nbsp;SB_LINERIGHT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;HTNOWhere;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcVPageU:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(GetKeyState(VK_LBUTTON)&nbsp;and&nbsp;$8000)&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetCapture&nbsp;&lt;&gt;&nbsp;hWnd&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TrackBar(hWnd,&nbsp;SB_VERT,&nbsp;bpcVPageU,&nbsp;beBG,&nbsp;SB_PAGELEFT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RedrawScrollBars(hWnd);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;HTNOWhere;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcVPageD:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(GetKeyState(VK_LBUTTON)&nbsp;and&nbsp;$8000)&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetCapture&nbsp;&lt;&gt;&nbsp;hWnd&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TrackBar(hWnd,&nbsp;SB_VERT,&nbsp;bpcVPageD,&nbsp;beBG,&nbsp;SB_PAGERIGHT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RedrawScrollBars(hWnd);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;HTNOWhere;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bpcVThumb:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(GetKeyState(VK_LBUTTON)&nbsp;and&nbsp;$8000)&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;GetCapture&nbsp;&lt;&gt;&nbsp;hWnd&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TrackThumb(hWnd,&nbsp;SB_VERT,&nbsp;bpcVThumb,&nbsp;beThumb);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;HTNOWhere;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WM_HSCROLL:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Scrolling&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Style&nbsp;:=&nbsp;GetWindowLong(hWnd,&nbsp;GWL_STYLE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Style&nbsp;:=&nbsp;Style;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Prevent&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetWindowLong(hWnd,&nbsp;GWL_STYLE,&nbsp;Style&nbsp;and&nbsp;(not&nbsp;(WS_VSCROLL&nbsp;or&nbsp;WS_HSCROLL)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Prevent&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;CallWindowProc(@PInfo^.OldWndProc,&nbsp;hWnd,&nbsp;uMsg,&nbsp;wParam,&nbsp;lParam);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RedrawScrollBars(hWnd);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Prevent&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetWindowLong(hWnd,&nbsp;GWL_STYLE,&nbsp;Style);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Prevent&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Scrolling&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WM_VSCROLL:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Scrolling&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Style&nbsp;:=&nbsp;GetWindowLong(hWnd,&nbsp;GWL_STYLE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Style&nbsp;:=&nbsp;Style;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Prevent&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetWindowLong(hWnd,&nbsp;GWL_STYLE,&nbsp;Style&nbsp;and&nbsp;(not&nbsp;(WS_VSCROLL&nbsp;or&nbsp;WS_HSCROLL)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Prevent&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;CallWindowProc(@PInfo^.OldWndProc,&nbsp;hWnd,&nbsp;uMsg,&nbsp;wParam,&nbsp;lParam);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Prevent&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetWindowLong(hWnd,&nbsp;GWL_STYLE,&nbsp;Style);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Prevent&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Scrolling&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WM_STYLECHANGED:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;wParam&nbsp;=&nbsp;GWL_STYLE&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;PInfo^.Prevent&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Style&nbsp;:=&nbsp;GetWindowLong(hWnd,&nbsp;GWL_STYLE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WM_NCCALCSIZE:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Style&nbsp;:=&nbsp;GetWindowLong(hWnd,&nbsp;GWL_STYLE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExStyle&nbsp;:=&nbsp;GetWindowLong(hWnd,&nbsp;GWL_EXSTYLE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XBar&nbsp;:=&nbsp;GetSystemMetrics(SM_CXVSCROLL);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;YBar&nbsp;:=&nbsp;GetSystemMetrics(SM_CYHSCROLL);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;PInfo^.Scrolling&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Prevent&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetWindowLong(hWnd,&nbsp;GWL_STYLE,&nbsp;Style&nbsp;and&nbsp;(not&nbsp;(WS_HSCROLL&nbsp;or&nbsp;WS_VSCROLL)));&nbsp;&nbsp;//&nbsp;real&nbsp;style<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Prevent&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;CallWindowProc(@PInfo^.OldWndProc,&nbsp;hWnd,&nbsp;uMsg,&nbsp;wParam,&nbsp;lParam);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;PInfo^.Scrolling&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PR&nbsp;:=&nbsp;PRect(lParam);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(PInfo^.Style&nbsp;and&nbsp;WS_VSCROLL)&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ExStyle&nbsp;and&nbsp;WS_EX_LEFTSCROLLBAR)&nbsp;&lt;&gt;&nbsp;0&nbsp;then&nbsp;Inc(PR^.Left,&nbsp;XBar)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;Dec(PR^.Right,&nbsp;XBar);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(PInfo^.Style&nbsp;and&nbsp;WS_HSCROLL)&nbsp;&lt;&gt;&nbsp;0&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Dec(PR^.Bottom,&nbsp;YBar);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;PInfo^.Scrolling&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Prevent&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetWindowLong(hWnd,&nbsp;GWL_STYLE,&nbsp;Style);&nbsp;&nbsp;//&nbsp;old&nbsp;style<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Prevent&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WM_NCPAINT:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetWindowRect(hWnd,&nbsp;R);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Pt&nbsp;:=&nbsp;R.TopLeft;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;wParam&nbsp;=&nbsp;1&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rgn&nbsp;:=&nbsp;CreateRectRgn(Pt.X,&nbsp;Pt.Y,&nbsp;Pt.X&nbsp;+&nbsp;R.Right,&nbsp;Pt.Y&nbsp;+&nbsp;R.Bottom);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end&nbsp;else&nbsp;Rgn&nbsp;:=&nbsp;wParam;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RHBar&nbsp;:=&nbsp;CalcScrollBarRect(hWnd,&nbsp;SB_HORZ);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OffsetRect(RHBar,&nbsp;Pt.X,&nbsp;PT.Y);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;IsRectEmpty(RHBar)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BR&nbsp;:=&nbsp;CalcBarElemRects(hWnd,&nbsp;SB_HORZ);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcHPageL,&nbsp;Rect(BR[beBG].Left,&nbsp;BR[beBG].Top,&nbsp;BR[beThumb].Left,&nbsp;BR[beBG].Bottom),&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcHPageR,&nbsp;Rect(BR[beThumb].Right,&nbsp;BR[beBG].Top,&nbsp;BR[beBG].Right,&nbsp;BR[beBG].Bottom),&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcHThumb,&nbsp;BR[beThumb],&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcHArrowL,&nbsp;BR[beArrow1],&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcHArrowR,&nbsp;BR[beArrow2],&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rgn2&nbsp;:=&nbsp;CreateRectRgn(RHBar.Left,&nbsp;RHBar.Top,&nbsp;RHBar.Right,&nbsp;RHBar.Bottom);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CombineRgn(Rgn,&nbsp;Rgn,&nbsp;Rgn2,&nbsp;RGN_DIFF);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject(Rgn2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RVBar&nbsp;:=&nbsp;CalcScrollBarRect(hWnd,&nbsp;SB_VERT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;IsRectEmpty(RVBar)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BR&nbsp;:=&nbsp;CalcBarElemRects(hWnd,&nbsp;SB_VERT);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcVPageU,&nbsp;Rect(BR[beBG].Left,&nbsp;BR[beBG].Top,&nbsp;BR[beBG].Right,&nbsp;BR[beThumb].Top),&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcVPageD,&nbsp;Rect(BR[beBG].Left,&nbsp;BR[beThumb].Bottom,&nbsp;BR[beBG].Right,&nbsp;BR[beBG].Bottom),&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcVThumb,&nbsp;BR[beThumb],&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcVArrowU,&nbsp;BR[beArrow1],&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcVArrowD,&nbsp;BR[beArrow2],&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OffsetRect(RVBar,&nbsp;Pt.X,&nbsp;PT.Y);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rgn2&nbsp;:=&nbsp;CreateRectRgn(RVBar.Left,&nbsp;RVBar.Top,&nbsp;RVBar.Right,&nbsp;RVBar.Bottom);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CombineRgn(Rgn,&nbsp;Rgn,&nbsp;Rgn2,&nbsp;RGN_DIFF);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject(Rgn2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RCross&nbsp;:=&nbsp;CalcScrollBarRect(hWnd,&nbsp;SB_BOTH);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;IsRectEmpty(RCross)&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GetSkinSB.DrawElem(hWnd,&nbsp;bpcCross,&nbsp;RCross,&nbsp;False);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OffsetRect(RCross,&nbsp;Pt.X,&nbsp;PT.Y);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Rgn2&nbsp;:=&nbsp;CreateRectRgn(RCross.Left,&nbsp;RCross.Top,&nbsp;RCross.Right,&nbsp;RCross.Bottom);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CombineRgn(Rgn,&nbsp;Rgn,&nbsp;Rgn2,&nbsp;RGN_DIFF);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DeleteObject(Rgn2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;CallWindowProc(@PInfo^.OldWndProc,&nbsp;hWnd,&nbsp;uMsg,&nbsp;Rgn,&nbsp;lParam);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;wParam&nbsp;=&nbsp;1&nbsp;then&nbsp;DeleteObject(Rgn);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WM_ERASEBKGND:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Style&nbsp;:=&nbsp;GetWindowLong(hWnd,&nbsp;GWL_STYLE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Prevent&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetWindowLong(hWnd,&nbsp;GWL_STYLE,&nbsp;Style&nbsp;and&nbsp;(not&nbsp;(WS_VSCROLL&nbsp;or&nbsp;WS_HSCROLL)));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Prevent&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;CallWindowProc(@PInfo^.OldWndProc,&nbsp;hWnd,&nbsp;uMsg,&nbsp;wParam,&nbsp;lParam);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Prevent&nbsp;:=&nbsp;True;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SetWindowLong(hWnd,&nbsp;GWL_STYLE,&nbsp;Style);&nbsp;&nbsp;//&nbsp;old&nbsp;style<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PInfo^.Prevent&nbsp;:=&nbsp;False;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;WM_MOUSEWHEEL,&nbsp;WM_MOUSEMOVE:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;CallWindowProc(@PInfo^.OldWndProc,&nbsp;hWnd,&nbsp;uMsg,&nbsp;wParam,&nbsp;lParam);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;PInfo^.Tracking&nbsp;then&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(uMsg&nbsp;=&nbsp;WM_MOUSEMOVE)&nbsp;and&nbsp;((wParam&nbsp;and&nbsp;MK_LBUTTON)&nbsp;=&nbsp;0)&nbsp;then&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RedrawScrollBars(hWnd);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Exit;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;CallWindowProc(@PInfo^.OldWndProc,&nbsp;hWnd,&nbsp;uMsg,&nbsp;wParam,&nbsp;lParam);<br>&nbsp;&nbsp;end;<br>end;<br><br>initialization<br><br>&nbsp;&nbsp;l_SkinSB&nbsp;:=&nbsp;nil;<br>&nbsp;&nbsp;l_SkinSB_Prop&nbsp;:=&nbsp;GlobalAddAtom(SKINSB_PROP);<br><br>finalization<br><br>&nbsp;&nbsp;if&nbsp;Assigned(l_SkinSB)&nbsp;then&nbsp;FreeAndNil(l_SkinSB);<br><br>end.
 
后退
顶部