大雀软件园

首页 软件下载 安卓市场 苹果市场 电脑游戏 安卓游戏 文章资讯 驱动下载
技术开发 网页设计 图形图象 数据库 网络媒体 网络安全 站长CLUB 操作系统 媒体动画 安卓相关
当前位置: 首页 -> 技术开发 -> 程序开发 -> 使用C++ Buider制作自绘画列表框

使用C++ Buider制作自绘画列表框

时间: 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中编写翻译尝试经过。读者群不妨自行窜改,使功效越发完备。

热门阅览

最新排行

Copyright © 2019-2021 大雀软件园(www.daque.cn) All Rights Reserved.