使用WTL,继承COwnerDraw实现自绘CListBox,现在碰到一个问题:向列表框添加三行字符串,结果只显示第一条字段串内容;当用鼠标点击列表框时显示出当前焦点行字符串,但其他内容又显示不出来了,不知道是哪里出了问题。
列表框的风格为:LBS_OWNERDRAWVARIABLE | LBS_HASSTRINGS | LBS_NOINTEGRALHEIGHT | WS_VSCROLL | WS_TABSTOP以下是部分代码:
class CSlideListBox : public CWindowImpl<CSlideListBox, CListBox>,
public COwnerDraw< CSlideListBox >
{
void DrawItem(LPDRAWITEMSTRUCT lpDIS)
{
if ((int)lpDIS->itemID < 0)
return;  CDC dc(lpDIS->hDC); CBrush brush;
brush.CreateSolidBrush(lpDIS->itemState & ODS_SELECTED ? RGB(236,244,251) : RGB(255,255,0));
dc.FillRect(&lpDIS->rcItem, brush);
brush.DeleteObject(); // Set the background mode to TRANSPARENT to draw the text.
int nBkMode = dc.SetBkMode(TRANSPARENT); COLORREF crText = dc.SetTextColor(lpDIS->itemState & ODS_SELECTED ? RGB(27,44,150) : RGB(0, 0, 0)); // Get and display item text.
CString sText;
GetText(lpDIS->itemID, sText); // draw the text
UINT nFormat = DT_LEFT | DT_SINGLELINE | DT_VCENTER;
dc.DrawText(sText, -1, &lpDIS->rcItem, nFormat); // restore the device context
dc.SetTextColor(crText); 
dc.SetBkMode(nBkMode);
}        void MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct)
{
lpMeasureItemStruct->itemHeight = 20;
lpMeasureItemStruct->itemWidth = 100;
}
}

解决方案 »

  1.   

    brush.DeleteObject(); //为什么要删除这些你需要使用的GDI资源,你应该把他们定义为成员变量,保持其生命周期!这是GDI资源的基本形成,不管是Brush/Font等等,不能画完就删除!析构或者销毁时再DeleteObject.
      

  2.   

    这几条语句是画listbox item背景的,我把它们注释掉,不画背景只管画字符串,问题仍然还是存在,只显示出当前焦点行的字符串内容,其他行都显示不出来。
      

  3.   

    全部注释掉那就什么都没有了,一片空白。
    把 if ((int)lpDIS->itemID < 0) 
      return;
    改成  if ((int)lpDIS->itemID < 1) 
      return;则初始显示第二条行字符串,感觉就像是之后的绘图被覆盖了一样。
      

  4.   

    我把这段代码移到对话框里面响应WM_DRAWITEM消息都还是这样,郁闷啊。
      

  5.   

    看看这个有没有帮助
    http://www.codeproject.com/KB/wtl/customdrawlist_wtl.aspx
      

  6.   

    看过了,codeproject上面都翻了一遍,找到些MFC的例子,把我的代码套进去改一下没问题。但是没找到WTL的例子,不知道问题出在哪里。CSDN有没有办法上传源代码?
      

  7.   

    这里有一些WTL的控件自定义,参考一下吧: http://www.viksoe.dk/code/all_wtl.htm
      

  8.   

    问题解决,参考了楼上给的一个例子。将 CDC dc(lpDIS->hDC); 改成 CDCHandle dc(lpDIS->hDC); 就OK了,郁闷。谢谢两位热心帮忙。