读书人

ListBox从绘失败

发布时间: 2013-10-24 18:27:24 作者: rapoo

ListBox自绘失败 ,
以下代码,被调用四次,导致data[0]被添加了四次


void CTestListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item


CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); //获得ListBox的dc

CRect rect=lpDrawItemStruct->rcItem;


pDC->DrawText(data[0], lstrlen(data[0]),rect, DT_LEFT | DT_SINGLELINE);



}


在构造函数中 :

CTestListBox::CTestListBox()
{
data.push_back(_T("xx"));


}


在对话框中: 放了个ListBox,该控件关联一个变量.....


以上的方法是不对的, 正确的是什么啊?


我想 让listBox实现自绘功能: 字体变大 。。。。。 又颜色。。。。

可是我没有做改颜色的操作, 什么的,就发现 ,相同的内容被添加了四次。。。。

意味着:pDC->DrawText(data[0], lstrlen(data[0]),rect, DT_LEFT | DT_SINGLELINE);

DrawText的第一个参数不能是datap[0],那么该是什么啊????

data : vector<CString>data;

是我要添加到ListBox中的内容


[解决办法]
控件自绘,其实就是在屏幕上画图,不要在里面添加项内容,内容是在外部 AddString时添加的。
这个 Data[0]不知你从哪儿来,内容应该从参数 LPDRAWITEMSTRUCT 中获取。

获取内容正常的做法是:
CString strItem = GetItemText( lpDIS->itemID, i );
pDC->DrawText(strItem, lstrlen(strItem)....



引用:
pDC->DrawText(data[0], lstrlen(data[0]),rect, DT_LEFT
[解决办法]
DT_SINGLELINE);

你好 ,对于上面这句代码 ,肯定是来 将值填到ListBox中的啊 ,

我看过很多自绘的文章,都有这句代码 ,类似的 代码 ,,,

自绘函数被多次调用,那为什么他们的代码没有问题, 他们的那个自绘函数也会被多次调用

为什么他们的……

[解决办法]
内容是在外部 AddString时添加的。
获取内容正常的做法是:
CString strItem = GetItemText( lpDrawItemStruct->itemID, i );
pDC->DrawText(strItem, lstrlen(strItem)....


[解决办法]
两种方法,因为DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
1、通过lpDrawItemStruct传入需要重绘的项索引:itemID
你可以根据这个值,来确定你要重绘的信息,如你保存在vector中的信息vector[itemID].
2、通过lpDrawItemStruct传入需要重绘的项数据索引:itemData
你必须在建立listBox时为你的每个项绑定一个你能找到相应信息的指针,你可以根据这个值,来确定你要重绘的信息

读书人网 >VC/MFC

热点推荐