我爱黑客网首页 设为首页
加入收藏
联系我们
 首 页  技术文章 下载中心 站长学院 交流论坛
 软件:
 文章:        教程:
 推荐: 我爱黑客网论坛
 
 
 
 
   
黑软: Q Q 软件 木马间谍 探嗅监听 溢出攻击 加密解密 漏洞扫描 脚本注入 远程控制 综合利用 聊天工具  
 
技术文章: 爱黑新闻 | 黑客攻防 | 网络技术 | 程序设计 | 系统操作 | 本站动态 | 业界动态 | 安全公告 | 病毒公告 | 八卦黑客
 
 
您当前的位置:我爱黑客 -> 程序设计 -> C++ -> C++通信 -> 文章内容  
栏目导航
· C++综合 · C++通信
· C++视图 · C++图象
· C++系统 · C++多媒体
· C++界面 · C++文件
· C++数据库 · C++网络
热门文章
· ListView的排序
· 用C++ Builder创建组合..
· BCB中派生VCL类及动态..
· 使用C++ Buider制作自..
· 在BCB中使用VCL控件数..
· 在C++Builder中使用De..
· 在BCB中使用VCL控件数..
· 让TRichEdit支持BIG5内..
· TRichEdit右键滚屏代码..
· C++Builder中实现控件..
· C++ Builder中保持控件..
· C++ Builder创建组件探..
相关文章

· 在BCB中轻松使用Act..
· 使用Windows系统提供..
· Web变量Cookie的使用..
· 在CB5中使用ADO数据..
· 在C++Builder中使用..
· 使用Windows虚拟设备..
· 使用Windows虚拟设备..
· 如何使用OnIdle事件..
· 使用CreateProcess(..
· 使用双缓冲技术绘制..
查看更多与使用C++ Buider制作自绘画列表框相关内容

使用C++ Buider制作自绘画列表框
作者:幽火  来源:www.5ihack.com  发布时间:2007-1-8 17:22:03  发布人:ghostfire

减小字体 增大字体

  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;
      //因为C++ Builder中的列表框封装了LBS_HASSTRINGS特性,所以在这个事
      //件中不能采用诸如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); //填充方框
    //取得图像对象
    Tgraphic* tmpImage=(Tgraphic*)(Items->Objects[Index]);
    pCanvas->Draw(Rect.Left+Offset,Rect.Top,tmpImage); //画图
    if(tmpImage)Offset+=tmpImage->Width+4; //显示文本
    pCanvas->TextOut(Rect.Left + Offset, Rect.Top, ((TListBox *)Control)->Items->Strings[Index]);
    }
   //--------------------------------------------------------------------------
   void __fastcall TImageListBox::AddImage(System::AnsiString Filename,System::AnsiString* String)
   {
    //装载图像,并追加至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()
    { //释放图像资源
     for(int i=0;iCount;i++)
     {
      if((tmpGraphic=(Tgraphic*)Items->Objects[i])!=NULL)
       delete tmpGraphic;
     }
    }

查看更多与使用C++ Buider制作自绘画列表框相关内容

[ ] [返回上一页] [打 印] [收 藏]
上一篇文章:
下一篇文章:
      在BCB中使用VCL控件数组1       BCB中派生VCL类及动态地创建控件
∷相关文章评论∷   (评论内容只代表网友观点,与本站立场无关!) [发表评论]
 
 
 
 
晋ICP备05008232   维护网络安全、传播安全技术才是我们的目标! 
 
关于本站 - 网站帮助 - - 下载声明 - 友情连接 -网站地图