Ansi и Unicode код

tihiy_don

Старожил
 

Vlad302002

Новичок
tihiy_don, работает. То что вы предложили - работает. со скинами вопрос закрываем.

Все есть в папке
1706723827170.png

я просто в @хере... Сравните две картинки пожалуйста, левая картна была скомпилирована в Ультра версии, правая в обычной. Обе версии естественно Юникод. Так вот, почему-то ИнноСетапУльтра портит существенно качество картинки... (код идентичный, если что компилировал, естественно картинки тоже). Можете помочь как исправить? Я бы сидел на Ультраверсии спокойно, но я не могу так оставить это... Спасибо
 

Leserg

Участник
Сравните две картинки пожалуйста, левая картна была скомпилирована в Ультра версии, правая в обычной. Обе версии естественно Юникод. Так вот, почему-то ИнноСетапУльтра портит существенно качество картинки... (код идентичный, если что компилировал, естественно картинки тоже). Можете помочь как исправить?
А то что версии Inno отличаются, вам ни о чем не говорит?
В версии 5.6.0 была улучшена функция растяжения изображения в связи с обновлением поддержки DPI (по ссылке, при описании изменений директивы WizardImageStretch, в примере как раз показан ваш случай). Поэтому 5.6.1 обрабатывает картинку более корректно.

А Inno Setup Ultra v5.5.1 собрана на базе китайской версии Inno от Restool, поддержка которой прекратилась в 2012 году.

К вашей картинке никто не будет приглядываться. :yes:
 

Vlad302002

Новичок
А то что версии Inno отличаются, вам ни о чем не говорит?
Говорит, я поэтому и спросил - как-нибудь можно исправить, чтобы Ультра правильно ее отображал, более корректно? мб размеры нужно увеличить, если так, то насколько?


К вашей картинке никто не будет приглядываться.
Там без приглядывания видно)
 

tihiy_don

Старожил
Последнее редактирование:

Vlad302002

Новичок
Если вам нужно вставлять картинки[/URL]
та особо не нужно, я добавил всего лишь 3 Wizard картинки (вначало и в конец + маленькую), единственное почему я использую версию Ультра - это то что в ней мой код читается, на 5.6.1 он к сожалению не пашет( то бишь часть кода не пашет, так правильнее будет сказать, ибо очень многие кодЫ брал с инета и они заточены под версию Ультра, в том то и дело... Но спасибо за то что скинули, я завтра посмотрю что там. Я просто не могу переделать рабочий код (который работает на Ультра) в тот, который будет работать на 5.6.1 (u)...
 

Vlad302002

Новичок
Ну, на самом деле, я тут полазал, у меня не компилируется на 5.6.1 только следующий код:

выдает ошибку при компиляции "unknown identifier CallbackAddr". Это код, делающий полу-прозрачный установщик при перетаскивании его. Если audiofeel сможет помочь, будет очень классно, ибо он переделал код курсора мне, и он прекрасно компилируется :)
Код:
[Code]
  const
  WM_NCLBUTTONDOWN = $00A1; // нажатие левой кнопки мыши по неклиентской области окна
  HTCAPTION = 2;            // константа определяет заголовок окна
  GWL_WNDPROC = -4;
