动态改变listctrl 单元格背景及文字颜色(非重写控件)

CListCtrl 类里面没有直接改变单元格背景及文字颜色的成员函数,只有改变整个背景的颜色。我有时候只是需要把某个单元格的颜色改变来突出显示就可以了:

我们可以通过重载ListCtrl控件的Customdraw 消息,然后在里面写一些代码就可以了;

void CGPRSDlg::OnNMCustomdrawListshow(NMHDR *pNMHDR, LRESULT *pResult)
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>(pNMHDR);
// TODO: Add your control notification handler code here
*pResult = CDRF_DODEFAULT;

    if ( CDDS_PREPAINT ==pLVCD->nmcd.dwDrawStage )
    {
        *pResult = CDRF_NOTIFYITEMDRAW;
    }
    else if ( CDDS_ITEMPREPAINT == pLVCD->nmcd.dwDrawStage )
    {
        // This is the notification message for an item. We'll request
        // notifications before each subitem's prepaint stage.
  
        *pResult = CDRF_NOTIFYSUBITEMDRAW;
    }
    else if ( (CDDS_ITEMPREPAINT | CDDS_SUBITEM) == pLVCD->nmcd.dwDrawStage )
    {
        COLORREF clrNewTextColor, clrNewBkColor;
int nItem=static_cast<int>(pLVCD->nmcd.dwItemSpec );
CString strTemp=m_listshow.GetItemText(nItem,pLVCD->iSubItem ); 
switch(pLVCD->iSubItem)
{
         case 11:    
case 12:
case 13:     
case 14:     
case 15:      
         { 
             if(strcmp(strTemp,"ON")==0)
      {
               clrNewTextColor = RGB(0,255,0);
        clrNewBkColor = RGB(255,255,255);
      }
      if(strcmp(strTemp,"OFF")==0)
      {
                clrNewTextColor = RGB(122,122,122);
         clrNewBkColor = RGB(255,255,255);
      }
              pLVCD->clrText =clrNewTextColor;
       pLVCD->clrTextBk =clrNewBkColor;
       *pResult = CDRF_DODEFAULT;
       break;
   }    
default:
pLVCD->clrText = RGB(0,0,0);
pLVCD->clrTextBk = RGB(255,255,255);
*pResult = CDRF_DODEFAULT;
break;
    } 
}
上面的代码中pLVCD->nmcd.dwItemSpec : 意思是listctrl 第几行的索引值;

pLVCD->iSubItem :意思是某行的某列的索引值,通过这两个值我们就可以知道,现在要改的是哪个单元格了。

然后pLVCD->clrText 是这个单元格的文本颜色;

pLVCD->clrTextBk是这个单元格的背景颜色;

我们是如果这个是我们需要改的我们就给它一个新值,如果不是我们要改的我们就给他默认值。这样就

可以改变我们的单元格的颜色了。

下面我们可以给一个实际的例子,比如我们的ListCtrl是一个显示某台设备的参数的值,这些参数我们接收过来后,我们可以做一个判断,如果某项参数超过我们设定的报警值我们可以改变它的颜色来突出显示这个参数,这样岂不更直观;

。。。。。。

case 7:
      {
       if(strTemp>paravalue1 || strTemp<paravalue2)
       {
             clrNewTextColor = RGB(255,0,0);
               clrNewBkColor = RGB(255,255,255);
       }
       else
       {
              clrNewTextColor = RGB(0,0,0);
              clrNewBkColor = RGB(255,255,255);
       }
          pLVCD->clrText =clrNewTextColor;
           pLVCD->clrTextBk =clrNewBkColor;
        *pResult = CDRF_DODEFAULT;
             break;
      }

。。。。。。

当我们接受的一项参数在我们设置的报警值范围我们就把这个参数用红色字体显示出来。Ok这样就可以动态显示了;如果觉得这样还不方便,我们可以重写CListCtrl类,然后里面增加一个改变单元格颜色的成员函数,就可以更方便了;

如果大家有什么更好的建议,大家共同商量

改变listctrl单元格背景文字颜色,可以按照以下步骤进行: 1. 首先,我们需要为listctrl添加一个自定义的绘制器(custom class)。这可以通过继承listctrl的wx.ListCtrl类,并重写其中的OnItemAttr方法来实现。 2. 在自定义的绘制器类中,我们可以通过设置wx.ListItem的不同属性来改变特定单元格背景文字颜色。例如,可以使用SetBackgroundColour和SetTextColour方法来设置特定单元格背景文字颜色。 3. 然后,我们需要将listctrl与自定义的绘制器关联起来。可以使用SetCustomAttrProvider方法将自定义的绘制器类实例与listctrl相关联。 4. 最后,在listctrl中添加项目时,我们可以为每个单元格设置不同的背景文字颜色。可以通过使用wx.ListCtrl的SetItem方法设置特定单元格的wx.ListItem的属性。 下面是一个示例代码,展示了如何改变listctrl单元格背景文字颜色: ```python import wx class CustomListCtrl(wx.ListCtrl): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.attrProvider = CustomAttrProvider() self.SetCustomAttrProvider(self.attrProvider) class CustomAttrProvider(wx.ListItemAttrProvider): def __init__(self): super().__init__() self.attr = wx.ListItemAttr() def OnItemAttr(self, item): return self.attr def SetAttr(self, item, attr): self.attr = attr class MyFrame(wx.Frame): def __init__(self): super().__init__(None, title='ListCtrl示例', size=(400, 300)) panel = wx.Panel(self) sizer = wx.BoxSizer(wx.VERTICAL) listctrl = CustomListCtrl(panel, style=wx.LC_REPORT) listctrl.InsertColumn(0, '姓名') listctrl.InsertColumn(1, '年龄') # 设置第一行单元格背景文字颜色 item1 = wx.ListItem() item1.SetText('张三') item1.SetColumn(0) itemAttr1 = wx.ListItemAttr() itemAttr1.SetBackgroundColour(wx.RED) itemAttr1.SetTextColour(wx.WHITE) listctrl.SetItem(item1) listctrl.SetItemAttr(itemAttr1) # 设置第二行单元格背景文字颜色 item2 = wx.ListItem() item2.SetText('李四') item2.SetColumn(0) itemAttr2 = wx.ListItemAttr() itemAttr2.SetBackgroundColour(wx.GREEN) itemAttr2.SetTextColour(wx.BLACK) listctrl.SetItem(item2) listctrl.SetItemAttr(itemAttr2) sizer.Add(listctrl, 1, wx.EXPAND) panel.SetSizer(sizer) if __name__ == '__main__': app = wx.App() frame = MyFrame() frame.Show() app.MainLoop() ``` 在这个示例中,我们创建了一个自定义的ListCtrl类CustomListCtrl,以及一个自定义的绘制器类CustomAttrProvider。然后,我们在自定义的ListCtrl中关联了CustomAttrProvider。在MyFrame的init方法中,我们创建了一个CustomListCtrl,并为其中的单元格设置不同的背景文字颜色。运行代码后,你将看到listctrl中的单元格背景文字颜色已经改变了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值