# HG changeset patch # User bsmith@81767d24-ef19-dc11-ae90-00e081727c95 # Date 1044086438 0 # Node ID 098ed34d41fb607cfc43c26927f2e5a7a030ed3f # Parent e0beea487e8f6ffc556c524908e0b94a8e07d3d1 The basics of the new scrollbar code on Windows, and dw_main_iteration(). diff -r e0beea487e8f -r 098ed34d41fb dw.h --- 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" diff -r e0beea487e8f -r 098ed34d41fb win/dw.c --- 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); }