Вопрос Выбор языка

JEKE24

Новичок
Листинг из LanguageForm.iss
code_language.pascal:
[Code]
[Code]
var
  AutoRun: TSetupForm;
  eng,nocl: boolean;
  AutoRunMsg, Palka: TLabel;
  RuBtn, EnBtn, InstallBtn, CloseBtn: HWND;
  WFButtonFont: TFont;
  fh, hResInfo, hResAddr: THandle;
  pcFonts, iResSize: DWORD;
function ShowWindow(hWnd: HWND; nCmdShow: Integer): BOOL; external 'ShowWindow@user32.dll stdcall';


procedure LabelAutoRunOnMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
begin
  ReleaseCapture;
  SendMessage(AutoRun.Handle,$0112,$F012,0)
end;
(*
SelectLanguage определяет, какой язык выбрал пользователь на форме выбора языка  установки,
и соответственно изменяет названия кнопок и заголовков формы на выбранный язык.
В частности, при выборе русского языка (если переменная hBtn равна RuBtn),
код меняет текст кнопки "Install" на "Установить" (BtnSetText(InstallBtn,'Установить');),
заголовок формы на "RUS - SETUP" (Application.Title := 'RUS - SETUP';),
текст кнопки "Close" на "Выход" (BtnSetText(CloseBtn,'Выход');) и т.д.
Если пользователь выбрал английский язык (если переменная hBtn равна EnBtn),
то код меняет соответствующие тексты на английский язык.
Кроме того, код также изменяет состояние переменной eng,
чтобы в дальнейшем использовать ее при установке настроек и перевода текстов в других частях программы.
*)
procedure SelectLanguage(hBtn:HWND);
begin
  BtnSetChecked(hBtn,True);
  if hBtn=RuBtn then begin
    BtnSetText(InstallBtn,'Установить');
    Application.Title := 'RUS - SETUP';
    BtnSetText(CloseBtn,'Выход');
    BtnSetChecked(EnBtn,False);
    AutoRunMsg.Caption := 'Выберите язык установки';
    SelectLanguageForm.LangCombo.ItemIndex := 1;
    eng :=false;
  end;
  if hBtn=EnBtn then begin
    BtnSetText(InstallBtn,'Install');
    Application.Title := 'ENG - SETUP';
    BtnSetText(CloseBtn,'Close');
    BtnSetChecked(RuBtn,False);
    AutoRunMsg.Caption := 'Select setup language';
    SelectLanguageForm.LangCombo.ItemIndex := 0;
    eng :=true;
  end;
end;
(* InstallBtnClick Когда пользователь нажимает эту кнопку, сначала проверяется, выбран ли английский язык (eng).
Если это не так, то проверяется текущий язык интерфейса операционной системы (GetUILanguage),
  и соответствующий элемент выпадающего списка языков выбирается автоматически
  в окне выбора языка установки (SelectLanguageForm.LangCombo).
   Затем выполняется закрытие окна установки и скрытие главного окна приложения.*)
procedure InstallBtnClick(hBtn:HWND);
begin
if not eng then
begin
  if GetUILanguage = $0419 then
    SelectLanguageForm.LangCombo.ItemIndex := 1
  else
    SelectLanguageForm.LangCombo.ItemIndex := 0;
end;
  AutoRun.ModalResult:= mrOk;
  ShowWindow(Application.Handle, SW_HIDE);
end;
(*
CloseBtnClick представляет процедуру обработки нажатия на кнопку "Закрыть"
в окне AutoRun. При вызове процедуры метод Close()
объекта AutoRun закрывает окно.
*)
procedure CloseBtnClick(hBtn:HWND);
begin
  AutoRun.Close;
end;
(*
ButtonFont объявляет процедуру ButtonFont,
которая создает объект TFont и задает его свойства Size и Name.
В данном случае создается шрифт Tahoma размера 8 для использования
в кнопках. Вероятно, данная процедура используется в других местах
кода для установки шрифта кнопок на форме.
*)
procedure ButtonFont;
begin
  WFButtonFont:= TFont.Create;
  WFButtonFont.Size:=8;
  WFButtonFont.Name:='Tahoma';
end;

(*AutoRunOnCloseQuery процедура является обработчиком события OnCloseQuery
для формы AutoRun и выполняется при попытке закрытия формы.
Она устанавливает значение переменной NoCl в True, если ModalResult
не равен mrOk, что означает, что пользователь не нажал кнопку "Установить"
или "Install". Затем переменной CanClose устанавливается значение True,
что позволяет закрыть форму. Если бы значение CanClose было False,
форма не закрылась бы, и пользователю было бы предложено выбрать
один из вариантов действия, которые могут быть определены в свойствах формы AutoRun.*)
procedure AutoRunOnCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
if AutoRun.ModalResult<>mrOk then
  NoCl:= True;
  CanClose:= True;
