В моем приложении MFC я добавляю CListCtrl
в мой класс View, используя функцию OnCreate()
. У меня есть 10 столбцов и 8 строк в этой таблице. Я хочу включить флажок во втором столбце.
Мой код
int CTrendView::OnCreate(LPCREATESTRUCT l)
{
m_ctLstCtrl.Create(WS_CHILD | WS_VISIBLE | LVS_REPORT ,listRect, this, IDC_TRENDLISTCTRL);
m_ctLstCtrl.SetExtendedStyle(m_ctLstCtrl.GetExtendedStyle() | LVS_EX_GRIDLINES| LVS_EX_FULLROWSELECT| LVS_EX_ONECLICKACTIVATE );
m_ctLstCtrl.SetBkColor(RGB(255,255,255));
m_ctLstCtrl.SetTextColor(RGB(0,0,0));
m_ctLstCtrl.SetTextBkColor(RGB(255,255,255));
m_ctLstCtrl.InsertColumn(0,_T(""),LVCFMT_LEFT,10);
m_ctLstCtrl.InsertColumn(1,_T("Visible"),LVCFMT_LEFT,50);
m_ctLstCtrl.InsertColumn(2,_T("Status"),LVCFMT_LEFT,50);
m_ctLstCtrl.InsertColumn(3,_T("Color"),LVCFMT_LEFT,50);
m_ctLstCtrl.InsertColumn(4,_T("Object1"),LVCFMT_RIGHT,100);
m_ctLstCtrl.InsertColumn(5,_T("Object2"),LVCFMT_RIGHT,100);
m_ctLstCtrl.InsertColumn(6,_T("Desc"),LVCFMT_RIGHT,100);
m_ctLstCtrl.InsertColumn(7,_T("Value"),LVCFMT_LEFT,100);
m_ctLstCtrl.InsertColumn(8,_T("Low"),LVCFMT_LEFT,100);
m_ctLstCtrl.InsertColumn(9,_T("High"),LVCFMT_LEFT,100);
}
Я использую функцию ниже, чтобы добавить зеленый цвет в третий и четвертый столбцы.
void CTrendView::OnCustomdrawMyList ( NMHDR* pNMHDR, LRESULT* pResult )
{
NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );
*pResult = CDRF_DODEFAULT;
switch(pLVCD->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW;
break;
case CDDS_ITEMPREPAINT:
*pResult = CDRF_NOTIFYSUBITEMDRAW;
break;
case (CDDS_ITEMPREPAINT | CDDS_SUBITEM):
{
if(pLVCD->iSubItem == 2 )
pLVCD->clrTextBk = RGB(0, 255, 0);
else
pLVCD->clrTextBk = RGB(255, 255, 255);
}
for(int i=0;i<8;i++)
{
if(pLVCD->nmcd.dwItemSpec == i && pLVCD->iSubItem == 3)
pLVCD->clrTextBk = PenSelect[i];
}
break;
}
}
Для добавления динамических значений для других столбцов я использую один Fucntion, вызываемый из OnDraw()
.
void DrawData(CDC *pDC,int iTagPos,CListCtrl &TagListctrl,CRect rect,int pType,float pScaleLow,float pScaleHigh, int TimeCursorPos,int pFlag,CString stime)
{
int index;
CString sPV, sType;
sType = ".SV";
if (TrendTempSV[TimeCursorPos] != -999999)
{
sPV.Format ("%3.2f",TrendTempSV[TimeCursorPos]);
}
else
sPV.Format ("%s","**.** ");
CString sScaleLow,sScaleHigh,indexno;
sScaleLow.Format ("%4.1f",pScaleLow);
sScaleHigh.Format ("%4.1f", pScaleHigh);
indexno.Format("%d",iTagPos+1);
TagListctrl.SetRedraw( FALSE );
TagListctrl.DeleteItem(iTagPos);
index = TagListctrl.InsertItem(iTagPos,indexno);
TagListctrl.SetItemText(iTagPos,4,"Object");
TagListctrl.SetItemText(iTagPos,5,sName);
TagListctrl.SetItemText(iTagPos,6,sDesc);
TagListctrl.SetItemText(iTagPos,7,sPV);
TagListctrl.SetItemText(iTagPos,8,sScaleLow);
TagListctrl.SetItemText(iTagPos,9,sScaleHigh);
TagListctrl.SetRedraw( TRUE );
}
Я хочу установить флажок в столбце «Видимый». Для этого я включаю | LVS_EX_CHECKBOXES в SetExtendedStyle.
m_ctLstCtrl.SetExtendedStyle(m_ctLstCtrl.GetExtendedStyle() | LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES|
LVS_EX_FULLROWSELECT| LVS_EX_ONECLICKACTIVATE );
При этом я сталкиваюсь с проблемой ниже. Флажок появляется в первом столбце с порядковым номером. ListCtrl начинает мерцать, заголовки не видны, только когда я щелкаю где-то в listctrl, заголовок каждого столбца и появляется один за другим, а шестерка listctrl также не совпадает с предыдущей. Как я могу избежать этого?