Delphi DPI缩放运行时创建的具有弹出菜单的控件
我正在使用Delphi 10.4.1 Sydney,并创建了一个简单的控件,在运行时设置了它的Delphi DPI缩放运行时创建的具有弹出菜单的控件,delphi,dpi,Delphi,Dpi,我正在使用Delphi 10.4.1 Sydney,并创建了一个简单的控件,在运行时设置了它的父控件: constructor TMyTree.Create(AOwner: TComponent); begin inherited Create(Owner); PopupMenu := TPopupMenu.Create(Self); end; procedure TMyTree.ChangeScale(M, D: Integer; isDpiChange: boolean); beg
父控件
:
constructor TMyTree.Create(AOwner: TComponent);
begin
inherited Create(Owner);
PopupMenu := TPopupMenu.Create(Self);
end;
procedure TMyTree.ChangeScale(M, D: Integer; isDpiChange: boolean);
begin
inherited ChangeScale(M, D, isDpiChange);
OutputDebugString(PChar(Format('M: %d, D: %d', [M, D])));
//The program is started at 150% DPI and DPI changed to 175% DPI
//Debug Output: M: 168, D: 96 - ERROR! It should be M: 168, D: 144
end;
procedure TMainForm.FormCreate(Sender: TObject);
begin
fTree := TMyTree.Create(Self);
fTree.Parent := Self;
OutputDebugString(PChar(Format('CurrentPPI: %d', [fTree.CurrentPPI])));
//Debug Output at 150% DPI scale: CurrentPPI: 144 - OK!
end;
问题在于VCL使用错误的参数调用了ChangeScale()
(请参见代码中的注释)
我认为这是因为当PopupMenu:=TPopupMenu.Create(Self)在TMyTree
构造函数中调用code>,VCL将树的组件状态设置为[csFreeNotification]
我已经检查了VCL代码,更具体地说是TControl.SetParent()
。如果csFreeNotification
处于ComponentState
状态,则不会调用ScaleForPPI
,并且在设置其Parent
时不会缩放我们的树视图
这是VCL中的一个错误,还是有其他一些首选方法来创建运行时控件并设置它们的父项
顺便说一句,如果我在TMyTree
构造函数中使用TImageList.Create(Self)
,同样的问题也会发生。这是VCL中已知的问题。在中报告了与此相关的多张票证:
我对这些问题投了赞成票。我们希望EMBA不会再花三年的时间来解决这些问题。我认为这是一个重大问题。