Delphi字符串列表及应用(四)
把图像加入字符串列表
上节已介绍如何把对象加入字符串列表 例程把位图对象加入Tabset 的Tabs中
procedure TForm FormCreate(Sender: TObject); var Bitmap: TBitMap; begin Listbox Items := Screen Fonts; Bitmap := TBitmap Create; Bitmap LoadFromFile( PHONE BMP ); Tabset Tabs AddObject( phone Bitmap); Bitmap := TBitmap Create; Bitmap LoadFromFile( PRINTER BMP ); Tabset Tabs AddObject( printer Bitmap); end; 绘制自画项目
当部件的Style属性是自画式时 Windows不再绘制部件 相反Windows为每个可视项目产生事件 而应用程序必须在事件中绘制项目
在应用程序绘制自画控制之前 Windows产生测量项目事件 这个事件告诉程序项目显示的位置
通常由Windows决定项目显示的大小 但应用程序可以处理这个事件并自己选择显示区域 例如 程序要用位图代替文本显示 则需要把区域设置成位图的大小 测量项目事件的名称随部件的名称不同而不同 对于列表框和组合框 该事件叫OnMeasureItem 对于Tabset 该事件叫OnMeasureTab
测量项目事件有两个重要参数: 项目索引号与项目的大小 这个大小是变化的 后继项目的输出位置由前面项目的大小决定 例如 在自画式列表框中 如果应用程序把第一个项目的高度设置成 个象素点 则第二个项目在第六个象素点开始输出 列表框和组合框中 应用程序只能设置成项目的高度 而项目的宽度就是部件的高度 在Tabset中 tabs的宽度是可变的 而高度则是固定的 自画式网格允许应用程序改变网格单元的高度和宽度
OnMeasureItem的声明如下
ListBox MeasureItem(Control: TwinControl;Index: Integer; var Height: Integer);
例程中响应OnMeasureItem事件的代码如下:
procedure TForm ListBox MeasureItem(Control: inControl; Index: Integer; var Height: Integer); begin with ListBox Canvas do begin Font Name := ListBox Items[Index]; Height := TextHeight( A ); end; end; procedure TForm TabSetMeasureTab(Sender: TObject; Index: Integer; var TabWidth: Integer); var BitmapWidth: Integer; begin BitmapWidth := TBitmap( TabSet Tabs Objects[Index]) Width; Inc(TabWidth + BitmapWidth); end;
在OnMeasureItem事件发生后 Windows激发一个叫OnDrawItem的事件 这个事件也随部件名称不同而不同 常见的有OnDrawItem OnDrawTab OnDrawCell
OnMeasureItem的声明如下
DrawItem( Control: inControl; Index: integer; Rect: TRect; State: TOwnerDraw);
其中Control是包含项目的部件引用
Index 是项目的索引号
Rect 是绘制的矩形
State 是项目的状态 如选中 得到焦点等
在例程的列表框中 所列项目是屏幕支持的各种字体名称 当列表框发生OnDrawItem事件时 程序把输出字体设置成该项目所代表的字体 因而 列表框的项目呈现出不同的字体 其代码如下
lishixinzhi/Article/program/Delphi/201311/24764