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,很奇怪的。这是为什么,我该如何做?
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,很奇怪的。这是为什么,我该如何做?
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))。
另外,在DrawItem中我是先得到这个CButton,然后在Item的部分区域中显示这个CButton.
请问问题出在哪里?