如何更改 Delphi XE6 IDE 的字体大小

9

3
据我所知,你无法更改字体。它被硬编码了。 - Rudy Velthuis
1
你是不是像我一样有眼睛问题的人? - Gabriel
1
@Rigel。是的,但不仅如此。1991年我们在14英寸显示器上运行640x480(43 ppi)时,8pt字体很好。现在我们在22英寸显示器上运行1920x1080(58 ppi)。一切都变小了26%。16px工具栏图像在1991年可能还可以,但今天太小了。30年来,开发人员一直在以像素而不是对话框单位布局。如果他们要设计错误,那么现在是更新他们错误设计的时候了:工具栏图像现在必须为24 px,字体必须为11 pt,按钮必须高31px。或者他们可以做正确的事情:遵循用户的偏好。 - Ian Boyd
1
我开始在我的程序中添加一个选项(设置面板),允许用户更改表单的字体大小。 - Gabriel
2个回答

1

你无法更改字体
该字体是硬编码的,您无法更改它。

我尝试过以下方法:

1- 使用HEX编辑器更改BDS.EXE

如果您在HEX编辑器中打开BDS.EXE,请查找TextHeight并将值从$0D(13)更改为更大的值,然后更改后的bds.exe将完全相同。

2- 使用EnumChildWindows向Delphi IDE发送WM_SETFONT消息

您可以向正在运行的Delphi主窗口发送WM_SETFONT消息。
您必须使用FindWindow API调用查找窗口。

来自:http://msdn.microsoft.com/en-us/library/windows/desktop/ms632642%28v=vs.85%29.aspx

wParam
wParam是字体的句柄(HFONT)。如果此参数为NULL,则控件使用默认的系统字体来绘制文本。
lParam
lParam的低位字指定设置字体时是否应立即重绘控件。如果此参数为TRUE,则控件会重新绘制自己。

因为您希望Delphi使用默认字体,所以消息非常简单。

Delphi XE6主窗口名为TAppBuilder,因此您需要使用FindWindow获取该窗口的句柄。

我尝试过了,但没有起作用。

unit Unit4;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TForm4 = class(TForm)
    FontDialog1: TFontDialog;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

var
  Form4: TForm4;

implementation

{$R *.dfm}

const
  DelphiWindows: array [1 .. 1] of PWideChar = ('TAppBuilder');

function EnumChildProc(const hWindow: hWnd; const hFont: LParam): boolean; stdcall;
begin
  SendMessage(hWindow, WM_SETFONT, hFont, 1);
  Result:= True;
end;

procedure TForm4.Button1Click(Sender: TObject);
var
  BDSWindow: HWND;
  ChildWindow: HWnd;
  Font: HFONT;
  i: Integer;
begin
  if FontDialog1.Execute then begin
    BDSWindow:= FindWindow(DelphiWindows[1], nil);
    Font:= FontDialog1.Font.Handle;
    EnumChildWindows(BDSWindow, @EnumChildProc, Font);
    ShowMessage('Done');
  end;
end;

end.

我没有尝试默认字体,因为在我的系统上,Delphi字体和默认字体相同。而且我不想更改默认字体。

这样做会更改我的Delphi中的2个下拉框。效果不太好。

我将此作为答案发布,希望您可以从这里找到解决方案。


值得注意的是,即使您设法更改字体大小,IDE也是使用当前字体大小设计的,因此它可能无法与新大小很好地配合使用(甚至可能使其无法使用)。在UI中容纳字体大小和缩放有时是一项艰苦的工作,而Delphi IDE在这方面有许多复杂的UI要处理。(顺便说一句,这可能是没有内置更改字体大小功能的原因。) - Ken White
您不能将字体句柄发送到另一个进程,这样不起作用:“GDI 对象句柄对于进程是私有的。也就是说,只有创建 GDI 对象的进程才能使用对象句柄。” - Sertac Akyuz
@SertacAkyuz,是的,你说得对,但是你可以发送一个空的hFont,这告诉窗口使用系统默认字体。然而,我怀疑DBS.EXE会忽略WM_SETFONT消息。 - Johan
1
有趣的是,Raymond Chen刚刚发布了关于WM_SETFONT和WM_GETFONT以及它们为什么可能无法正常工作的文章。请参见当我向窗口发送WM_GETFONT消息时,为什么我得不到字体? - Ken White

0

最好的方法是使用Delphi IDE主题编辑器,它非常简单。请尝试在Delphi IDE Theme Editor中预览:

enter image description here


这将会改变编辑器中字体的大小,而不是整个IDE环境。请再次仔细阅读问题 :) - Gabriel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接