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

你认为哪种最佳做法可以使标准字体(96 dpi)和“大字体”设置(120 dpi)兼容,从而使对象不会重叠或被切断?

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

提前致谢!

D2007帮助文件中的“ dynamic调整窗体和控件的dynamic调整注意事项 ”下有一篇相当不错的文章(注意URL是帮助文件本身,而不是网页本身)。

在D2010帮助文件 (关于上面的URL的同样警告)中或者在docwiki上可以find同样的主题,名称相同。

检查TForm.Scaled和TForm.ScaleBy也是值得的(至less是一点点)。

一般来说,应该使用布局pipe理器来达到这个目的。 那是他们devise的。

delphi(很长一段时间没有使用它)没有这样的pipe理器,但自那以后能够处理不同的dpi。 您必须使用组件的autosize propery来确保它们显示的文本尺寸合适。 为了防止组件重叠,使用alignment和锚定属性将它们排列在表单上。 最终,您必须对容器中的组件进行分组以实现适当的布局。

无论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. 

尝试以下testing不同像素值的影响:

 TAppScreen.Instance.PixelsPerInch := 120; TAppScreen.Instance.PixelsPerInch := 96; TAppScreen.Instance.PixelsPerInch := 150; 

在实例化包括Delphi的VCL对话框的TForm的后代之前,你应该改变PixelsPerInch。

  • 切勿将控件和其描述标签并排放置,始终将标签放在上面。

但除此之外呢? 也许:

  • 在标签的右侧和底部留出足够的空间,以便在使用大型字体时不会与其他控件重叠。

在这种情况下,我从来没有尝试过使用TLabeledEdit,也许他们自动这样做?

有宣称的商业解决scheme(Developer Express VCL布局pipe理器)。 但是我不相信他们中的任何一个。 我怀疑Embarcadero应该将此视为当前UI组件集(VCL)中的一个关键弱点。

我认为第三方组件集可能是目前最快的解决scheme。 这是商业,但不是很贵。

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

Interesting Posts