dd类是CListBox的子类,其cpp文件如下:
int dd::add(CString ss)
{
int k=AddString("");
SetItemDataPtr(k,ss.GetBuffer(0));
return k;
}
BEGIN_MESSAGE_MAP(dd, CListBox)
//{{AFX_MSG_MAP(dd)
ON_WM_DRAWITEM_REFLECT()
ON_WM_MEASUREITEM_REFLECT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
void dd::DrawItem(LPDRAWITEMSTRUCT lpD) 
{
CDC dc;
dc.Attach(lpD->hDC);
CRect rc=lpD->rcItem;
CString ss="item";
dc.DrawText(ss ,&rc,DT_LEFT);
}
BOOL dd::PreCreateWindow(CREATESTRUCT& cs) 
{
if(!CListBox::PreCreateWindow(cs))
return FALSE;
  cs.style &= ~(LBS_OWNERDRAWFIXED | LBS_SORT);
cs.style |= LBS_OWNERDRAWVARIABLE | LBS_NOTIFY;
return TRUE;
}
void dd::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
{
       lpMeasureItemStruct->itemHeight=20;
}调用如下(在对话框的OnInitDialog()):d=new dd();
d->Create(WS_VISIBLE|WS_CHILD|WS_BORDER|WS_HSCROLL|WS_VSCROLL,CRect 
                                        (10,10,210,60),this,ID_SS);
for(int kk=0;kk<20;kk++)
{
CString a;
a.Format("... this is a %d",kk);
d->add(a);
}
我的问题是:
  显示时只显示第一个Item,有时就显示一些Item,很奇怪的。这是为什么,我该如何做?

解决方案 »

  1.   

    我重现了您所描述的问题,其实所有的Item已经都画出来了(在列表框里面用鼠标上下拖动便发现所有的Item能够显示出来),只是显示的情况不正常,原因应该是您在DrawItem中的代码没有调用CDC::Detach函数以将输出设备的上下文句柄从栈变量CDC对象中分开。在DrawItem函数中加上这个函数的调用之后,显示便正常了:
    void dd::DrawItem(LPDRAWITEMSTRUCT lpD) 
    {
    CDC dc;
    dc.Attach(lpD->hDC);
    CRect rc=lpD->rcItem;
    CString ss="item";
    dc.DrawText(ss ,&rc,DT_LEFT);
    dc.Detach();      //新增代码
    }关于重载CListBox::DrawItem函数的信息,您可以参看下面的MSDN链接,上面有详细地说明和一个用户自画CListBox的具体例子:
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vcmfc98/html/_mfc_clistbox.3a3a.drawitem.asp- 微软全球技术中心 VC技术支持本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款
    (http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。为了为您创建更好的讨论环境,请参加我们的用户满意度调查
    (http://support.microsoft.com/directory/worldwide/zh-cn/community/survey.asp?key=(S,49854782))。
      

  2.   

    谢谢,你的回答太秒了!不过还有个问题,想问问你,恳请不吝赐教!我做了一个CMyListBox,父类是CListBox,我在每个Item中加入一个CButton,但是CButton的宽度小于CMyListBox的宽度,当我单击CMyListBox中的非CButton区域时,CButton立刻不见了。我希望能保留CListBox::OnLButtonDown(),但是单击上诉区域时,CButton还要在。
      另外,在DrawItem中我是先得到这个CButton,然后在Item的部分区域中显示这个CButton.
       请问问题出在哪里?