将Inno Setup许可证备忘录切换到RTL模式

问题描述

我正在创建具有多种语言的安装程序, 有些语言需要RTL指导才能自然显示。 这是我用于许可证页面代码

LicenseMemo := TNewMemo.Create(WizardForm);
with LicenseMemo do
begin
  Parent     := WizardForm.LicensePage;
  Left       := ScaleX(0);
  Top        := ScaleY(50);
  Width      := ScaleX(520);
  Height     := ScaleY(210);
  Color      := TColor($d3d3d3);
  Font.Color := clBlack;
  ScrollBars := ssvertical;
  Text       := WizardForm.LicenseMemo.Text;
  LicenseMemo.Font.Size := 12
  ReadOnly   := True;
end;

我知道我可以通过向RightToLeft=yes添加[LangOptions]使程序完全RTL。但这使程序看起来很糟糕– Ii仅需要RTL才能访问许可证页面。有人可以帮忙吗?我将RTF文件用于许可证页面

解决方法

使用TRichEditViewer并将WS_EX_LAYOUTRTL添加到其GWL_EXSTYLE

const 
  GWL_EXSTYLE = -20;
  WS_EX_LAYOUTRTL = $400000;

function GetWindowLong(hWnd: THandle; Index: Integer): LongInt;
  external 'GetWindowLongW@User32.dll stdcall';
function SetWindowLong(hWnd: THandle; Index: Integer; NewLong: LongInt): LongInt;
  external 'SetWindowLongW@user32.dll stdcall';
SetWindowLong(
  RichEditViewer.Handle,GWL_EXSTYLE,GetWindowLong(RichEditViewer.Handle,GWL_EXSTYLE) or WS_EX_LAYOUTRTL);