1 // TortoiseIDiff - an image diff viewer in TortoiseSVN
3 // Copyright (C) 2006 - 2008, 2011 - TortoiseSVN
5 // This program is free software; you can redistribute it and/or
6 // modify it under the terms of the GNU General Public License
7 // as published by the Free Software Foundation; either version 2
8 // of the License, or (at your option) any later version.
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
15 // You should have received a copy of the GNU General Public License
16 // along with this program; if not, write to the Free Software Foundation,
17 // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include "NiceTrackbar.h"
26 LRESULT CALLBACK
CNiceTrackbar::NiceTrackbarProc(HWND hwnd
, UINT message
, WPARAM wParam
, LPARAM lParam
)
28 CNiceTrackbar
* self
= (CNiceTrackbar
*)GetWindowLongPtr(hwnd
, GWLP_USERDATA
);
32 self
->m_Dragging
= true;
33 self
->m_DragChanged
= false;
36 if (self
->SetThumb(lParam
)) {
37 self
->m_DragChanged
= true;
38 self
->PostMessageToParent(TB_THUMBTRACK
);
44 if (self
->SetThumb(lParam
))
46 self
->m_DragChanged
= true;
47 self
->PostMessageToParent(TB_THUMBTRACK
);
55 self
->m_Dragging
= false;
57 if (self
->SetThumb(lParam
))
59 self
->PostMessageToParent(TB_ENDTRACK
);
60 self
->m_DragChanged
= true;
62 if (self
->m_DragChanged
)
64 self
->PostMessageToParent(TB_THUMBPOSITION
);
65 self
->m_DragChanged
= false;
70 case WM_CAPTURECHANGED
:
73 self
->m_Dragging
= false;
78 SetWindowLongPtr (hwnd
, GWLP_WNDPROC
, (LONG_PTR
)self
->m_OrigProc
);
81 return CallWindowProc (self
->m_OrigProc
, hwnd
, message
, wParam
, lParam
);
85 void CNiceTrackbar::ConvertTrackbarToNice( HWND window
)
90 SetWindowLongPtr( window
, GWLP_USERDATA
, (LONG_PTR
)this );
93 m_OrigProc
= (WNDPROC
)SetWindowLongPtr( window
, GWLP_WNDPROC
, (LONG_PTR
)NiceTrackbarProc
);
97 bool CNiceTrackbar::SetThumb (LPARAM lparamPoint
)
99 POINT point
= { GET_X_LPARAM(lparamPoint
), GET_Y_LPARAM(lparamPoint
) };
100 const int nMin
= (int)SendMessage(m_Window
, TBM_GETRANGEMIN
, 0, 0l);
101 const int nMax
= (int)SendMessage(m_Window
, TBM_GETRANGEMAX
, 0, 0l);
103 SendMessage(m_Window
, TBM_GETCHANNELRECT
, 0, (LPARAM
)&rc
);
105 if (GetWindowLong(m_Window
, GWL_STYLE
) & TBS_VERT
)
107 // note: for vertical trackbar, it still returns the rectangle as if it was horizontal
108 ratio
= (double)(point
.y
- rc
.left
)/(rc
.right
- rc
.left
);
112 ratio
= (double)(point
.x
- rc
.left
)/(rc
.right
- rc
.left
);
115 int nNewPos
= (int)(nMin
+ (nMax
-nMin
)*ratio
+ 0.5); // round the result to go to the nearest tick mark
117 const bool changed
= (nNewPos
!= (int)SendMessage(m_Window
, TBM_GETPOS
, 0, 0));
120 SendMessage(m_Window
, TBM_SETPOS
, TRUE
, nNewPos
);
126 void CNiceTrackbar::PostMessageToParent (int tbCode
) const
128 HWND parent
= GetParent(m_Window
);
130 int pos
= (int)SendMessage(m_Window
, TBM_GETPOS
, 0, 0);
131 bool vert
= (GetWindowLong(m_Window
, GWL_STYLE
) & TBS_VERT
) != 0;
132 PostMessage( parent
, vert
? WM_VSCROLL
: WM_HSCROLL
, (WPARAM
)((pos
<< 16) | tbCode
), (LPARAM
)m_Window
);