/********************************************************************* * * _Paint */ static void _Paint(LISTBOX_Handle hObj) { int i; int Border; GUI_RECT r; int FontDistY; LISTBOX_Obj* pObj = LISTBOX_H2P(hObj); int NumItems = _GetNumItems(pObj); const GUI_ConstString* ppText = pObj->ppText; Border = pObj->Widget.pEffect->EffectSize; GUI_SetFont(pObj->pFont); FontDistY = GUI_GetFontDistY(); if (Border) { GUI_SetBkColor(pObj->aBackColor[0]); GUI_Clear(); } /* Calculate rect used for painting (subtract border) */ WM_GetClientRect(&r); r.x1 -= Border; r.y1 -= Border; r.y0 -= Border; WM_SetUserClipArea(&r); for (i = pObj->ScrollState.v; i < NumItems; i++) { int y, ColorIndex; y = Border + (i - pObj->ScrollState.v) * FontDistY; if (i == pObj->Sel) { ColorIndex = (pObj->Widget.State & WIDGET_STATE_FOCUS) ? 2 : 1; } else { ColorIndex = 0; } GUI_SetBkColor(pObj->aBackColor[ColorIndex]); GUI_SetColor (pObj->aTextColor[ColorIndex]); GUI_ClearRect(Border, y, Border, y + FontDistY -1); GUI_DispStringAt(*(ppText+i), Border+1, y); GUI_DispCEOL(); } WM_SetUserClipArea(NULL); /* Draw the 3D effect (if configured) */ WIDGET__EFFECT_DrawDown(&pObj->Widget); }
/********************************************************************* * * _OwnerDraw * * Purpose: * This is the owner draw function. * It allows complete customization of how the items in the listbox are * drawn. A command specifies what the function should do; * The minimum is to react to the draw command (WIDGET_ITEM_DRAW); * If the item x-size differs from the default, then this information * needs to be returned in reaction to WIDGET_ITEM_GET_XSIZE. * To insure compatibility with future version, all unhandled commands * must call the default routine LISTBOX_OwnerDraw. */ static int _OwnerDraw(const WIDGET_ITEM_DRAW_INFO * pDrawItemInfo) { WM_HWIN hWin; int Index; hWin = pDrawItemInfo->hWin; Index = pDrawItemInfo->ItemIndex; switch (pDrawItemInfo->Cmd) { case WIDGET_ITEM_GET_XSIZE: return _GetItemSizeX(hWin, Index); case WIDGET_ITEM_GET_YSIZE: return _GetItemSizeY(hWin, Index); case WIDGET_ITEM_DRAW: { int MultiSel, Sel, YSize, FontDistY; int IsDisabled, IsSelected; int ColorIndex = 0; char acBuffer[100]; const GUI_BITMAP * pBm; const GUI_FONT* pOldFont = 0; GUI_COLOR aColor[4] = {GUI_BLACK, GUI_WHITE, GUI_WHITE, GUI_GRAY}; GUI_COLOR aBkColor[4] = {GUI_WHITE, GUI_GRAY, GUI_BLUE, 0xC0C0C0}; IsDisabled = LISTBOX_GetItemDisabled(pDrawItemInfo->hWin, pDrawItemInfo->ItemIndex); IsSelected = LISTBOX_GetItemSel(hWin, Index); MultiSel = LISTBOX_GetMulti(hWin); Sel = LISTBOX_GetSel(hWin); YSize = _GetItemSizeY(hWin, Index); /* Calculate color index */ if (MultiSel) { if (IsDisabled) { ColorIndex = 3; } else { ColorIndex = (IsSelected) ? 2 : 0; } } else { if (IsDisabled) { ColorIndex = 3; } else { if (pDrawItemInfo->ItemIndex == Sel) { ColorIndex = WM_HasFocus(pDrawItemInfo->hWin) ? 2 : 1; } else { ColorIndex = 0; } } } /* Draw item */ GUI_SetBkColor(aBkColor[ColorIndex]); GUI_SetColor (aColor[ColorIndex]); LISTBOX_GetItemText(pDrawItemInfo->hWin, pDrawItemInfo->ItemIndex, acBuffer, sizeof(acBuffer)); GUI_Clear(); if ((ColorIndex == 1) || (ColorIndex == 2)) { pOldFont = GUI_SetFont(&GUI_Font13B_1); } FontDistY = GUI_GetFontDistY(); GUI_DispStringAt(acBuffer, pDrawItemInfo->x0 + bmSmilie0.XSize + 16, pDrawItemInfo->y0 + (YSize - FontDistY) / 2); if (pOldFont) { GUI_SetFont(pOldFont); } GUI_DispCEOL(); /* Draw bitmap */ pBm = MultiSel ? IsSelected ? &bmSmilie1 : &bmSmilie0 : (pDrawItemInfo->ItemIndex == Sel) ? &bmSmilie1 : &bmSmilie0; GUI_DrawBitmap(pBm, pDrawItemInfo->x0 + 7, pDrawItemInfo->y0 + (YSize - pBm->YSize) / 2); /* Draw focus rectangle */ if (MultiSel && (pDrawItemInfo->ItemIndex == Sel)) { GUI_RECT rFocus; GUI_RECT rInside; WM_GetInsideRectEx(pDrawItemInfo->hWin, &rInside); rFocus.x0 = pDrawItemInfo->x0; rFocus.y0 = pDrawItemInfo->y0; rFocus.x1 = rInside.x1; rFocus.y1 = pDrawItemInfo->y0 + YSize - 1; GUI_SetColor(GUI_WHITE - aBkColor[ColorIndex]); GUI_DrawFocusRect(&rFocus, 0); } } break; default: return LISTBOX_OwnerDraw(pDrawItemInfo); } return 0; }
void GUI_DispStringAtCEOL(const char GUI_FAR *s, int x, int y) { GUI_DispStringAt(s,x,y); GUI_DispCEOL(); }