gpt4 book ai didi

delphi - Delphi XE2 中从右到左的组合框,带有样式

转载 作者:行者123 更新时间:2023-12-03 18:28:11 25 4
gpt4 key购买 nike

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

BiDiMode := bdRightToLeft;
Style := csDropDownList;

没有自定义样式的 ComboBox:

enter image description here

以及自定义样式( Jade 浅石板):

enter image description here

我该如何修复它?

最佳答案

问题似乎位于 TComboBoxStyleHookDrawItem 方法中( TComboBox 的 vcl 样式 Hook ),您可以覆盖此方法来修复此问题。

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

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

不要忘记在 QC 中报告此错误内河码头页面。

关于delphi - Delphi XE2 中从右到左的组合框,带有样式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12152880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com