【 tulaoshi.com - 编程语言 】
                             
                            Delphi   
  1. 建立一个窗体   
  2. 放一个ComboBox和Listbox   
  3. 改变Component的Style为csOwnerDrawVariable和ListBox的Style为lbOwnerDrawVariabble。   
  4. 声明5个TBitmap的全局变量   
  5. 覆盖Form的OnCreate.   
  6. 覆盖ComboBox的OnDraw.       
![]()
![]()
![]()
![]()
!-- frame contents --   !-- /frame contents --
![]()
![]()
![]()
![]()
  7. 覆盖ComboBox的OnMeasureItem.   
  8. 释放资源在Form的OnClose.   
  下面给出完整的主程序源程序:   
  unit Ownerdrw;   
  interface   
  uses   
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,   
  Forms, Dialogs, StdCtrls;   
  type   
  TForm1 = class(TForm)   
  ComboBox1: TComboBox;   
  ListBox1: TListBox;   
  procedure FormCreate(Sender: TObject);   
  procedure FormClose(Sender: TObject; var Action: TCloseAction);   
  procedure ComboBox1DrawItem(Control: TWinControl; Index: Integer;   
  Rect: TRect; State: TOwnerDrawState);   
  procedure ComboBox1MeasureItem(Control: TWinControl; Index: Integer;   
  var Height: Integer);   
  procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;   
  Rect: TRect; State: TOwnerDrawState);   
  procedure ListBox1MeasureItem(Control: TWinControl; Index: Integer;   
  var Height: Integer);   
  private   
  { Private declarations }   
  public   
  { Public declarations }   
  end;   
  var   
  Form1: TForm1;   
  TheBitmap1, TheBitmap2, TheBitmap3, TheBitmap4,   
  TheBitmap5 : TBitmap;   
  implementation   
  {$R *.DFM}   
  procedure TForm1.FormCreate(Sender: TObject);   
  begin   
  TheBitmap1 := TBitmap.Create;   
  TheBitmap1.LoadFromFile(C:delphiimagesuttonsglobe.bmp);   
  TheBitmap2 := TBitmap.Create;   
  TheBitmap2.LoadFromFile(C:delphiimagesuttonsvideo.bmp);   
  TheBitmap3 := TBitmap.Create;   
  Th tmap3.LoadFromFile(C:delphiimagesuttonsgears.bmp);   
  TheBitmap4 := TBitmap.Create;   
  TheBitmap4.LoadFromFile(C:delphiimagesuttonskey.bmp);   
  TheBitmap5 := TBitmap.Create;   
  TheBitmap5.LoadFromFile(C:delphiimagesuttonsools.bmp);   
  ComboBox1.Items.AddObject(Bitmap1: Globe, TheBitmap1);   
  ComboBox1.Items.AddObject(Bitmap2: Video, TheBitmap2);   
  ComboBox1.Items.AddObject(Bitmap3: Gears, TheBitmap3);   
  ComboBox1.Items.AddObject(Bitmap4: Key, TheBitmap4);   
  ComboBox1.Items.AddObject(Bitmap5: Tools, TheBitmap5);   
  ListBox1.Items.AddObject(Bitmap1: Globe, TheBitmap1);   
  ListBox1.Items.AddObject(Bitmap2: Video, TheBitmap2);   
  ListBox1.Items.AddObject(Bitmap3: Gears, TheBitmap3);        
  ListBox1.Items.AddObject(Bitmap4: Key, TheBitmap4);   
  ListBox1.Items.AddObject(Bitmap5: Tools, TheBitmap5);       
  end;     
  procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);   
  begin   
  TheBitmap1.Free;   
  TheBitmap2.Free;   
  TheBitmap3.Free;   
  TheBitmap4.Free;   
  TheBitmap5.Free;   
  end;   
  procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;   
  Rect: TRect; State: TOwnerDrawState);   
  var   
  Bitmap: TBitmap;   
  Offset: Integer;   
  begin   
  with (Control as TComboBox).Canvas do   
  begin   
  FillRect(Rect);   
  Bitmap := TBitmap(ComboBox1.Items.Objects[Index]);   
  if Bitmap  nil then   
  begin   
  BrushCopy(Bounds(Rect.Left + 2, Rect.Top + 2, Bitmap.Width,   
  Bitmap.Height), Bitmap, Bounds(0, 0, Bitmap.Width,   
  Bitmap.Height), clRed);   
  Offset := Bitmap.width + 8;   
  end;   
  { display the text }   
  TextOut(Rect.Left + Offset, Rect.Top, Combobox1.Items[Index])   
  end;   
  end;       
  procedure TForm1.ComboBox1MeasureItem(Control: TWinControl; Index:   
  Integer; var Height: Integer);   
  begin   
  height:= 20;   
  end;       
  procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;   
  Rect: TRect; State: TOwnerDrawState);   
  var   
  Bitmap: TBitmap;   
  Offset: Integer;   
  begin   
  with (Control as TListBox).Canvas do   
  begin   
  FillRect(Rect);   
  Bitmap := TBitmap(ListBox1.Items.Objects[Index]);   
  if Bitmap  nil then   
  begin   
  BrushCopy(Bounds(Rect.Left + 2, Rect.Top + 2, Bitmap.Width,   
  Bitmap.Height), Bitmap, Bounds(0, 0, Bitmap.Width,   
  Bitmap.Height), clRed);   
  Offset := Bitmap.width + 8;   
  end;   
  { display the text }   
  TextOut(Rect.Left + Offset, Rect.Top, Listbox1.Items[Index])   
  end;   
  end;       
  procedure TForm1.ListBox1MeasureItem(Control: TWinControl; Index: Integer;   
  var Height: Integer);   
  begin   
  height:= 20;   
  end;       
  end.     
  //该窗体的DFM文件       
  object Form1: TForm1   
  Left = 211   
  Top = 155   
  Width = 435   
  Height = 300   
  Caption = Form1   
  Font.Color = clWindowText   
  Font.Height = -13   
  Font.Name = System   
  Font.Style = []   
  PixelsPerInch = 96   
  OnClose = FormClose   
  OnCreate = FormCreate   
  TextHeight = 16   
  object ComboBox1: TComboBox   
  Left = 26   
  Top = 30   
  Width = 165   
  Height = 22   
  Style = csOwnerDrawVariable   
  ItemHeight = 16   
  TabOrder = 0   
  OnDrawItem = ComboBox1DrawItem   
  OnMeasureItem = ComboBox1MeasureItem   
  end   
  object ListBox1: TListBox   
  Left = 216   
  Top = 28   
  Width = 151   
  Height = 167   
  ItemHeight = 16        
  Style = lbOwnerDrawVariable   
  TabOrder = 1   
  OnDrawItem = ListBox1DrawItem   
  OnMeasureItem = ListBox1MeasureItem   
  end   
  end