DPI 缩放运行时创建的控件具有 PopupMenu
DPI scaling runtime created controls having PopupMenu
我正在使用 Delphi 10.4.1 Sydney,并创建了一个简单的控件,它在运行时设置了 Parent
:
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()
(见代码中的注释)。
我认为这是由于在 TMyTree
构造函数中调用 PopupMenu := TPopupMenu.Create(Self);
时,VCL 将树的 ComponentState
设置为 [csFreeNotification]
。
我检查了 VCL 代码,更具体地说 TControl.SetParent()
。如果 csFreeNotification
在 ComponentState
中,那么 ScaleForPPI
是 NOT 调用,并且我们的树视图在设置 Parent
时不会缩放。
这是 VCL 中的错误,还是有一些其他首选方法来创建运行时控件并设置它们 Parent
?
顺便说一句,如果我在 TMyTree
构造函数中使用 TImageList.Create(Self)
,也会发生同样的问题。
我正在使用 Delphi 10.4.1 Sydney,并创建了一个简单的控件,它在运行时设置了 Parent
:
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()
(见代码中的注释)。
我认为这是由于在 TMyTree
构造函数中调用 PopupMenu := TPopupMenu.Create(Self);
时,VCL 将树的 ComponentState
设置为 [csFreeNotification]
。
我检查了 VCL 代码,更具体地说 TControl.SetParent()
。如果 csFreeNotification
在 ComponentState
中,那么 ScaleForPPI
是 NOT 调用,并且我们的树视图在设置 Parent
时不会缩放。
这是 VCL 中的错误,还是有一些其他首选方法来创建运行时控件并设置它们 Parent
?
顺便说一句,如果我在 TMyTree
构造函数中使用 TImageList.Create(Self)
,也会发生同样的问题。