使对话框与“大字体”兼容。

时间:2010-03-31 10:59:30

标签: delphi dialog font-size pixel-fonts

您认为哪种最佳做法是使Windows对话框兼容标准字体(96 dpi)和“大字体”设置(120 dpi),以便对象不会重叠或被切断?

顺便说一句:以防它是相关的,我对Delphi对话框这样做感兴趣。

提前致谢!

5 个答案:

答案 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)中的一个关键弱点。

我认为第三方组件集可能是您目前最快的解决方案。这是商业化但不是非常昂贵。

http://www.devexpress.com/products/VCL/ExLayoutControl/