ComboBox справа налево в Delphi XE2 со стилями

У меня возникают проблемы при использовании ComboBox в Delphi XE2 с пользовательскими стилями (Emerald Light Slate) и этим свойством:

BiDiMode := bdRightToLeft;
Style := csDropDownList;

Этот ComboBox без пользовательского стиля:

введите здесь описание изображения

И с пользовательскими стилями (изумрудно-светлый сланец):

введите здесь описание изображения

Как это исправить?


person Pejman.Nik    schedule 28.08.2012    source источник


Ответы (1)


Проблема, похоже, связана с методом DrawItem в TComboBoxStyleHook ( vcl для TComboBox), вы можете исправить это, переопределив это метод.

Попробуйте этот пример кода (это решение далеко не идеально, но это только начало)

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);

введите здесь описание изображения

Не забудьте сообщить об этой ошибке на странице QC Embarcadero.

person RRUZ    schedule 28.08.2012
comment
Спасибо! я не могу сообщить! Я иранец, и Embarcadero не позволяет нам этого! :( - person Pejman.Nik; 28.08.2012
comment
как я могу использовать его во всех моих проектах (например, в кадрах)? - person Pejman.Nik; 28.08.2012
comment
переместите строку TStyleManager.Engine.RegisterStyleHook(TComboBox, TComboBoxStyleHookFix); в часть инициализации вашего модуля, например, paste2.org/p/2164541 - person RRUZ; 29.08.2012