/* Invalidate, using window coordinates */ static void WM_InvalidateBWin1(WM_HWIN hWin, const GUI_RECT*pRect) { GUI_RECT r; WM_Obj* pWin = WM_H2P(hWin); WM__GetClientRectWin(pWin, &r); if (pRect) GUI__IntersectRect(&r, pRect); if (WM__RectIsNZ(&r)) { if (pWin->Status & WM_SF_INVALID) { GUI_MergeRect(&pWin->InvalidRect, &pWin->InvalidRect, &r); } else { pWin->InvalidRect = r; pWin->Status |= WM_SF_INVALID; WM__NumInvalidWindows++; /* Debug code: shows invalid areas */ #if (WM_SHOW_INVALID) { GUI_CONTEXT Context = GUI_Context; WM_SelectWindow(hWin); GUI_SetBkColor(GUI_GREEN); GUI_ClearRect(r.x0, r.y0, r.x1, r.y1); GUI_Context = Context; } #endif } } }
/********************************************************************* * * PROGBAR_SetText */ void PROGBAR_SetText(PROGBAR_Handle hObj, const char* s) { if (hObj) { PROGBAR_Obj* pObj; const GUI_FONT GUI_UNI_PTR * pOldFont; GUI_RECT r1; char acBuffer[5]; WM_LOCK(); pObj = PROGBAR_H2P(hObj); pOldFont = GUI_SetFont(pObj->Props.pFont); PROGBAR__GetTextRect(pObj, &r1, PROGBAR__GetText(pObj, acBuffer)); if (!s) { PROGBAR__FreeText(hObj); WM_InvalidateRect(hObj, &r1); } else { if (GUI__SetText(&pObj->hpText, s)) { GUI_RECT r2; PROGBAR__GetTextRect(pObj, &r2, PROGBAR__GetText(pObj, acBuffer)); GUI_MergeRect(&r1, &r1, &r2); WM_InvalidateRect(hObj, &r1); } } GUI_SetFont(pOldFont); WM_UNLOCK(); } }
/********************************************************************* * * PROGBAR_SetValue */ void PROGBAR_SetValue(PROGBAR_Handle hObj, int v) { if (hObj) { PROGBAR_Obj* pObj; WM_LOCK(); pObj= PROGBAR_H2P(hObj); /* Put v into legal range */ if (v < pObj->Min) { v = pObj->Min; } if (v > pObj->Max) { v = pObj->Max; } if (pObj->v != v) { GUI_RECT r; /* Get x values */ if (v < pObj->v) { r.x0 = _Value2X(pObj, v); r.x1 = _Value2X(pObj, pObj->v); } else { r.x0 = _Value2X(pObj, pObj->v); r.x1 = _Value2X(pObj, v); } r.y0 = 0; r.y1 = 4095; if (pObj->hpText == 0) { const GUI_FONT GUI_UNI_PTR * pOldFont; char acBuffer[5]; GUI_RECT rText; pOldFont = GUI_SetFont(pObj->pFont); _GetTextRect(pObj, &rText, _GetText(pObj, acBuffer)); GUI_MergeRect(&r, &r, &rText); pObj->v = v; _GetTextRect(pObj, &rText, _GetText(pObj, acBuffer)); GUI_MergeRect(&r, &r, &rText); GUI_SetFont(pOldFont); } else { pObj->v = v; } WM_InvalidateRect(hObj, &r); } WM_UNLOCK(); } }
int GUI_MEMDEV_DrawAuto(GUI_AUTODEV * pAutoDev, GUI_AUTODEV_INFO * pAutoDevInfo, GUI_CALLBACK_VOID_P * pfDraw, void * pData) { GUI_RECT rTemp; GUI_HMEM hMem = GUI_MEASDEV_Create(); if (!hMem) { return 1; } GUI_MEASDEV_Select(hMem); /* Measure area to draw */ if (pAutoDev->FirstCall) { /* Measure complete area */ pAutoDevInfo->DrawFixed = 1; pfDraw(pData); GUI_MEASDEV_GetRect(hMem, &pAutoDev->rView); /* Measure variable area only */ GUI_MEASDEV_ClearRect(hMem); pAutoDevInfo->DrawFixed = 0; pfDraw(pData); GUI_MEASDEV_GetRect(hMem, &pAutoDev->rPrev); } else { /* Measure variable area only */ pfDraw(pData); GUI_MEASDEV_GetRect(hMem, &pAutoDev->rView); rTemp = pAutoDev->rView; GUI_MergeRect(&pAutoDev->rView, &pAutoDev->rView, &pAutoDev->rPrev); pAutoDev->rPrev = rTemp; } GUI_MEASDEV_Delete(hMem); /* Do the actual drawing */ pAutoDevInfo->DrawFixed = 1; if (GUI_MEMDEV_Draw(&pAutoDev->rView, pfDraw, pData, 0, GUI_MEMDEV_NOTRANS)) { return 1; } pAutoDevInfo->DrawFixed = 0; pAutoDev->FirstCall = 0; return 0; }