返回首页

{A}{S0}简介
大家好。这是我在CodeProject上的第一篇文章,我希望你觉得它有用。我的文章是有关的OwnerDraw MFC中的ListBox我开发接受文本和图标。最后一件事是,我希望你能率的文章,这样我就可以知道你的意见。非常感谢。列表框的功能
大家都知道,经常ListBox中,你将在Visual Studio 6只接受文字和控制工具栏的下拉。但我在我的ListBox的是三个额外的功能:接受旁边的文字图形图标(ICO)文件。您可以决定在ListBox(左或右)的文字和图标的位置。 您可以拖动ListBox中的图标文件(ICO),他们将被自动添加。要做的事情开始之前
有设计中应采取intonbsp的一些程序,在使用thenbsp前考虑; COwnerDrawListBox类。首先打开Visual Studio中的资源"选项卡,选择对话框中,你会把你的ListBox中,并从控制栏中拖动一个ListBox和调整这样的对话:
,然后打开属性对话框中的ListBox和选择的样式"选项卡,更改喜欢这幅画改变的属性:{S2}
你必须改变所有者绘制风格变量,因为我们的ListBox包含文字和画,然后取消选择排序和检查垂直滚动,如上图所示的图标。之后,选择下一个选项卡(扩展样式)和检查接受如下所示的文件:
最后一件事,你做了之后,你有一个变量,并将它附加到ListBox控件,所以你可以使用和添加项目,但可以肯定的,你从我们的类COwnerDrawListBox的变量,而不是CListBox的。使用代码
首先,你必须添加的OwnerDrawListBox。cpp和h文件到项目中。让我们假设您正在使用一个基于对话框的MFC项目作为示范项目,如果项目名称是的OwnerDraw,然后在COwnerDrawDlg类,你应该包括OwnerDrawListBox文件。

#include "OwnerDrawListBox.h"

然后,假设的地方,我们要在OnInitDialog()函数,并从COwnerDrawListBox类对象在列表框中添加项目被称为m_OwnerListBox,所以才前行,{C}
这样调用成员函数Add():
m_OwnerListBox.Add("Cafe", AfxGetApp()->LoadIcon(IDI_CAFE));

宏观IDI_CAFE图标添加和命名的项目资源。然后有两个其他的帮助功能,我来帮助你设置的图标和文字的位置SetIconPosition和SetTextPosition。如果你想设置一个位置,然后你需要设置的其他否则其位置设置是将绘制和其他不会被绘制的位置。您可以使用这样的两个功能:
m_OwnerListBox.SetTextPosition(COwnerDrawListBox::ITEM_LEFT);

m_OwnerListBox.SetIconPosition(COwnerDrawListBox::ITEM_RIGHT);

参数COwnerDrawListBox:ITEM_RIGHT或COwnerDrawListBox:ITEM_LEFT传递功能SetIconPosition或SetTextPosition是您要设置ListBox中的文本或图标的价值。如果你没有设置的图标和文字或者岗位,他们将设置为默认文本将在右边的位置和图标将在左边。
完毕之后,你必须调用函数的destroy()删除所有用于在COwnerDrawListBox类的指针,并没有允许任何内存泄漏发生这样的:
m_OwnerDrawListBox.Destroy();
关于我
我的名字是米娜纳比勒埃拉拉,我作为一个在金字塔系统开发的软件工程师(PSD)和我CodeProect asnbsp的第一篇文章的工作,我以前说过,sonbsp,我想听听你的意见,评论,如果任何人想要问的什么,只是邮件我在,或给我留言,我承诺,我会答复。非常感谢。| GT,GT; MonMonltlt

回答

评论会员:游客 时间:2011/12/07
拖动对话框时,有时会崩溃imgsrc=http://www.orcode.com/upimg/2011_12_07_02_17_35_4.gif的
srikanthmulka
评论会员:游客 时间:2011/12/07
如何我们ř定义字符串在同一行中的ListBox中使用睡眠:|maqmakmac
!您好

我认为以下代码成为VS2005的一个问题。

CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);

...

pDC->Detach();

我认为它可以解决以下代码。

CDC dc;

dc.Attach(lpDrawItemStruct->hDC);

CDC* pDC = &dc;

...

dc.Detach();


评论会员:Jermeen 时间:2011/12/07
我爱我认为这是一个伟大的好工作,并不断的辛勤工作的整体思路.. \
JN
评论会员:2pers 时间:2011/12/07
。还有许多其他的关于这一问题(如达维德卡拉布罗和刘嘉红)的好文章,但是这一次是更简单,但我想很多人有足够
事实上,我几乎是相同的,但是,我错过了添加文本和图标positionning。
另一个我试图做的事情(我还没有找到{五}),以支持本地的图标大小(而不是32x32的大小) - 我认为问题的根源在于DrawIcon。如果您或任何人有一个想法,他就值得我表示衷心的感谢{中六}

非常感谢分享这段代码了!

2pers
评论会员:2pers 时间:2011/12/07
嘿,我回答我的问题(这是不是很难在事实上{五})
对于那些要支持本地的大小,只需用DrawIconEx方法

DrawIconEx(lpDIS - > HDC,rectIcon.left 2,rectIcon.top 2,pItem -> m_hIcon,
 60;
m_nativesize.cx,m_nativesize.cx,0,NULL,则DI_NORMAL);
的问候,

2pers

评论会员:rockaden 时间:2011/12/07
CString的sProperty;
INT nNumItems = m_OwnerListBox.GetCount()
(N = 0; ñ sProperty是空的????????{ BR}
}

rockaden
评论会员:MonMon_MFC 时间:2011/12/07
亲爱的rockaden,

关于这个问题,你面临的,我从您发送的代码结束是要得到从ListBox中的某一个项目的文字。其实这是通过使用GetDataItemPtr功能这个函数的指数所需要的项目要完成,所以你可以传递给它了getsel函数返回的数字,然后施放的返回值DataItems结构,并通过这个结构你可以得到所需项目的文本,如果我的解释是不够好,PLZ告诉我。

你,
米娜纳比勒埃拉拉
评论会员:ev_Genius 时间:2011/12/07
设置LBS_HASSTRINGS风格。