From: <kr_...@us...> - 2004-05-31 19:31:40
|
Update of /cvsroot/htoolkit/port/src/cbits/Win32 In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv10288/src/cbits/Win32 Modified Files: Splitter.c Log Message: Completed Splitter control for Windows Index: Splitter.c =================================================================== RCS file: /cvsroot/htoolkit/port/src/cbits/Win32/Splitter.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** Splitter.c 29 May 2004 23:00:20 -0000 1.2 --- Splitter.c 31 May 2004 19:31:30 -0000 1.3 *************** *** 2,9 **** #include "Internals.h" #include "Handlers_stub.h" ! typedef struct { int nSplitterPos; HWND hCtrl1, hCtrl2; } SplitterData; --- 2,11 ---- #include "Internals.h" #include "Handlers_stub.h" + #include <windowsx.h> ! typedef struct { int nSplitterPos; + BOOL bInDragMode; HWND hCtrl1, hCtrl2; } SplitterData; *************** *** 44,51 **** --- 46,75 ---- if (pData->hCtrl2) MoveWindow(pData->hCtrl2, rects[2].left, rects[2].top, rects[2].right-rects[2].left, rects[2].bottom-rects[2].top, TRUE); + + InvalidateRect(hWnd, NULL, TRUE); + } + + static void UpdateSplitterPos(HWND hWnd, SplitterData *pData, int pos) + { + RECT rect; + int nMaxPos; + + GetClientRect(hWnd, &rect); + if (GetWindowLong(hWnd, GWL_STYLE) & CCS_VERT) + nMaxPos = rect.bottom-rect.top; + else + nMaxPos = rect.right-rect.left; + + if (pos > SPLIT_LINE_SIZE/2 && pos < nMaxPos-SPLIT_LINE_SIZE/2) + { + pData->nSplitterPos = pos; + RelayoutPanes(hWnd, pData); + } } LRESULT CALLBACK HSplitterFunction(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { + POINT pos; + RECT rects[3]; SplitterData *pData = (SplitterData *) GetWindowLong(hWnd, GWL_USERDATA); *************** *** 56,64 **** pData = malloc(sizeof(SplitterData)); pData->nSplitterPos = 100; pData->hCtrl1 = CreateWindow( "HCOMPOUND", NULL, ! WS_CHILD | WS_BORDER | WS_HSCROLL | WS_VSCROLL, 0,0,0,0, hWnd, --- 80,89 ---- pData = malloc(sizeof(SplitterData)); pData->nSplitterPos = 100; + pData->bInDragMode = FALSE; pData->hCtrl1 = CreateWindow( "HCOMPOUND", NULL, ! WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | WS_VSCROLL, 0,0,0,0, hWnd, *************** *** 70,74 **** "HCOMPOUND", NULL, ! WS_CHILD | WS_BORDER | WS_HSCROLL | WS_VSCROLL, 0,0,0,0, hWnd, --- 95,99 ---- "HCOMPOUND", NULL, ! WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | WS_VSCROLL, 0,0,0,0, hWnd, *************** *** 87,91 **** case WM_PAINT: { - RECT rects[3]; PAINTSTRUCT ps; HDC hDC = BeginPaint(hWnd, &ps); --- 112,115 ---- *************** *** 122,129 **** break; case WM_ERASEBKGND: ! return NULL; case WM_SIZE: RelayoutPanes(hWnd, pData); break; } --- 146,198 ---- break; case WM_ERASEBKGND: ! return (LRESULT) NULL; case WM_SIZE: RelayoutPanes(hWnd, pData); break; + case WM_LBUTTONDOWN: + pos.x = GET_X_LPARAM(lParam); + pos.y = GET_Y_LPARAM(lParam); + CalcPaneRects(hWnd, pData, rects); + + if (PtInRect(&rects[0],pos)) + { + pData->bInDragMode = TRUE; + SetCapture(hWnd); + + if (GetWindowLong(hWnd, GWL_STYLE) & CCS_VERT) + SetCursor(LoadCursor(NULL, IDC_SIZENS)); + else + SetCursor(LoadCursor(NULL, IDC_SIZEWE)); + } + break; + case WM_LBUTTONUP: + ReleaseCapture(); + break; + case WM_MOUSEMOVE: + pos.x = GET_X_LPARAM(lParam); + pos.y = GET_Y_LPARAM(lParam); + CalcPaneRects(hWnd, pData, rects); + + if (pData->bInDragMode) + { + if (GetWindowLong(hWnd, GWL_STYLE) & CCS_VERT) + UpdateSplitterPos(hWnd, pData, pos.y); + else + UpdateSplitterPos(hWnd, pData, pos.x); + } + + if (PtInRect(&rects[0],pos)) + { + if (GetWindowLong(hWnd, GWL_STYLE) & CCS_VERT) + SetCursor(LoadCursor(NULL, IDC_SIZENS)); + else + SetCursor(LoadCursor(NULL, IDC_SIZEWE)); + } + else + SetCursor(LoadCursor(NULL, IDC_ARROW)); + break; + case WM_CAPTURECHANGED: + pData->bInDragMode = FALSE; + break; } *************** *** 147,153 **** ); ! pData = (SplitterData *) GetWindowLong(splitter, GWL_USERDATA); panes[0] = pData->hCtrl1; ! panes[2] = pData->hCtrl2; return checkWindow(hSplitter, "HSPLITTER"); --- 216,222 ---- ); ! pData = (SplitterData *) GetWindowLong(hSplitter, GWL_USERDATA); panes[0] = pData->hCtrl1; ! panes[1] = pData->hCtrl2; return checkWindow(hSplitter, "HSPLITTER"); *************** *** 162,173 **** void osGetSplitterRange(WindowHandle splitter, int *range) { } void osSetSplitterPosition(WindowHandle splitter, int pos) { } int osGetSplitterPosition(WindowHandle splitter) { ! return 0; } --- 231,252 ---- void osGetSplitterRange(WindowHandle splitter, int *range) { + RECT rect; + GetClientRect(splitter, &rect); + range[0] = 0; + if (GetWindowLong(splitter, GWL_STYLE) & CCS_VERT) + range[1] = rect.bottom-rect.top; + else + range[1] = rect.right-rect.left; } void osSetSplitterPosition(WindowHandle splitter, int pos) { + SplitterData *pData = (SplitterData *) GetWindowLong(splitter, GWL_USERDATA); + UpdateSplitterPos(splitter, pData, pos); } int osGetSplitterPosition(WindowHandle splitter) { ! SplitterData *pData = (SplitterData *) GetWindowLong(splitter, GWL_USERDATA); ! return pData->nSplitterPos; } |