使用C++Buider制作自绘画列表框
C++ Builder中的列表框和组合框控件提供了自绘图界面。这些接口可用于将列表框和组合框中的项目显示为图像。把这个功能封装成一个组件就更好了。这里有一个列表框的例子来演示这个过程。
实现原则
列表的某些样式属性定义了三种样式,lbStandard样式只能显示文本,bOwner-DrawFixed和lbOwnerDrawVariable样式可以实现自绘制功能。不同的是,前一种样式的列表框中每个项目的高度是相同的,而后者允许应用程序为每个项目定义不同的高度。
具有自绘风格的列表框在列表框外观发生变化时,如添加、删除和滚动项目时,总是会触发两个事件句柄:
tmeasureitem event on measure item;
tdrawitevent OnDrawItem;
typedef void _ _ fastcall(_ closure * TDrawItemEvent)(twin Control * Control,int Index,Trect & RectTOwnerDrawState州);
typedef void _ _ fastcall(_ closure * TMeasureItemEvent)(twin Control * Control,int Index,int & Height);
OnMeasureItem事件传递了一个参数高度。应用程序需要填充一个项目来确定该项目的高度。如果没有改变,将使用列表框中ItemHeight的值。lbOwnerDrawFixed样式列表框不触发此事件,因此它使用自己的ItemHeight。OnDrawItem传递的Rect表示可以在屏幕上绘制的矩形区域,程序可以使用列表框的Canvas属性来绘制图片。
两个例子
1在IDE环境下,选择“文件-新建”,双击对话框中的“组件”,会出现“新建组件”对话框。在祖先类型中选择“TCustomListBox ”,在类名中输入“TImageListBox ”,点击创建Uints生成一个类框架。
2将以下成员添加到头文件(ImageListBox.h)中的相应字段:
private:
graphic::TG graphic * tmpggraphic;
protected:
void _ _ fastcall MyDrawItem(twin Control * Control,int Index,const Trect &Rect,TOwnerDrawState State);
void _ _ fast call MyMeasureItem(twin Control * Control,int Index,int & Height);
public:
_ _ fast call TImageListBox(t component * Owner);
_ _ fast call ~ TImageListBox();
void _ _ fastcall AddImage(System::an signing Filename,System::and String * String);
…
位律师回复
0条评论