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