您认为哪种最佳做法是使Windows对话框兼容标准字体(96 dpi)和“大字体”设置(120 dpi),以便对象不会重叠或被切断?
顺便说一句:以防它是相关的,我对Delphi对话框这样做感兴趣。提前致谢!
答案 0 :(得分:8)
通常,应该使用布局管理器来实现此目的。这就是他们的目的。
Delphi(长期没有使用它)没有这样的经理,但从那以后能够处理不同的dpi。您必须使用组件的自动调整大小来确保它们具有适合其显示的文本的大小。为了防止组件重叠,使用对齐和锚属性将它们排列在表单上。最终,您必须将容器中的组件分组才能实现正确的布局。
答案 1 :(得分:7)
在D2007帮助文件中有一篇非常好的文章,在“Considerations When Dynamically Resizing Forms and Controls”下面(注意URL是帮助文件本身,而不是网页本身)。
可以在D2010 help file(与上述网址相同的警告)或docwiki上找到相同名称的相同主题。
检查TForm.Scaled和TForm.ScaleBy也值得(至少一点点)。
答案 2 :(得分:2)
无论Window的字体大小设置如何,这都是我尝试处理Delphi VCL像素的方式。
unit App.Screen;
interface
uses Controls;
type
TAppScreen = class(TObject)
private
FDefaultPixelsPerInch: integer;
FPixelsPerInch: integer;
function GetPixelsPerInch: integer;
procedure SetPixelsPerInch(const Value: integer);
public
procedure AfterConstruction; override;
function DefaultPixelsPerInch: integer;
function InAcceptableRange(const aPPI: integer): boolean;
procedure ScaleControl(const aControl: TWinControl);
property PixelsPerInch: integer read GetPixelsPerInch write SetPixelsPerInch;
end;
TAppScreenHelper = class helper for TAppScreen
private
class var FInstance: TAppScreen;
class function GetInstance: TAppScreen; static;
public
class procedure Setup;
class procedure TearDown;
class property Instance: TAppScreen read GetInstance;
end;
implementation
uses
TypInfo, Windows, SysUtils, Forms, Graphics;
type
TScreenEx = class(TScreen)
published
property PixelsPerInch;
end;
TScreenHelper = class helper for TScreen
public
procedure SetPixelsPerInch(Value: integer);
end;
procedure TScreenHelper.SetPixelsPerInch(Value: integer);
begin
PInteger(Integer(Self) + (Integer(GetPropInfo(TScreenEx, 'PixelsPerInch').GetProc) and $00FFFFFF))^ := Value;
end;
procedure TAppScreen.AfterConstruction;
begin
inherited;
FDefaultPixelsPerInch := Screen.PixelsPerInch;
FPixelsPerInch := FDefaultPixelsPerInch;
end;
function TAppScreen.DefaultPixelsPerInch: integer;
begin
Result := FDefaultPixelsPerInch;
end;
function TAppScreen.GetPixelsPerInch: integer;
begin
Result := FPixelsPerInch;
end;
function TAppScreen.InAcceptableRange(const aPPI: integer): boolean;
begin
if DefaultPixelsPerInch > aPPI then
Result := DefaultPixelsPerInch * 0.55 < aPPI
else if DefaultPixelsPerInch < aPPI then
Result := DefaultPixelsPerInch * 1.55 > aPPI
else
Result := True;
end;
procedure TAppScreen.ScaleControl(const aControl: TWinControl);
begin
aControl.ScaleBy(PixelsPerInch, DefaultPixelsPerInch);
end;
procedure TAppScreen.SetPixelsPerInch(const Value: integer);
begin
FPixelsPerInch := Value;
Screen.SetPixelsPerInch(FPixelsPerInch);
end;
class function TAppScreenHelper.GetInstance: TAppScreen;
begin
if FInstance = nil then
FInstance := TAppScreen.Create;
Result := FInstance;
end;
class procedure TAppScreenHelper.Setup;
begin
TAppScreen.Instance;
end;
class procedure TAppScreenHelper.TearDown;
begin
FInstance.Free;
FInstance := nil;
end;
initialization
TAppScreen.Setup;
finalization
TAppScreen.TearDown;
end.
尝试以下方法测试不同像素值的效果:
TAppScreen.Instance.PixelsPerInch := 120;
TAppScreen.Instance.PixelsPerInch := 96;
TAppScreen.Instance.PixelsPerInch := 150;
你应该在实例化TForm的后代之前改变PixelsPerInch,包括Delphi的VCL对话框。
答案 3 :(得分:0)
但除此之外呢?也许:
我从未尝试过在这种情况下使用TLabeledEdit,也许他们会自动执行此操作?
答案 4 :(得分:0)
有一些声称的商业解决方案(Developer Express VCL布局管理器)。但我不相信他们中的任何一个。我怀疑Embarcadero应该将此作为当前UI组件集(VCL)中的一个关键弱点。
我认为第三方组件集可能是您目前最快的解决方案。这是商业化但不是非常昂贵。