changeset 211:e57c182cac64

Automatically scroll when getting PAGE and LINE messages, not just track messages.
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Sat, 01 Feb 2003 11:28:43 +0000
parents b9c7b762c104
children f2d1e231922e
files win/dw.c
diffstat 1 files changed, 55 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/win/dw.c	Sat Feb 01 10:05:27 2003 +0000
+++ b/win/dw.c	Sat Feb 01 11:28:43 2003 +0000
@@ -1199,6 +1199,47 @@
 	}
 }
 
+int _HandleScroller(HWND handle, int pos, int which)
+{
+	SCROLLINFO si;
+
+	si.cbSize = sizeof(SCROLLINFO);
+	si.fMask = SIF_ALL;
+
+	SendMessage(handle, SBM_GETSCROLLINFO, 0, (LPARAM)&si);
+
+	switch(which)
+	{
+	case SB_THUMBTRACK:
+		return pos;
+	/*case SB_PAGEDOWN:*/
+	case SB_PAGELEFT:
+		pos = si.nPos - si.nPage;
+		if(pos < si.nMin)
+			pos = si.nMin;
+		return pos;
+	/*case SB_PAGEUP:*/
+	case SB_PAGERIGHT:
+		pos = si.nPos + si.nPage;
+		if(pos > (si.nMax - si.nPage) + 1)
+			pos = (si.nMax - si.nPage) + 1;
+		return pos;
+	/*case SB_LINEDOWN:*/
+	case SB_LINELEFT:
+		pos = si.nPos - 1;
+		if(pos < si.nMin)
+			pos = si.nMin;
+		return pos;
+	/*case SB_LINEUP:*/
+	case SB_LINERIGHT:
+		pos = si.nPos + 1;
+		if(pos > (si.nMax - si.nPage) + 1)
+			pos = (si.nMax - si.nPage) + 1;
+		return pos;
+	}
+	return -1;
+}
+
 /* The main window procedure for Dynamic Windows, all the resizing code is done here. */
 BOOL CALLBACK _wndproc(HWND hWnd, UINT msg, WPARAM mp1, LPARAM mp2)
 {
@@ -1529,13 +1570,17 @@
 						}
 						else if(strnicmp(tmpbuf, SCROLLBARCLASSNAME, strlen(SCROLLBARCLASSNAME)+1)==0)
 						{
-							if(handle == tmp->window && LOWORD(mp1) == SB_THUMBTRACK)
+							if(handle == tmp->window)
 							{
-								int value = (int)HIWORD(mp1);
-
-								dw_scrollbar_set_pos(tmp->window, value);
-								result = valuechangefunc(tmp->window, value, tmp->data);
+								int value = _HandleScroller(handle, (int)HIWORD(mp1), (int)LOWORD(mp1));
+
+								if(value > -1)
+								{
+									dw_scrollbar_set_pos(tmp->window, value);
+									result = valuechangefunc(tmp->window, value, tmp->data);
+								}
 								tmp = NULL;
+								msg = 0;
 							}
 						}
 					}
@@ -1628,10 +1673,12 @@
 		{
 			HWND handle = (HWND)mp2;
 
-			if(dw_window_get_data(handle, "_dw_scrollbar") && LOWORD(mp1) == SB_THUMBTRACK)
+			if(dw_window_get_data(handle, "_dw_scrollbar"))
 			{
-				int value = (int)HIWORD(mp1);
-				dw_scrollbar_set_pos(handle, value);
+				int value = _HandleScroller(handle, (int)HIWORD(mp1), (int)LOWORD(mp1));
+
+				if(value > -1)
+					dw_scrollbar_set_pos(handle, value);
 			}
 		}
 		break;