Элемент TComboBoxEx не отображается правильно, когда BiDiMode= bdRightToLeft и Style= csDropDownList и приложение используют стиль VCL
Привет.
Элемент TComboBoxEx не отображается правильно, когда BiDiMode= bdRightToLeft и Style= csDropDownList и приложение используют стиль VCL; в выпадающем списке значок и текст нарисованы слева, а при выборе элемента значок нарисован слева и текст исчезнет!
Я видел справа налево ComboBox в Delphi XE2 со стилями, но мне это не помогло.
что я должен сделать, чтобы исправить это и нарисовать значок и текст (первый значок, а затем текст) на правой стороне ComboBoxEx?
Это именно то, что мне нужно, и я разработал этот образец с помощью Photoshop:
Я использую Delphi XE8
Пожалуйста, помогите мне.
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;
Я проверил это, и он отлично работает
Обновить
Вот мое изображение этого в действии с точно показанным кодом