Q&A

  • 콤보박스에는 컬러를 리스트 박스에는 비트맵 넣는 소스에 대해.
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이란 메시지가 호출이 되는 건지여.....

아무튼 이 소스가 돌아가게 해주실 고수님들의 조언 부탁드립니다.
2  COMMENTS
  • Profile
    홍성락 2002.07.24 01:02
    hsr//////////////////////////////////////////////////////////////
    콤보나 리스트박스엔 직접 아이템을 그리게하는 style라는 속성이 있습니다
    그걸 csOwnerDrawFixed류 로 하시면 되구요
    리스트박스의 Object생성부분이 없는듯하군요.
    아래 첨부파일을 참조하세요.
  • Profile
    델파이사랑 2002.07.24 02:02
    정말 감사합니다...해결이 되었습니다....^^(냉무)