时间: 2021-07-31 作者:daque
c++ builder中的列表框和拉拢框控件都仍旧供给了自美术接口。运用那些接口不妨实行把列表框和拉拢框中的名目表露为图像。即使把这种功效封装成组件就更妙了,底下以列表框为例,演示这一进程。 一 实行道理 列表框有的style属性设置了三种作风,lbstandard作风只能表露文本,bowner-drawfixed与lbownerdrawvariable作风不妨实行自美术功效,所各别的是,具备前者作风的列表框中每一项的莫大都是沟通的,后者承诺运用步调为每一项设置各别莫大。 具备自美术作风的列表框,在列表框的表面变换的功夫,如减少,简略,震动名目,总要触发两个事变句柄: tmeasureitemevent onmeasureitem; tdrawitemevent ondrawitem; typedef void __fastcall (_closure *tdrawitemevent)(twincontrol* control,int index,trect& rect; townerdrawstate state); typedef void __fastcall(_closure* tmeasureitemevent)(twincontrol* control, int index,int& height);onmeasureitem事变传播一个参数height,运用步调须要填写一项来确定这一项的莫大,即使没有变换,则运用列表框的itemheight的值。lbownerdrawfixed作风的列表框不触发这一事变,故它运用自己的itemheight。ondrawitem传播的rect表白可在上作画的矩形区,步调不妨运用列表框canvas属性来绘图。二 示例 1 在ide情况中,采用“file-new”,在对话框中双击“component”,展示"new component"对话框,在ancestor type中采用“tcustomlistbox",在class name中输出: “timagelistbox”,点create uints,就天生一个类框架。 2 在头文献(imagelistbox.h)中的相映域中,减少下列分子: private: graphics::tgraphic* tmpgraphic; protected: void __fastcall mydrawitem(twincontrol *control, int index, const trect &rect, townerdrawstate state); void __fastcall mymeasureitem(twincontrol *control, int index, int &height); public: __fastcall timagelistbox(tcomponent* owner); __fastcall ~timagelistbox(); void __fastcall addimage(system::ansistring filename, system::andistring* string); ... 3.在实行文献(imagelistbox.cpp)设置以次因变量: void __fastcall timagelistbox::mymeasureitem(twincontrol *control, int index, int &height) { if(tmpgraphic) height=tmpgraphic->height+2; file://由于c++ builder中的列表框封装了lbs_hasstrings个性,以是在这个事 file://件中不许沿用诸如items->objects[index]情势来博得图像数据。 } void __fastcall timagelistbox::mydrawitem(twincontrol *control, int index, const trect &rect, townerdrawstate state) { int offset = 2; // 设置文本与图像的隔绝 tcanvas *pcanvas = ((tlistbox *)control)->canvas; pcanvas->fillrect(rect); file://弥补方框 file://博得图像东西 tgraphic* tmpimage=(tgraphic*)(items->objects[index]); pcanvas->draw(rect.left+offset,rect.top,tmpimage); file://绘图 if(tmpimage)offset+=tmpimage->width+4; file://表露文本 pcanvas->textout(rect.left + offset, rect.top, ((tlistbox*)control)->items->strings[index]); } file://------------------------------------------------------------------ void __fastcall timagelistbox::addimage(system::ansistring filename, system::ansistring* string) { file://承载图像,并追加至objects东西。 if(filename.pos(".ico")) { tmpgraphic=new graphics::ticon(); tmpgraphic->loadfromfile(filename); items->addobject(string,(tobject*)tmpgraphic); } else if(filename.pos(".bmp")) { tmpgraphic=new graphics::tbitmap(); tmpgraphic->loadfromfile(filename); items->addobject(string,(tobject*)tmpgraphic); } tmpgraphic=null; } __fastcall timagelistbox::timagelistbox(tcomponent* owner) : tcustomlistbox(owner) { style=lbownerdrawvariable; ondrawitem=mydrawitem; onmeasureitem=mymeasureitem; } __fastcall timagelistbox::~timagelistbox() { file://开释图像资源 for(int i=0;icount;i++) { if((tmpgraphic=(tgraphic*)items->objects[i])!=null) delete tmpgraphic; } }三 尝试组件 兴建一个工程,先在工程中增添方才创造的imagelistbox.cpp,并在主窗体的头文献(.h)及实行文献(.cpp)中减少#include "imagelistbox.h". 而后在private域中减少一个分子: timagelistbox* til; 在窗体的结构因变量中减少如次代码: til=new timagelistbox(this); til->parent=this; til->width=80; til->height=90; til->addimage("1.ico","first"); til->addimage("2.bmp,"second"); ... 在窗体的析构因变量中减少一句:“delete til;”,运路途序。之上代码在windows 95 osr2 ,c++ builder 3.0中编写翻译尝试经过。读者群不妨自行窜改,使功效越发完备。