如何在样式设置为简单的组合框中放置位图?例如,Google Chrome右侧有一颗星,Firefox右侧有箭头。我试过这段代码:
procedure TForm2.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
Rect: TRect; State: TOwnerDrawState);
var
ComboBox: TComboBox;
bitmap: TBitmap;
begin
ComboBox := (Control as TComboBox);
Bitmap := TBitmap.Create;
try
ImageList1.GetBitmap(0, Bitmap);
with ComboBox.Canvas do
begin
FillRect(Rect);
if Bitmap.Handle <> 0 then Draw(Rect.Left + 2, Rect.Top, Bitmap);
Rect := Bounds(Rect.Left + ComboBox.ItemHeight + 2, Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top);
DrawText(handle, PChar(ComboBox.Items[0]), length(ComboBox.Items[0]), Rect, DT_VCENTER+DT_SINGLELINE);
end;
finally
Bitmap.Free;
end;
end;
有效,但仅限于样式:csOwnerDrawFixed和csOwnerDrawVariable,位图也只能在项目上显示。
感谢。
答案 0 :(得分:5)
...位图也只在项目上可见。
要在所有者绘制的组合框的编辑器中绘制位图,请检查所有者绘制状态中的odComboBoxEdit
:
type
TComboBox = class(StdCtrls.TComboBox)
private
FBmp: TBitmap;
FBmpPos: TPoint;
protected
procedure DrawItem(Index: Integer; Rect: TRect;
State: TOwnerDrawState); override;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
constructor TComboBox.Create(AOwner: TComponent);
begin
inherited Create(AOwner);
FBmp := TBitmap.Create;
FBmp.Canvas.Brush.Color := clGreen;
FBmp.Width := 16;
FBmp.Height := 16;
end;
destructor TComboBox.Destroy;
begin
FBmp.Free;
inherited Destroy;
end;
procedure TComboBox.DrawItem(Index: Integer; Rect: TRect;
State: TOwnerDrawState);
begin
TControlCanvas(Canvas).UpdateTextFlags;
if Assigned(OnDrawItem) then
OnDrawItem(Self, Index, Rect, State)
else
begin
Canvas.FillRect(Rect);
if Index >= 0 then
Canvas.TextOut(Rect.Left + 2, Rect.Top, Items[Index]);
if odComboBoxEdit in State then
begin
Dec(Rect.Right, FBmp.Width + Rect.Left);
FBmpPos.X := Rect.Right + Rect.Left;
FBmpPos.Y := (Height - FBmp.Height) div 2;
if ItemIndex > -1 then
Canvas.TextOut(Rect.Left + 2, Rect.Top, Items[ItemIndex]);
Canvas.Draw(FBmpPos.X, FBmpPos.Y, FBmp);
end;
end;
end;
为了在非所有者绘制的组合框上绘制位图,您必须使用自定义的WM_NCPAINT
处理程序在组合框本身的窗口中绘制。