From: <kr_...@us...> - 2004-05-17 06:20:01
|
Update of /cvsroot/htoolkit/port/src/cbits/Win32 In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv352/cbits/Win32 Added Files: Splitter.c Log Message: Add missing files --- NEW FILE: Splitter.c --- #include "Splitter.h" #include "Internals.h" #include "Handlers_stub.h" typedef struct { int nSplitterPos; HWND hCtrl1, hCtrl2; } SplitterData; #define SPLIT_LINE_SIZE 6 static void CalcPaneRects(HWND hWnd, SplitterData *pData, RECT *rects) { GetClientRect(hWnd, &rects[0]); rects[1] = rects[0]; rects[2] = rects[0]; if (GetWindowLong(hWnd, GWL_STYLE) & CCS_VERT) { rects[0].top = pData->nSplitterPos-(SPLIT_LINE_SIZE-2)/2; rects[0].bottom = pData->nSplitterPos+(SPLIT_LINE_SIZE-2)/2; rects[1].bottom = pData->nSplitterPos-SPLIT_LINE_SIZE/2; rects[2].top = pData->nSplitterPos+SPLIT_LINE_SIZE/2; } else { rects[0].left = pData->nSplitterPos-(SPLIT_LINE_SIZE-2)/2; rects[0].right = pData->nSplitterPos+(SPLIT_LINE_SIZE-2)/2; rects[1].right = pData->nSplitterPos-SPLIT_LINE_SIZE/2; rects[2].left = pData->nSplitterPos+SPLIT_LINE_SIZE/2; } } static void RelayoutPanes(HWND hWnd, SplitterData *pData) { RECT rects[3]; CalcPaneRects(hWnd, pData, rects); if (pData->hCtrl1) MoveWindow(pData->hCtrl1, rects[1].left, rects[1].top, rects[1].right-rects[1].left, rects[1].bottom-rects[1].top, TRUE); 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); } LRESULT CALLBACK HSplitterFunction(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { SplitterData *pData = (SplitterData *) GetWindowLong(hWnd, GWL_USERDATA); switch (uMsg) { case WM_CREATE: { pData = malloc(sizeof(SplitterData)); pData->nSplitterPos = 100; pData->hCtrl1 = NULL; pData->hCtrl2 = NULL; SetWindowLong(hWnd, GWL_USERDATA, (LONG) pData); } break; case WM_DESTROY: free(pData); break; case WM_PAINT: { RECT rects[3]; PAINTSTRUCT ps; HDC hDC = BeginPaint(hWnd, &ps); CalcPaneRects(hWnd, pData, rects); FillRect(hDC, &rects[0], GetSysColorBrush(COLOR_BTNFACE)); if (GetWindowLong(hWnd, GWL_STYLE) & CCS_VERT) { MoveToEx(hDC, rects[0].left, rects[0].top-1, NULL); LineTo(hDC, rects[0].right, rects[0].top-1); MoveToEx(hDC, rects[0].left, rects[0].bottom+1, NULL); LineTo(hDC, rects[0].right, rects[0].bottom+1); } else { MoveToEx(hDC, rects[0].left-1, rects[0].top, NULL); LineTo(hDC, rects[0].left-1, rects[0].bottom); MoveToEx(hDC, rects[0].right+1, rects[0].top, NULL); LineTo(hDC, rects[0].right+1, rects[0].bottom); } if (!pData->hCtrl1) FillRect(hDC, &rects[1], GetSysColorBrush(COLOR_BTNFACE)); if (!pData->hCtrl2) FillRect(hDC, &rects[2], GetSysColorBrush(COLOR_BTNFACE)); EndPaint(hWnd, &ps); } break; case WM_ERASEBKGND: return NULL; case WM_SIZE: RelayoutPanes(hWnd, pData); break; } return DefWindowProc(hWnd, uMsg, wParam, lParam); } WindowHandle osCreateHorzSplitter(WindowHandle window) { HWND hSplitter; hSplitter = CreateWindow( "HSPLITTER", NULL, WS_CHILD | WS_TABSTOP, 0,0,0,0, window, NULL, ghModule, NULL ); return checkWindow(hSplitter, "HSPLITTER"); } WindowHandle osCreateVertSplitter(WindowHandle window) { HWND hSplitter; hSplitter = CreateWindow( "HSPLITTER", NULL, WS_CHILD | WS_TABSTOP | CCS_VERT, 0,0,0,0, window, NULL, ghModule, NULL ); return checkWindow(hSplitter, "HSPLITTER"); } void osGetSplitterReqSize(WindowHandle splitter, int *res) { res[0] = 100; res[1] = 100; } void osSetSplitterChildren(WindowHandle splitter, WindowHandle child1, WindowHandle child2) { SplitterData *pData = (SplitterData *) GetWindowLong(splitter, GWL_USERDATA); pData->hCtrl1 = child1; pData->hCtrl2 = child2; RelayoutPanes(splitter, pData); InvalidateRect(splitter,NULL,TRUE); } |