changeset 204:098ed34d41fb

The basics of the new scrollbar code on Windows, and dw_main_iteration().
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Sat, 01 Feb 2003 08:00:38 +0000
parents e0beea487e8f
children b9283fd56d69
files dw.h win/dw.c
diffstat 2 files changed, 65 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/dw.h	Sat Feb 01 07:05:12 2003 +0000
+++ b/dw.h	Sat Feb 01 08:00:38 2003 +0000
@@ -279,6 +279,7 @@
 #define POPUPMENUCLASSNAME "POPUPMENU"
 #define EDITCLASSNAME "EDIT"
 #define FRAMECLASSNAME "FRAME"
+#define SCROLLBARCLASSNAME "SCROLLBAR"
 
 #define ClassName "dynamicwindows"
 #define SplitbarClassName "dwsplitbar"
--- a/win/dw.c	Sat Feb 01 07:05:12 2003 +0000
+++ b/win/dw.c	Sat Feb 01 08:00:38 2003 +0000
@@ -1507,12 +1507,12 @@
 					{
 						char tmpbuf[100];
                         HWND handle = (HWND)mp2;
+						int (*valuechangefunc)(HWND, int, void *) = tmp->signalfunction;
 
 						GetClassName(handle, tmpbuf, 99);
 
 						if(strnicmp(tmpbuf, TRACKBAR_CLASS, strlen(TRACKBAR_CLASS)+1)==0)
 						{
-							int (*valuechangefunc)(HWND, int, void *) = tmp->signalfunction;
 
 							if(handle == tmp->window)
 							{
@@ -1527,6 +1527,17 @@
 								tmp = NULL;
 							}
 						}
+						else if(strnicmp(tmpbuf, SCROLLBARCLASSNAME, strlen(SCROLLBARCLASSNAME)+1)==0)
+						{
+							if(handle == tmp->window && LOWORD(mp1) == SB_THUMBTRACK)
+							{
+								int value = (int)HIWORD(mp1);
+
+								dw_scrollbar_set_pos(tmp->window, value);
+								result = valuechangefunc(tmp->window, value, tmp->data);
+								tmp = NULL;
+							}
+						}
 					}
 					break;
 				}
@@ -1612,6 +1623,18 @@
 			}
 		}
 		break;
