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;
    TextOut(Rect.Left + Offset, Rect.Top, Combobox1.Items[Index])
    end;
end;
请解释一下
with (Control as TComboBox).Canvas do 这一句中 为什么要这样做啊 和
procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
里的 Control: TWinControl 的关系是什么

解决方案 »

  1.   

    是将TWinControl类型强制变为TComboBox类型, 这样的转换是很多的, 因为有些类型并无Canvas属性等原因
      

  2.   

    TWinControl并没有Canvas属性,要调用这个属性必须强制转换成TComboxBox才行
      

  3.   

    Control是包含要画的Item的控件
      

  4.   

    TWinControl是TComboBox的老爸
    TWinControl可以存储TComboBox对象
    但TWinControl的机能有限, 调用美女还是要TComboBox出马
      

  5.   

    调用这个属性必须强制转换成TComboxBox才行
      

  6.   

    同意 xirumin(吃好喝好) 的说法!
    有问题请发信息到我的E-mail:[email protected]
      

  7.   

    我感觉  :此事件传过来的参数,CONTROL:TWINCONTROL,需要显示的指明一下,后再进行处理,不知是否正确
      

  8.   

    with (Control as TComboBox).Canvas do 
    begin
    ……
    end;中间的属性基本都是(Control as TComboBox).Canvas 的属性,这样做避免重复录入,少打字
    :OControl必须是一个TComboBox的实例,才能这样引用
      

  9.   

    这个事件中,传过来的参数实际是一个 TComboBox控件。但参数定义的是TWinControl,为了访问到 TComboBox的属性,需要将TWinControl强制转换为TComboBox. 所以有
    Control as TComboBox
      

  10.   

    with (Control as TComboBox).Canvas do 
    如果你要写一个通用函数的话,这个语句是最好的,多个TCombobox不修改代码也可以通用。