ucGUI库的版本是3.94,LISTVIEW里没有设置显示图标的功能。自己加了一个方法来显示。
作了如下的几点修改可以了。
1:修改LISTVIEW_ITEM结构,新增一个变量记录bmp图标。
typedef struct {
WM_HMEM hItemInfo;
WM_HMEM hDrawObj;
char acText[1];
} LISTVIEW_ITEM;
2:新增一个设置图标的方法。
/********************
参数里指定行列和图标
********************/
void LISTVIEW_SetItemBmp(LISTVIEW_Handle hObj, unsigned Column, unsigned Row, const GUI_BITMAP* pBitmap) {
if (hObj) {
if ((Column < LISTVIEW_GetNumColumns(hObj)) && (Row < LISTVIEW_GetNumRows(hObj))) {
int NumBytes = 0;
LISTVIEW_ITEM * pItem;
LISTVIEW_Obj * pObj;
WM_LOCK();
pObj = LISTVIEW_H2P(hObj);
//NumBytes = GUI__strlen(s) + 1;
pItem = (LISTVIEW_ITEM *)GUI_ARRAY_ResizeItem((GUI_ARRAY *)GUI_ARRAY_GetpItem(&pObj->RowArray, Row), Column, sizeof(LISTVIEW_ITEM) + NumBytes);
if (pItem) {
GUI_ALLOC_FreePtr(&pItem->hDrawObj);
pItem->hDrawObj = GUI_DRAW_BITMAP_Create(pBitmap,0,0);
}
LISTVIEW__InvalidateRow(hObj, pObj, Row);
WM_UNLOCK();
}
}
}
3:修改LISTVIEW的更新方法。
红色字体里的就是我加的
/*********************************************************************
*
* _Paint
*/
static void _Paint(LISTVIEW_Handle hObj, LISTVIEW_Obj* pObj, WM_MESSAGE* pMsg) {
const GUI_ARRAY* pRow;
GUI_RECT ClipRect, Rect;
int NumRows, NumVisRows, NumColumns;
int LBorder, RBorder, EffectSize;
int xPos, yPos, Width, RowDistY;
int Align, i, j, EndRow;
/* Init some values */
NumColumns = HEADER_GetNumItems(pObj->hHeader);
NumRows = GUI_ARRAY_GetNumItems(&pObj->RowArray);
NumVisRows = _GetNumVisibleRows(hObj, pObj);
RowDistY = LISTVIEW__GetRowDistY(pObj);
LBorder = pObj->LBorder;
RBorder = pObj->RBorder;
EffectSize = pObj->Widget.pEffect->EffectSize;
yPos = HEADER_GetHeight(pObj->hHeader) + EffectSize;
EndRow = pObj->ScrollStateV.v + (((NumVisRows + 1) > NumRows) ? NumRows : NumVisRows + 1);
/* Calculate clipping rectangle */
ClipRect = *(const GUI_RECT*)pMsg->Data.p;
GUI_MoveRect(&ClipRect, -pObj->Widget.Win.Rect.x0, -pObj->Widget.Win.Rect.y0);
WM_GetInsideRectExScrollbar(hObj, &Rect);
GUI__IntersectRect(&ClipRect, &Rect);
/* Set drawing color, font and text mode */
LCD_SetColor(pObj->Props.aTextColor[0]);
GUI_SetFont(pObj->Props.pFont);
GUI_SetTextMode(GUI_TM_TRANS);
/* Do the drawing */
for (i = pObj->ScrollStateV.v; i < EndRow; i++) {
pRow = (const GUI_ARRAY*)GUI_ARRAY_GetpItem(&pObj->RowArray, i);
if (pRow) {
Rect.y0 = yPos;
/* Break when all other rows are outside the drawing area */
if (Rect.y0 > ClipRect.y1) {
break;
}
Rect.y1 = yPos + RowDistY - 1;
/* Make sure that we draw only when row is in drawing area */
if (Rect.y1 >= ClipRect.y0) {
int ColorIndex;
/* Set background color */
if (i == pObj->Sel) {
ColorIndex = (pObj->Widget.State & WIDGET_STATE_FOCUS) ? 2 : 1;
} else {
ColorIndex = 0;
}
LCD_SetBkColor(pObj->Props.aBkColor[ColorIndex]);
/* Iterate over all columns */
if (pObj->ShowGrid) {
Rect.y1--;
}
xPos = EffectSize - pObj->ScrollStateH.v;
for (j = 0; j < NumColumns; j++) {
Width = HEADER_GetItemWidth(pObj->hHeader, j);
Rect.x0 = xPos;
/* Break when all other columns are outside the drawing area */
if (Rect.x0 > ClipRect.x1) {
break;
}
Rect.x1 = xPos + Width - 1;
/* Make sure that we draw only when column is in drawing area */
if (Rect.x1 >= ClipRect.x0) {
LISTVIEW_ITEM * pItem;
pItem = (LISTVIEW_ITEM *)GUI_ARRAY_GetpItem(pRow, j);
if (pItem->hItemInfo) {
LISTVIEW_ITEM_INFO * pItemInfo;
pItemInfo = (LISTVIEW_ITEM_INFO *)GUI_ALLOC_h2p(pItem->hItemInfo);
LCD_SetBkColor(pItemInfo->aBkColor[ColorIndex]);
LCD_SetColor(pItemInfo->aTextColor[ColorIndex]);
} else {
LCD_SetColor(pObj->Props.aTextColor[ColorIndex]);
}
/* Clear background */
GUI_ClearRect(Rect.x0, Rect.y0, Rect.x1, Rect.y1);
/* Draw text */
Rect.x0 += LBorder;
Rect.x1 -= RBorder;
Align = *((int*)GUI_ARRAY_GetpItem(&pObj->AlignArray, j));
//
if (pItem->hDrawObj) {
int xOff = 0, yOff = 0;
switch (Align) {
case GUI_TA_LEFT:
xOff = 0;
case GUI_TA_RIGHT:
xOff = (Rect.x1 - Rect.x0) - GUI_DRAW__GetXSize(pItem->hDrawObj) -1;
break;
case GUI_TA_HCENTER:
xOff = (Rect.x1 - Rect.x0)/2 - GUI_DRAW__GetXSize(pItem->hDrawObj)/2;
break;
}
switch (Align) {
case GUI_TA_TOP:
yOff = 0;
break;
case GUI_TA_BOTTOM:
yOff = (Rect.y1 - Rect.y0) - GUI_DRAW__GetYSize(pItem->hDrawObj) - 1;
break;
case GUI_TA_VCENTER:
yOff = (Rect.y1 - Rect.y0)/2 - GUI_DRAW__GetYSize(pItem->hDrawObj)/2;
break;
}
WM_SetUserClipRect(&Rect);
GUI_DRAW__Draw(pItem->hDrawObj,xPos+xOff,yPos+yOff);
WM_SetUserClipRect(NULL);
}else{
GUI_DispStringInRect(pItem->acText, &Rect, Align);
}
if (pItem->hItemInfo) {
LCD_SetBkColor(pObj->Props.aBkColor[ColorIndex]);
}
}
xPos += Width;
}
/* Clear unused area to the right of items */
if (xPos <= ClipRect.x1) {
GUI_ClearRect(xPos, Rect.y0, ClipRect.x1, Rect.y1);
}
}
yPos += RowDistY;
}
}
/* Clear unused area below items */
if (yPos <= ClipRect.y1) {
LCD_SetBkColor(pObj->Props.aBkColor[0]);
GUI_ClearRect(ClipRect.x0, yPos, ClipRect.x1, ClipRect.y1);
}
/* Draw grid */
if (pObj->ShowGrid) {
LCD_SetColor(pObj->Props.GridColor);
yPos = HEADER_GetHeight(pObj->hHeader) + EffectSize - 1;
for (i = 0; i < NumVisRows; i++) {
yPos += RowDistY;
/* Break when all other rows are outside the drawing area */
if (yPos > ClipRect.y1) {
break;
}
/* Make sure that we draw only when row is in drawing area */
if (yPos >= ClipRect.y0) {
GUI_DrawHLine(yPos, ClipRect.x0, ClipRect.x1);
}
}
xPos = EffectSize - pObj->ScrollStateH.v;
for (i = 0; i < NumColumns; i++) {
xPos += HEADER_GetItemWidth(pObj->hHeader, i);
/* Break when all other columns are outside the drawing area */
if (xPos > ClipRect.x1) {
break;
}
/* Make sure that we draw only when column is in drawing area */
if (xPos >= ClipRect.x0) {
GUI_DrawVLine(xPos, ClipRect.y0, ClipRect.y1);
}
}
}
/* Draw the effect */
WIDGET__EFFECT_DrawDown(&pObj->Widget);
}