[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;