硬汉嵌入式论坛

 找回密码
 立即注册
查看: 616|回复: 5
收起左侧

[emWin] listview的聚焦能否改为矩形框

[复制链接]

76

主题

208

回帖

436

积分

高级会员

积分
436
发表于 2023-3-22 08:51:52 | 显示全部楼层 |阅读模式
请教大家,emwin的listview 能否改成像exel这种聚焦形式(图1),而不是默认的这种(图2),自己尝试 LISTVIEW_SetOwnerDraw 没成功。。

图1

图1

图2

图2
回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2023-3-22 09:25:14 | 显示全部楼层
OwerDraw里面有背景绘制,测试绘制边框
代码不规范,亲人两行泪!
回复

使用道具 举报

76

主题

208

回帖

436

积分

高级会员

积分
436
 楼主| 发表于 2023-3-22 09:56:15 | 显示全部楼层
本帖最后由 薪火相传 于 2023-3-22 09:58 编辑
missfox 发表于 2023-3-22 09:25
OwerDraw里面有背景绘制,测试绘制边框
这样设置也是没效果
  1. static int  listview_owner_draw(const WIDGET_ITEM_DRAW_INFO * pDrawItemInfo)
  2. {
  3.     switch (pDrawItemInfo->Cmd)
  4.     {
  5.     case WIDGET_DRAW_BACKGROUND:
  6.         GUI_SetColor(GUI_BLUE);
  7.         GUI_DrawRoundedFrame(pDrawItemInfo->x0,pDrawItemInfo->y0,pDrawItemInfo->x1,pDrawItemInfo->y1,0,2);
  8.    
  9.         break;
  10.     default:
  11.         return LISTVIEW_OwnerDraw(pDrawItemInfo);
  12.     }
  13.     return 0;
  14. }
复制代码
  1. LISTVIEW_SetOwnerDraw(hitem,listview_owner_draw);
复制代码
回复

使用道具 举报

76

主题

208

回帖

436

积分

高级会员

积分
436
 楼主| 发表于 2023-3-23 09:39:21 | 显示全部楼层
这样基本能实现,唯一的问题是listview没有提供获取某个item的背景颜色API
[C] 纯文本查看 复制代码
static int  listview_owner_draw(const WIDGET_ITEM_DRAW_INFO * pItem)
{
    switch (pItem->Cmd)
    {
    case WIDGET_ITEM_DRAW_BACKGROUND:
    {
        GUI_RECT rect;
        char txt_buf[50] = {0};
        rect.x0 = pItem->x0;
        rect.x1 = pItem->x1;
        rect.y0 = pItem->y0;
        rect.y1 = pItem->y1;
        GUI_SetBkColor(GUI_BLACK);
        GUI_ClearRectEx(&rect);  

        int row = LISTVIEW_GetSel(pItem->hWin);
        int col = LISTVIEW_GetSelCol(pItem->hWin);
        if( ( (pItem->ItemIndex) ==  row) && (pItem->Col == col) )
        {
            GUI_SetColor(GUI_BLUE);
            GUI_DrawRoundedFrame(pItem->x0,pItem->y0,pItem->x1,pItem->y1,0,3);
        }
        else
        {
            GUI_SetColor(GUI_DARKGRAY);
            GUI_DrawRoundedFrame(pItem->x0,pItem->y0,pItem->x1,pItem->y1,0,1);
        }
        LISTVIEW_GetItemText(pItem->hWin,pItem->Col,pItem->ItemIndex, txt_buf, 50);
        GUI_SetFont(LISTVIEW_GetFont(pItem->hWin));
        GUI_SetTextMode(GUI_TM_TRANS);
        GUI_SetColor(GUI_WHITE);
        
        int chb_align  = LISTVIEW_GetTextAlign(pItem->hWin,pItem->Col);
        GUI_DispStringInRect(txt_buf, &rect, chb_align);
        
    }
        break;
    case WIDGET_ITEM_DRAW:
    {
        
    }
        break;
    
    
//    default:
//        return LISTVIEW_OwnerDraw(pItem);
    }
    return 0;
}
回复

使用道具 举报

0

主题

10

回帖

10

积分

新手上路

积分
10
发表于 2023-3-23 13:07:56 | 显示全部楼层
薪火相传 发表于 2023-3-23 09:39
这样基本能实现,唯一的问题是listview没有提供获取某个item的背景颜色API
[mw_shl_code=c,true]static in ...

设置私有数据呗,定义一个结构体,比如
typedef struct{ GUI_COLOR BK_color, select_color,unselect_color}private_data_typedef,
用ListViewCreate(......,sizeof(private_data_typedef));来创建更多的内存存放你的自定义数据
用ListViewSetUserData(&private_data,sizeof(private_data_typedef));将自己定义的颜色等数据传入到控件
在OwerDraw里面使用ListViewGetUserData(&private_data,sizeof(private_data_typedef));获取你定义的颜色。
然后再调用2D绘图、
回复

使用道具 举报

76

主题

208

回帖

436

积分

高级会员

积分
436
 楼主| 发表于 2023-3-31 09:57:05 | 显示全部楼层
Javen 发表于 2023-3-23 13:07
设置私有数据呗,定义一个结构体,比如
typedef struct{ GUI_COLOR BK_color, select_color,unselect_co ...

不错
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-9 16:21 , Processed in 0.170632 second(s), 27 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表