在Delphi XE2中使用样式的ComboBox从右到左

时间:2012-08-28 04:42:22

标签: delphi delphi-xe2 vcl-styles

当我在Delphi XE2中使用带有自定义样式(Emerald Light Slate)的ComboBox和此属性时,我遇到了问题:

BiDiMode := bdRightToLeft;
Style := csDropDownList;

没有自定义样式的ComboBox:

enter image description here

使用自定义样式(Emerald Light Slate):

enter image description here

我如何解决?

1 个答案:

答案 0 :(得分:4)

它似乎位于TComboBoxStyleHook TComboBoxDrawItem方法中的问题(QC的vcl样式挂钩),你可以解决这个方法。

试试这个示例代码(这个解决方案远非完美,但却是一个开始)

type
  TComboBoxStyleHookFix = class(TComboBoxStyleHook)
  protected
    procedure DrawItem(Canvas: TCanvas; Index: Integer;
      const R: TRect; Selected: Boolean); override;
  end;

{ TComboBoxStyleHookFix }

procedure TComboBoxStyleHookFix.DrawItem(Canvas: TCanvas; Index: Integer;
  const R: TRect; Selected: Boolean);
var
  DIS  : TDrawItemStruct;
  Text : string;
begin
  if Control.BiDiMode<>bdRightToLeft then
   inherited
  else
  begin
    FillChar(DIS, SizeOf(DIS), 0);
    DIS.CtlType := ODT_COMBOBOX;
    DIS.CtlID := GetDlgCtrlID(Handle);
    DIS.itemAction := ODA_DRAWENTIRE;
    DIS.hDC := Canvas.Handle;
    DIS.hwndItem := Handle;
    DIS.rcItem := R;
    Text:=TComboBox(Control).Items[Index];    
    DIS.rcItem.Left:=DIS.rcItem.Left+ (DIS.rcItem.Width-Canvas.TextWidth(Text)-5);    
    DIS.itemID := Index;
    DIS.itemData := SendMessage(ListHandle, LB_GETITEMDATA, 0, 0);
    if Selected then
      DIS.itemState := DIS.itemState {or ODS_FOCUS} or ODS_SELECTED;
    SendMessage(Handle, WM_DRAWITEM, Handle, LPARAM(@DIS));
  end;
end;

以这种方式使用

 TStyleManager.Engine.RegisterStyleHook(TComboBox, TComboBoxStyleHookFix);

enter image description here

不要忘记在Embarcadero的{{3}}页面中报告此错误。