group mfc 复选框_在MFC中的CListCtrl的第二列中添加复选框

在MFC应用程序中,作者在CListCtrl的第二列添加复选框时遇到问题。通过使用SetExtendedStyle设置LVS_EX_CHECKBOXES,复选框出现在第一列而非预期的第二列,并导致列表控件闪烁,列头不显示。为解决此问题,建议使用CListCtrlExt或CListViewExt,它们允许在每列添加包括复选框在内的各种控件,同时保持操作系统的默认样式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

In my MFC application, im adding CListCtrl in my View class using OnCreate() function. I have 10 columns and 8 rows in that table. I want to include check box in second column .

My code is

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);

}

Im using below function to add green color in third column and fourth column.

void CTrendView::OnCustomdrawMyList ( NMHDR* pNMHDR, LRESULT* pResult )

{

NMLVCUSTOMDRAW* pLVCD = reinterpret_cast( 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;

}

}

For adding dynamic values for other columns im using one Fucntion getting called from 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 );

}

I want check box under 'Visible' column. FOr that, i include | LVS_EX_CHECKBOXES in SetExtendedStyle.

m_ctLstCtrl.SetExtendedStyle(m_ctLstCtrl.GetExtendedStyle() | LVS_EX_CHECKBOXES | LVS_EX_GRIDLINES|

LVS_EX_FULLROWSELECT| LVS_EX_ONECLICKACTIVATE );

Im facing below problem by doing this. Checkbox appears in first column with index number. The ListCtrl start to flicker,headers are not visible,only when i click somwhere in listctrl each column header et appears one by one and the sixe of the listctrl also not same as previous. How can i avoid this?

解决方案

Also, you can use CListCtrlExt (or CListViewExt), which are not custom draw !! that is mean you can have OS style intact and you can put on every column, any kind of control, including check box button ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值