我的申请中有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) ;
}
}