1. 建立一个窗体 2. 放一个ComboBox和Listbox 3. 改变Component的Style为csOwnerDrawVariable和ListBox的Style为lbOwnerDrawVariable。 4. 声明5个TBitmap的全局变量 5. 覆盖Form的OnCreate. 6. 覆盖ComboBox的OnDraw. 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:/delphi/images/buttons/globe.bmp'); TheBitmap2 := TBitmap.Create; TheBitmap2.LoadFromFile('C:/delphi/images/buttons/video.bmp'); TheBitmap3 := TBitmap.Create; TheBitmap3.LoadFromFile('C:/delphi/images/buttons/gears.bmp'); TheBitmap4 := TBitmap.Create; TheBitmap4.LoadFromFile('C:/delphi/images/buttons/key.bmp'); TheBitmap5 := TBitmap.Create; TheBitmap5.LoadFromFile('C:/delphi/images/buttons/tools.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 |