+	case WM_HSCROLL:
+	case WM_VSCROLL:
+		{
+			HWND handle = (HWND)mp2;
+
+			if(dw_window_get_data(handle, "_dw_scrollbar") && LOWORD(mp1) == SB_THUMBTRACK)
+			{
+				int value = (int)HIWORD(mp1);
+				dw_scrollbar_set_pos(handle, value);
+			}
+		}
+		break;
 	case WM_GETMINMAXINFO:
 		{
 			MINMAXINFO *info = (MINMAXINFO *)mp2;
@@ -2954,7 +2977,7 @@
 
 	_dwtid = dw_thread_id();
 
-	while (GetMessage(&msg, NULL, 0, 0))
+	while(GetMessage(&msg, NULL, 0, 0))
 	{
 		if(msg.hwnd == NULL && msg.message == WM_TIMER)
 			_wndproc(msg.hwnd, msg.message, msg.wParam, msg.lParam);
@@ -2989,6 +3012,24 @@
 }
 
 /*
+ * Processes a single message iteration and returns.
+ */
+void API dw_main_iteration(void)
+{
+	MSG msg;
+
+	_dwtid = dw_thread_id();
+
+	if(GetMessage(&msg, NULL, 0, 0))
+	{
+		if(msg.hwnd == NULL && msg.message == WM_TIMER)
+			_wndproc(msg.hwnd, msg.message, msg.wParam, msg.lParam);
+		TranslateMessage(&msg);
+		DispatchMessage(&msg);
+	}
+}
+
+/*
  * Free's memory allocated by dynamic windows.
  * Parameters:
  *           ptr: Pointer to dynamic windows allocated
@@ -3294,7 +3335,6 @@
 		{
 			cinfo = calloc(1, sizeof(ColorInfo));
 			cinfo->fore = cinfo->back = -1;
-			cinfo->buddy = 0;
 
 			strcpy(cinfo->fontname, fontname);
 
@@ -3353,7 +3393,6 @@
 
 		cinfo->fore = fore;
 		cinfo->back = back;
-		cinfo->buddy = 0;
 
 		cinfo->pOldProc = SubclassWindow(handle, _colorwndproc);
 		SetWindowLong(handle, GWL_USERDATA, (ULONG)cinfo);
@@ -3923,7 +3962,6 @@
 	ColorInfo *cinfo = calloc(1, sizeof(ColorInfo));
 
 	cinfo->back = cinfo->fore = -1;
-	cinfo->buddy = 0;
 
 	cinfo->pOldProc = SubclassWindow(tmp, _colorwndproc);
 	SetWindowLong(tmp, GWL_USERDATA, (ULONG)cinfo);
@@ -3953,7 +3991,6 @@
 	ColorInfo *cinfo = calloc(1, sizeof(ColorInfo));
 
 	cinfo->back = cinfo->fore = -1;
-	cinfo->buddy = 0;
 
 	cinfo->pOldProc = SubclassWindow(tmp, _colorwndproc);
 	SetWindowLong(tmp, GWL_USERDATA, (ULONG)cinfo);
@@ -4176,8 +4213,6 @@
 	ColorInfo *cinfo = calloc(1, sizeof(ColorInfo));
 
 	cinfo->back = cinfo->fore = -1;
-	cinfo->buddy = 0;
-	cinfo->user = 0;
 
 	cinfo->pOldProc = SubclassWindow(tmp, _colorwndproc);
 	SetWindowLong(tmp, GWL_USERDATA, (ULONG)cinfo);
@@ -4194,7 +4229,7 @@
  */
 HWND API dw_scrollbar_new(int vertical, int increments, ULONG id)
 {
-	HWND tmp = CreateWindow("SCROLLBAR",
+	HWND tmp = CreateWindow(SCROLLBARCLASSNAME,
 							"",
 							WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE |
 							(vertical ? SBS_VERT : SBS_HORZ),
@@ -4203,6 +4238,13 @@
 							(HMENU)id,
 							DWInstance,
 							NULL);
+	ColorInfo *cinfo = calloc(1, sizeof(ColorInfo));
+
+	cinfo->back = cinfo->fore = -1;
+
+	cinfo->pOldProc = SubclassWindow(tmp, _colorwndproc);
+	SetWindowLong(tmp, GWL_USERDATA, (ULONG)cinfo);
+	dw_window_set_data(tmp, "_dw_scrollbar", (void *)1);
 	return tmp;
 }
 
@@ -5341,10 +5383,18 @@
  * Parameters:
  *          handle: Handle to the scrollbar to be set.
  *          range: Maximum range value.
- */
-void API dw_scrollbar_set_range(HWND handle, unsigned int range)
-{
-	SendMessage(handle, SBM_SETRANGE, 0, (LPARAM)range);
+ *          visible: Visible area relative to the range.
+ */
+void API dw_scrollbar_set_range(HWND handle, unsigned int range, unsigned int visible)
+{
+	SCROLLINFO si;
+
+	si.cbSize = sizeof(SCROLLINFO);
+	si.fMask = SIF_RANGE | SIF_PAGE;
+	si.nMin = 0;
+	si.nMax = range;
+	si.nPage = visible;
+	SendMessage(handle, SBM_SETSCROLLINFO, (WPARAM)TRUE, (LPARAM)&si);
 }
 
 /*
@@ -7348,6 +7398,7 @@
 			return;
 
 		cinfo = calloc(1, sizeof(ColorInfo));
+		cinfo->fore = cinfo->back = -1;
 		SetWindowLong(window, GWL_USERDATA, (LONG)cinfo);
 	}