计算机等级考试二级Delphi辅导知识:字符串列表及应用_第4页

考试站(www.examzz.com)   【考试站:中国教育考试第一门户】   2012年12月27日
 3.2.1 设置自画风格 
  每个能进行自画式控制的部件都有一个叫Style的属性,Style决定部件是以缺省方式还是以自画方式绘制项目。
  对于列表框和组合框,也有自画式风格选项,表3.2列出了Style的取值及含义。 
  表3.2 Style的取值及含义
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  Style 含 义 举 例
  ─────────────────────────────────
  Fixed 每个项目有相同的高度 1bOwnerDrawFixed
  高度由ItenHeight属性决定 csOwnerDrawFixed
  Varible 每个项目有不同的高度 1bOwnweDrawVarible
  由运行数据决定 csOwnerDrawVarible
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 
  tab-set与字符串网格的Style属性通常是Varible.
  在Strlist程序中,列表框与tab-set取值如表3.3: 
  表3.3 列表框与tab-set的取值
  ━━━━━━━━━━━━━━━━━━━━━━━━━━
  名称 style
  ──────────────────────────
  ListBox1 lbOwnerDrawVariable
  Tabset1 tsOwnerDrawVariable
  ━━━━━━━━━━━━━━━━━━━━━━━━━━━
  3.2.2 把图像加入字符串列表 
  上节已介绍如何把对象加入字符串列表,例程把位图对象加入Tabset1的Tabs中: 
  procedure TForm1.FormCreate(Sender: TObject);
  var
  Bitmap: TBitMap;
  begin
  Listbox1.Items := Screen.Fonts;
  Bitmap := TBitmap.Create;
  Bitmap.LoadFromFile(’PHONE.BMP’);
  Tabset1.Tabs.AddObject(’phone’,Bitmap);
  Bitmap := TBitmap.Create;
  Bitmap.LoadFromFile(’PRINTER.BMP’);
  Tabset1.Tabs.AddObject(’printer ’,Bitmap);
  end; 
  3.2.3 绘制自画项目 
  当部件的Style属性是自画式时,Windows不再绘制部件,相反Windows为每个可视项目产生事件,而应用程序必须在事件中绘制项目。
  在应用程序绘制自画控制之前,Windows产生测量项目事件,这个事件告诉程序项目显示的位置 。
  通常由Windows决定项目显示的大小,但应用程序可以处理这个事件并自己选择显示区域。例如,程序要用位图代替文本显示,则需要把区域设置成位图的大小。测量项目事件的名称随部件的名称不同而不同,对于列表框和组合框,该事件叫OnMeasureItem。对于Tabset,该事件叫OnMeasureTab。
  测量项目事件有两个重要参数: 项目索引号与项目的大小。这个大小是变化的。后继项目的输出位置由前面项目的大小决定。例如,在自画式列表框中,如果应用程序把第一个项目的高度设置成5个象素点,则第二个项目在第六个象素点开始输出。列表框和组合框中,应用程序只能设置成项目的高度,而项目的宽度就是部件的高度。在Tabset中,tabs的宽度是可变的,而高度则是固定的。自画式网格允许应用程序改变网格单元的高度和宽度。
  OnMeasureItem的声明如下:
  ListBox1 MeasureItem(Control: TwinControl;Index: Integer; var Height: Integer);
  例程中响应OnMeasureItem事件的代码如下:
  procedure TForm1.ListBox1MeasureItem(Control: TWinControl; Index: Integer;
  var Height: Integer);
  begin
  with ListBox1.Canvas do
  begin
  Font.Name := ListBox1.Items[Index];
  Height := TextHeight(’A’);
  end;
  end; 
  procedure TForm1.TabSetMeasureTab(Sender: TObject; Index: Integer;
  var TabWidth: Integer);
  var
  BitmapWidth: Integer;
  begin
  BitmapWidth := TBitmap( TabSet1.Tabs.Objects[Index]).Width;
  Inc(TabWidth, 2 + BitmapWidth);
  end; 
  在OnMeasureItem事件发生后,Windows激发一个叫OnDrawItem的事件,这个事件也随部件名称不同而不同,常见的有OnDrawItem、OnDrawTab、OnDrawCell。
  OnMeasureItem的声明如下:
  DrawItem( Control: TWinControl; Index: integer; Rect: TRect; State: TOwnerDraw); 
  其中Control是包含项目的部件引用
  Index 是项目的索引号
  Rect 是绘制的矩形
  State 是项目的状态,如选中,得到焦点等。 
  在例程的列表框中,所列项目是屏幕支持的各种字体名称,当列表框发生OnDrawItem事件时,程序把输出字体设置成该项目所代表的字体,因而列表框的项目呈现出不同的字体,其代码如下:
  procedure TForm1.DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
  begin
  with ListBox1.Canvas do
  begin
  FillRect(Rect);
  Font.Name := ListBox1.Items[Index];
  TextOut(Rect.Left, Rect.Top, ListBox1.Items[Index]);
  end;
  end;
  在Tabset部件中,则把位图与文本同时输出,其代码如下: 
  procedure TForm1.TabSet1DrawTab(Sender: TObject; TabCanvas: TCanvas;
  R: TRect; Index: Integer; Selected: Boolean);
  var
  Bitmap: TBitmap;
  begin
  Bitmap := TBitmap(TabSet1.Tabs.Objects[Index]);
  with TabCanvas do
  begin
  Draw(R.Left, R.Top + 4, Bitmap);
  TextOut(R.Left + 2 + Bitmap.Width,
  R.Top + 2, TabSet1.Tabs[Index]);
  end;
  end;
首页 1 2 3 4 尾页

相关文章