DrawItem () отображает пустой список в MFC CListCtrl () - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть 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) ;
            }

}   
...