function SetLayeredWindowAttributes(hwnd: HWND; crKey: TColor; bAlpha: BYTE; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall'; 
function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
function ReleaseCapture(): Longint; external 'ReleaseCapture@user32.dll stdcall';
var
  OldProc: Longint;  
function MyProc(h: HWND; Msg, wParam, lParam: longint): Longint;
begin
    if (Msg = WM_NCLBUTTONDOWN) and (wParam = HTCAPTION) then begin
        SetWindowLong(h, (-20), GetWindowLong(h, (-20)) or $80000);
        SetLayeredWindowAttributes(h, 0, 150, 2);  // делаем окно полупрозрачным изменяя bAlpha - у меня 150
        ReleaseCapture;
        SendMessage(WizardForm.Handle,$0112,$F012,0);
        SetWindowLong(h, (-20), GetWindowLong(h, (-20)) or $80000);
        SetLayeredWindowAttributes(h, 0, 255, 2);  // делаем окно снова непрозрачным bAlpha = 255
        Result:= 0;
        Exit;
  end;
  Result:= CallWindowProc(OldProc, h, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
    OldProc:= SetWindowLong(WizardForm.Handle, GWL_WNDPROC, CallbackAddr('MyProc')); { для стекла }
end;

procedure DeinitializeSetup();
begin
  SetWindowlong(WizardForm.Handle, GWL_WNDPROC, OldProc);
end;
 

Andreo Fadio

Старожил
@Vlad302002, вам нужно добавить себе в установщик библиотеку CallbackCtrl.dll с вызываемой функцией тогда появится аналогичный функционал, при котором нужно будет сменить только одну строчку представленного кода тогда и на 5.6.1 заработает.
 

Vlad302002

Новичок
@Vlad302002, вам нужно добавить себе в установщик библиотеку CallbackCtrl.dll с вызываемой функцией тогда появится аналогичный функционал, при котором нужно будет сменить только одну строчку представленного кода тогда и на 5.6.1 заработает.

тэкс, dll положил в папку, прописал в файлах. Скажите пожалуйста какую строчку и как нужно заменить в коде, чтобы я это сделал.

[Files]
Source: CallbackCtrl.dll; DestDir: {tmp}; Flags: ignoreversion dontcopy nocompression

UPD: замена CallbackAddr на CallbackCtrl в строчке OldProc:= SetWindowLong(WizardForm.Handle, GWL_WNDPROC, CallbackAddr('MyProc')); результата также не дало.


1706783036380.png
 
Последнее редактирование:

Andreo Fadio

Старожил
замена CallbackAddr на CallbackCtrl в строчке OldProc:
а не надо просто тупо заменой заниматься.
Ваш предоставленный код:
Код:
[Code]
  const
  WM_NCLBUTTONDOWN = $00A1; // нажатие левой кнопки мыши по неклиентской области окна
  HTCAPTION = 2;            // константа определяет заголовок окна
  GWL_WNDPROC = -4;
function SetLayeredWindowAttributes(hwnd: HWND; crKey: TColor; bAlpha: BYTE; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
function ReleaseCapture(): Longint; external 'ReleaseCapture@user32.dll stdcall';
var
  OldProc: Longint;
function MyProc(h: HWND; Msg, wParam, lParam: longint): Longint;
begin
    if (Msg = WM_NCLBUTTONDOWN) and (wParam = HTCAPTION) then begin
        SetWindowLong(h, (-20), GetWindowLong(h, (-20)) or $80000);
        SetLayeredWindowAttributes(h, 0, 150, 2);  // делаем окно полупрозрачным изменяя bAlpha - у меня 150
        ReleaseCapture;
        SendMessage(WizardForm.Handle,$0112,$F012,0);
        SetWindowLong(h, (-20), GetWindowLong(h, (-20)) or $80000);
        SetLayeredWindowAttributes(h, 0, 255, 2);  // делаем окно снова непрозрачным bAlpha = 255
        Result:= 0;
        Exit;
  end;
  Result:= CallWindowProc(OldProc, h, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
    OldProc:= SetWindowLong(WizardForm.Handle, GWL_WNDPROC, CallbackAddr('MyProc')); { для стекла }
end;

procedure DeinitializeSetup();
begin
  SetWindowlong(WizardForm.Handle, GWL_WNDPROC, OldProc);
end;
Измененный код:
Код:
[Code]
//--Действие с CallBackCtrl-----
type
  TCallbackProcI = function(h:hWnd;Msg,wParam,lParam:Longint):Longint;
//----------------------------------------------

const
  WM_NCLBUTTONDOWN = $00A1; // нажатие левой кнопки мыши по неклиентской области окна
  HTCAPTION = 2;            // константа определяет заголовок окна
  GWL_WNDPROC = -4;

//--Действие с CallBackCtrl-----
function WndProcCallBackI(Callback:TCallbackProcI;ParamCount:Integer):LongWord; external 'wrapcallbackaddr@files:CallBackCtrl.dll stdcall';
//----------------------------------------------
function SetLayeredWindowAttributes(hwnd: HWND; crKey: TColor; bAlpha: BYTE; dwFlags: DWORD): Boolean; external 'SetLayeredWindowAttributes@user32.dll stdcall';
function CallWindowProc(lpPrevWndFunc: Longint; hWnd: HWND; Msg: UINT; wParam, lParam: Longint): Longint; external 'CallWindowProcA@user32.dll stdcall';
function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
function ReleaseCapture(): Longint; external 'ReleaseCapture@user32.dll stdcall';

var
  OldProc: Longint;

function MyProc(h: HWND; Msg, wParam, lParam: longint): Longint;
begin
    if (Msg = WM_NCLBUTTONDOWN) and (wParam = HTCAPTION) then begin
        SetWindowLong(h, (-20), GetWindowLong(h, (-20)) or $80000);
        SetLayeredWindowAttributes(h, 0, 150, 2);  // делаем окно полупрозрачным изменяя bAlpha - у меня 150
        ReleaseCapture;
        SendMessage(WizardForm.Handle,$0112,$F012,0);
        SetWindowLong(h, (-20), GetWindowLong(h, (-20)) or $80000);
        SetLayeredWindowAttributes(h, 0, 255, 2);  // делаем окно снова непрозрачным bAlpha = 255
        Result:= 0;
        Exit;
  end;
  Result:= CallWindowProc(OldProc, h, Msg, wParam, lParam);
end;

procedure InitializeWizard();
begin
    OldProc:= SetWindowLong(WizardForm.Handle, GWL_WNDPROC, WndProcCallBackI(@MyProc,4)); { для стекла }
end;

procedure DeinitializeSetup();
begin
  SetWindowlong(WizardForm.Handle, GWL_WNDPROC, OldProc);
end;
 

Vlad302002

Новичок
Спасибо большое, протестировал - работает всё. Я иногда (очень редко), если вас не затруднит, буду к вам обращаться с просьбой помочь адаптировать код под 5.6.1, если не будет компилироваться.
По поводу флага ignoreversion - а что это вообще такое и за что он отвечает? Просто при многих просмотрах видео и исходниках этот флаг стоял, и я за основу взял его и всё) да, я его удалю естественно после ваших слов, просто было б интересно узнать что это вообще за флаг такой и с чего его едят :)
 

Vlad302002

Новичок
для таких вопросов есть Справка, если не понимаете английский на форуме есть русифицированная версия.
Andreo Fadio, если Вас не составит труда, могли бы Вы этот код (работает только на Ansi версии) переделать под 5.6.1 (u).
код логотипа, при нажатии на который перекидывает на ссылку
[Files]
Source: "logo.bmp"; DestDir: "{tmp}"; Flags: dontcopy

Код:
procedure LogoOnClick(Sender: TObject); 
var ResCode: Integer; 
begin 
  ShellExec('', 'https://discord.com/invite/GUJXYhFjyu', '' , '', SW_SHOW, ewNoWait, ResCode) 
end; 
 
procedure Logo(); 
var 
  BtnPanel: TPanel; 
  BtnImage: TBitmapImage; 
begin 
  ExtractTemporaryFile('logo.bmp') 
     
  BtnPanel:=TPanel.Create(WizardForm) 
  with BtnPanel do begin 
    Left:=20 
    Top:=325 
    Width:=132 
    Height:=27 
    Cursor:=crHand 
    OnClick:=@logoOnClick 
    Parent:=WizardForm 
  end 
  BtnImage:=TBitmapImage.Create(WizardForm) 
  with BtnImage do begin 
    AutoSize:=True; 
    Enabled:=False; 
    Bitmap.LoadFromFile(ExpandConstant('{tmp}')+'\logo.bmp') 
    Parent:=BtnPanel 
  end 
end;

procedure InitializeWizard();
begin
    Logo();
end;[/SPOILER]
 
Сверху