当BiDiMode = bdRightToLeft和Style = csDropDownList并且应用程序使用VCL样式

时间:2015-09-01 17:39:10

标签: delphi delphi-xe8 vcl-styles tcombobox

enter image description here enter image description here

喜。

当BiDiMode = bdRightToLeft和Style = csDropDownList并且应用程序使用VCL Style时,

TComboBoxEx项目没有正确绘制;在DropDown列表中,左侧绘制的图标和文字以及选择项目时,左侧绘制的图标和文本将消失!

我看到了Right to left ComboBox in Delphi XE2 with styles,但没有帮助我。

我该怎么做才能纠正它并在ComboBoxEx右侧绘制图标和文字(第一个图标和下一个文本)?

这正是我所需要的,我用Photoshop设计了这个样本:

enter image description here

我使用Delphi XE8

请帮帮我。

1 个答案:

答案 0 :(得分:1)

BiDiMode适用于从右到左书写的语言,因此并不适用于您的需求。

我看不到使用TComboBoxEx的方法,但你可以很容易地使用TComboBox。

添加TComboBox并使其样式为csOwnerDrawFixed。我在下面的代码中假设TImageList(你必须已经拥有)和TComboBox的基本名称。您需要根据自己的名称进行修改。添加一个OnDrawItem事件,类似于下面的事件。 (你可能想稍微调试一下)。

procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  iImageWidth, iTextWidth, iMargin : integer;
  iText : string;
  iCanvas : TCanvas;
begin
  // draw image at right and text right justify
  // assume image index = Item for now.
  iCanvas := ComboBox1.Canvas;
  // need to check state; Just ignore for now.
  iImageWidth := ImageList1.Width;
  iMargin := 4; // pixels - can calculate instead
  iText := ComboBox1.Items[ Index ];
  iTextWidth := iCanvas.TextWidth( iText);

  ImageList1.Draw( iCanvas, Rect.Right - iImageWidth - iMargin, Rect.Top, Index );
  iCanvas.TextOut( Rect.Right - 2 * iMargin - iTextWidth - iImageWidth, Rect.Top, iText);
end;

我测试了它并且工作正常

更新

这是我在运行中的图像,其中显示了完整的代码 Dropped down