1. unit Unit3;
  2. interface
  3. uses
  4. Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
  5. System.Classes, Vcl.Graphics,
  6. Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Themes;
  7. type
  8. TComboBoxStyleHookFix = class(TComboBoxStyleHook)
  9. protected
  10. procedure DrawItem(Canvas: TCanvas; Index: Integer; const R: TRect;
  11. Selected: Boolean); override;
  12. end;
  13. { TComboBoxStyleHookFix }
  14. TForm3 = class(TForm)
  15. ComboBox1: TComboBox;
  16. procedure FormCreate(Sender: TObject);
  17. private
  18. { Private declarations }
  19. public
  20. { Public declarations }
  21. end;
  22. var
  23. Form3: TForm3;
  24. implementation
  25. {$R *.dfm}
  26. procedure TComboBoxStyleHookFix.DrawItem(Canvas: TCanvas; Index: Integer;
  27. const R: TRect; Selected: Boolean);
  28. var
  29. DIS: TDrawItemStruct;
  30. Text: string;
  31. begin
  32. begin
  33. FillChar(DIS, SizeOf(DIS), 0);
  34. DIS.CtlType := ODT_COMBOBOX;
  35. DIS.CtlID := GetDlgCtrlID(Handle);
  36. DIS.itemAction := ODA_DRAWENTIRE;
  37. DIS.hDC := Canvas.Handle;
  38. DIS.hwndItem := Handle;
  39. DIS.rcItem := R;
  40. Text := TComboBox(Control).Items[Index];
  41. DIS.rcItem.Left := DIS.rcItem.Left +
  42. (DIS.rcItem.Width - Canvas.TextWidth(Text) - 5);
  43. DIS.itemID := Index;
  44. DIS.itemData := SendMessage(ListHandle, LB_GETITEMDATA, 0, 0);
  45. if Selected then
  46. DIS.itemState := DIS.itemState { or ODS_FOCUS } or ODS_SELECTED;
  47. SendMessage(Handle, WM_DRAWITEM, Handle, LPARAM(@DIS));
  48. end;
  49. end;
  50. procedure TForm3.FormCreate(Sender: TObject);
  51. begin
  52. TStyleManager.Engine.RegisterStyleHook(TComboBox, TComboBoxStyleHookFix);
  53. end;
  54. end.