DrawItem()在MFC CListCtrl()中显示空列表

时间:2019-02-13 12:52:24

标签: mfc clistctrl

我的申请中有CListCtrl。我正在通过CListCtrl从链接列表中将数据加载到此OnTimer()

我想在其中一列中显示闪烁效果,因此我为此DrawItem()添加了CListCtrl。添加后,即使OnTimer()也可以正常工作。数据不会显示在CListCtrl中。

我添加了一些用于文本对齐的代码(从CodeProject中获得),现在显示数据。但是该复选框不可见。甚至我都为复选框添加了样式。

是否可以使用DrawItem()在特定单元格的列和背景颜色闪烁中添加复选框?

pAlrmListBox->Create(WS_CHILD | WS_VISIBLE  | WS_VSCROLL|  LVS_REPORT |LVS_OWNERDRAWFIXED , CRect(0,0,600,400), this, ID_ALARMLIST);
pAlrmListBox->SetExtendedStyle(pAlrmListBox->GetExtendedStyle()| LVS_EX_CHECKBOXES | LVS_EX_HEADERDRAGDROP | LVS_EX_FULLROWSELECT| LVS_EX_ONECLICKACTIVATE  );
pAlrmListBox->InsertColumn(0,_T("Ack"),LVCFMT_LEFT,50);
        pAlrmListBox->InsertColumn(1,_T("Priority"),LVCFMT_LEFT,50);
        pAlrmListBox->InsertColumn(2,_T("State"),LVCFMT_LEFT,100);
        pAlrmListBox->InsertColumn(3,_T("ActiveTime"),LVCFMT_RIGHT,200);
        pAlrmListBox->InsertColumn(4,_T("Name"),LVCFMT_RIGHT,200);
        pAlrmListBox->InsertColumn(5,_T("Description"),LVCFMT_RIGHT,300);
        pAlrmListBox->InsertColumn(6,_T("Condition"),LVCFMT_LEFT,100);
        pAlrmListBox->InsertColumn(7,_T("SubCondition"),LVCFMT_LEFT,100);

OnTimer()中:

    lvItem.mask = LVIF_IMAGE | LVIF_TEXT;
    lvItem.iItem = iAlarmCount;
    lvItem.iSubItem = 0;                            

    sAlrm.Format("%d",iListItem+1);
    LPSTR OriginChar =  sAlrm.GetBuffer(sAlrm.GetLength());
    lvItem.pszText = "";

    nItem = InsertItem(&lvItem);    

    sAlrm.Format("%d",pTag->GetTagMark());
    SetItemText(nItem, 1,sAlrm);   
     SetItemText(nItem, 2,"ACT");                               
    SetItemText(nItem, 3,pAlrmDisp->tAlmTime.Format("%d %H:%M:%S"));                                                                                    
    SetItemText(nItem, 4,pTag->GetTagName());                                                                               
    SetItemText(nItem, 5,pTag->GetDescription());                                           
    SetItemText(nItem, 6,"Variable");                                   
    SetItemText(nItem, 7,pAlrmDisp->sAlmStatus);
    sAlrm.Format("%s",pAlrmDisp->sAlmStatus);
if(sAlrm.Mid(0,2) == "LL" || sAlrm.Mid(0,2) == "HH" || sAlrm.Mid(0,2) == "AL" ){
SetCellColor(RGB(255,0,0),nItem,1);                                                                 
}
if(sAlrm.Mid(0,2) == "LO" || sAlrm.Mid(0,2) == "HI"){
SetCellColor(RGB(255,255,0),nItem,1);               
}   

我们可以通过为每列定义矩形来在DrawItem()中添加文本吗?我尝试了此选项,但第4列之后未添加该项目,第5列数据被置于第3列。

因此,我删除了该信息并在OnTimer()中添加了数据,但是我想在第一列中获得复选框,并在第二列中获得闪烁效果。我该怎么办?

void CColorListCtrl::DrawItem(LPDRAWITEMSTRUCT lpDIS)
{

    TCHAR  lpBuffer[1000];
     LV_ITEM lvi;
     lvi.mask = LVIF_TEXT | LVIF_PARAM ;
     lvi.iItem = lpDIS->itemID ;  
     lvi.iSubItem = 0;
     lvi.pszText = lpBuffer ;
     lvi.cchTextMax = sizeof(lpBuffer);
     VERIFY(GetItem(&lvi));
     LV_COLUMN lvc, lvcprev ;
     ::ZeroMemory(&lvc, sizeof(lvc));
     ::ZeroMemory(&lvcprev, sizeof(lvcprev));
     lvc.mask = LVCF_WIDTH |LVCF_FMT;
     lvcprev.mask = LVCF_WIDTH | LVCF_FMT;

    int iListItem = lpDIS->itemID;

    CRect rcItem(lpDIS->rcItem);
    CDC* pDC;
    pDC = CDC::FromHandle(lpDIS->hDC);

    int nCol;
            for ( nCol=1; GetColumn(nCol, &lvc); nCol++)
                {
                      if ( nCol > 0 ) 
                      {
                       // Get Previous Column Width in order to move the next display item   
                       GetColumn(nCol-1, &lvcprev) ;
                       lpDIS->rcItem.left += lvcprev.cx ;
                       lpDIS->rcItem.right += lpDIS->rcItem.left ; 
                      }
                      // Get the text 
                      ::ZeroMemory(&lvi, sizeof(lvi));
                      lvi.iItem = lpDIS->itemID;
                      lvi.mask = LVIF_TEXT | LVIF_PARAM;
                      lvi.iSubItem = nCol;
                      lvi.pszText = lpBuffer;
                      lvi.cchTextMax = sizeof(lpBuffer);
                      VERIFY(GetItem(&lvi));
                      pDC->SelectObject(GetStockObject(DEFAULT_GUI_FONT));
                      UINT  uFormat    = DT_LEFT ;
                      ::DrawText(lpDIS->hDC, lpBuffer, strlen(lpBuffer), 
                                              &lpDIS->rcItem, uFormat) ;
                      pDC->SelectStockObject(SYSTEM_FONT) ;
            }

}   

0 个答案:

没有答案