end;
(*
LangEng создает новую форму с именем AutoRun, устанавливает ее параметры
в соответствии с заданными значениями (например, размер и позицию),
устанавливает стиль границы формы и отключает автоматическую прокрутку,
а также назначает обработчик события OnCloseQuery
*)
function LangEng: boolean;
begin
  AutoRun := CreateCustomForm;
  with AutoRun do
  begin
    BorderStyle := bsNone;
    AutoScroll := False;
    ClientHeight := ScaleY(200);
    ClientWidth := ScaleX(300);
    Position := poScreenCenter;
    OnCloseQuery:= @AutoRunOnCloseQuery;
  end;
  AutoRunMsg:= TLabel.Create(AutoRun);
  with AutoRunMsg do
  begin
    Parent:=AutoRun;
    AutoSize:=False;
    SetBounds(ScaleX(9), ScaleY(6), ScaleX(387), ScaleY(14));
    Font.Size:= 11;
    Font.Color := $005F5F5F;
    Font.Name := '{#FontName}';
    Transparent:=True;
    OnMouseDown:=@LabelAutoRunOnMouseDown;
    Caption := 'Выберите язык установки';
  end;
  RuBtn:=BtnCreate(AutoRun.Handle,ScaleX(17),ScaleY(137),ScaleX(40),ScaleY(29),ExpandConstant('Ru.png'),0,True);
  BtnSetEvent(RuBtn,BtnClickEventID,WrapBtnCallback(@SelectLanguage,1));
  BtnSetCursor(RuBtn,GetSysCursorHandle(32649));
  if GetUILanguage = $0419 then
    BtnSetChecked(RuBtn,True)
  else
    BtnSetChecked(EnBtn,True);
  EnBtn:=BtnCreate(AutoRun.Handle,ScaleX(68),ScaleY(137),ScaleX(40),ScaleY(29),ExpandConstant('Us.png'),0,True);
  BtnSetCursor(EnBtn,GetSysCursorHandle(32649));
  BtnSetEvent(EnBtn,BtnClickEventID,WrapBtnCallback(@SelectLanguage,1));
  InstallBtn:=BtnCreate(AutoRun.Handle,ScaleX(127),ScaleY(138),ScaleX(75),ScaleY(26),ExpandConstant('Button.png'),0,False);
  BtnSetEvent(InstallBtn,BtnClickEventID,WrapBtnCallback(@InstallBtnClick,1));
  BtnSetCursor(InstallBtn,GetSysCursorHandle(32649));
  BtnSetFont(InstallBtn,WFButtonFont.Handle);
  if GetUILanguage = $0419 then
    BtnSetText(InstallBtn,'Установить')
  else
    BtnSetText(InstallBtn,'Install');
  BtnSetFontColor(InstallBtn,$00695E5E,clwhite,$00695E5E,clGray);
  CloseBtn:=BtnCreate(AutoRun.Handle,ScaleX(209),ScaleY(138),ScaleX(75),ScaleY(26),ExpandConstant('Button.png'),0,False);
  BtnSetEvent(CloseBtn,BtnClickEventID,WrapBtnCallback(@CloseBtnClick,1));
  BtnSetCursor(CloseBtn,GetSysCursorHandle(32649));
  BtnSetFont(CloseBtn,WFButtonFont.Handle);
  if GetUILanguage = $0419 then
    BtnSetText(CloseBtn,'Выход')
  else
    BtnSetText(CloseBtn,'Close');
  BtnSetFontColor(CloseBtn,$00695E5E,clwhite,$00695E5E,clGray);
  ImgLoad(AutoRun.Handle,ExpandConstant('LanguageFormImage.jpg'),0,0,AutoRun.Width,AutoRun.Height,True,True);
  ImgApplyChanges(AutoRun.Handle);
  if GetUILanguage = $0419 then
    Application.Title := 'RUS - FORM'
  else
    Application.Title := 'ENG - FORM';
  Palka := TLabel.Create(AutoRun);
  with Palka do begin
    AutoSize:=False;
    Font.Color := clWhite;
    Font.Size := 18;
    SetBounds(ScaleX(58), ScaleY(135), ScaleX(25), ScaleY(35));
    Caption := '|';
    Parent:=AutoRun;
  end;
  SetClassLong(AutoRun.Handle, (-26), GetWindowLong(AutoRun.Handle, (-26)) or $00020000);
  SetWindowLong(AutoRun.Handle, GWL_EXSTYLE, GetWindowLong(AutoRun.Handle, GWL_EXSTYLE) or WS_EX_LAYERED);
  SetLayeredWindowAttributes(AutoRun.Handle, 0, (255 * TransparentPercent) / 100, LWA_ALPHA);
  AutoRun.ShowModal;
  AutoRun.Free;
end;
(*Init выполняет инициализацию необходимых ресурсов для установщика.
Он проверяет наличие нескольких DLL-файлов и, если они отсутствуют,
извлекает их из временного каталога. Затем он проверяет,
существует ли шрифт с заданным именем, и если он не существует,
загружает шрифт из ресурсов и добавляет его в систему с помощью
функции AddFontMemResourceEx. Наконец, он вызывает процедуру ButtonFont,
которая устанавливает стандартный шрифт и размер для кнопок в интерфейсе установщика.*)
procedure Init;
begin
  if not FileExists(ExpandConstant('{tmp}\b2p.dll')) then ExtractTemporaryFile('b2p.dll');
  if not FileExists(ExpandConstant('{tmp}\botva2.dll')) then ExtractTemporaryFile('botva2.dll');
  if not FileExists(ExpandConstant('{tmp}\CallbackCtrl.dll')) then ExtractTemporaryFile('CallbackCtrl.dll');
   if not FontExists('{#FontName}') then
    begin
        hResInfo := FindResource(HInstance, '_IS_FONT', RT_RCDATA);
        iResSize := SizeofResource(HInstance, hResInfo);
        hResAddr := LockResource(LoadResource(HInstance, hResInfo));
        pcFonts := 1;
        fh := AddFontMemResourceEx(hResAddr, iResSize, 0, pcFonts);
    end;
  ButtonFont;
end;
(*
функция InitializeLanguageDialog() вызывает процедуру Init и затем возвращает результат вызова функции LangEng.
*)
function InitializeLanguageDialog(): Boolean;
begin
  Init;
  Result := LangEng;
end;
 
Последнее редактирование:
Сверху