在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;
}
}
使用从OnDraw()
调用的一个Fucntion为其他列添加动态值。
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 );
}
我想要“可见”列下的复选框。为此,我包括| SetExtendedStyle中的LVS_EX_CHECKBOXES。
m_ctLstCtrl.SetExtendedStyle(m_ctLstCtrl.GetExtendedStyle() | LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES|
LVS_EX_FULLROWSELECT| LVS_EX_ONECLICKACTIVATE );
这样做我面临以下问题。复选框出现在第一列,并带有索引号。 ListCtrl开始闪烁,标题不可见,仅当我单击在listctrl中的某个位置时,每个列标题才会一一出现,并且listctrl的第六个也与以前不同。我如何避免这种情况?
答案 0 :(得分:0)
您可能想签出XListCtrl
。它具有任意位置的复选框列以及单元格内容(颜色)的文本格式。
答案 1 :(得分:0)
此外,您可以使用CListCtrlExt (or CListViewExt),这不是自定义抽奖!!这意味着您可以完整保留OS样式,并且可以在每一列上放置任何类型的控件,包括复选框按钮...