unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;
type
TForm1 = class(TForm)
ComboBox1: TComboBox;
ListBox1: TListBox;
procedure ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
procedure ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
begin
with Control as Tcombobox,Canvas do
begin
// fill the rectangle first with white
Brush.Color := clWhite;
FillRect(Rect);
// then reduce it and fill it with the color
InflateRect(Rect,-2,-2);
Brush.Color := StrToInt(Items[Index]);
FillRect(Rect);
end;
end;
procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
Bitmap: TBitmap; { temporary variable for the item뭩 bitmap }
Offset: Integer; { text offset width }
begin
with (Control as TListBox).Canvas do { draw on control canvas, not on the form }
begin
FillRect(Rect); { clear the rectangle }
Offset := 2; { provide default offset }
Bitmap := TBitmap((Control as TListBox).Items.Objects[Index]); { get the bitmap }
if Bitmap <> nilthen
begin
BrushCopy(Bounds(Rect.Left + Offset, Rect.Top, Bitmap.Width, Bitmap.Height),
Bitmap, Bounds(0, 0, Bitmap.Width, Bitmap.Height), clRed); {render bitmap}
Offset := Bitmap.width + 6; { add four pixels between bitmap and text}
end;
TextOut(Rect.Left + Offset, Rect.Top, (Control as TListBox).Items[Index]) { display the text }
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
combobox1.Items.Add(IntToStr(clRed));
combobox1.Items.Add(IntToStr(clFuchsia));
combobox1.Items.Add(IntToStr(clBlue));
combobox1.Items.Add(IntToStr(clGreen));
combobox1.Items.Add(IntToStr(clYellow));
end;
end.
// 여기서 저의 질문은 이렇습니다. 이 소스는 어디에 공개되어 있는 거하고 도움말에 있는 거 짬뽕입니다.
1) 리스트박스에는 비트맵 그림을 넣는다고 되어있는데 어떻게 비트맵 컴포넌트를 올려놓고 리스트 박스를 세팅을 해야 하는 건지여..
2) 콤보박스에 컬러를 넣는다고 되어있는데 어떻게 되는 건지 알수 가 없네여....
3) DrawItem안에 ShowMessage()란 메시지를 넣어도 이 메시지가 호출이 되질 않습니다...대체 언제 DrawItem이란 메시지가 호출이 되는 건지여.....
아무튼 이 소스가 돌아가게 해주실 고수님들의 조언 부탁드립니다.
콤보나 리스트박스엔 직접 아이템을 그리게하는 style라는 속성이 있습니다
그걸 csOwnerDrawFixed류 로 하시면 되구요
리스트박스의 Object생성부분이 없는듯하군요.
아래 첨부파일을 참조하세요.