Delphi XE2 で ComboBox をカスタム スタイル (Emerald Light Slate) とこのプロパティで使用すると問題が発生します。
BiDiMode := bdRightToLeft;
Style := csDropDownList;
カスタムスタイルのないコンボボックス:
カスタム スタイル (エメラルド ライト スレート) の場合:
どうすれば修正できますか?
Delphi XE2 で ComboBox をカスタム スタイル (Emerald Light Slate) とこのプロパティで使用すると問題が発生します。
BiDiMode := bdRightToLeft;
Style := csDropDownList;
カスタムスタイルのないコンボボックス:
カスタム スタイル (エメラルド ライト スレート) の場合:
どうすれば修正できますか?
問題DrawItem
はTComboBoxStyleHook ( TComboBoxの 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);
EmbarcaderoのQCページでこのバグを報告することを忘れないでください。