Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  

Показать сообщение отдельно
MKN MKN вне форума

Ветеран


Сообщения: 2355
Благодарности: 557

Профиль | Отправить PM | Цитировать


"Шкурный вопрос" или об оформлении NSIS инсталлятора с помощью Skin_ов

Когда пользователи хотят оформить-украсить аскетичный NSIS инсталлятор, то первым делом вспоминают NSIS SkinCrafter Plugin.
( http://skincrafter.com/products/nsis-skincrafter-plugin )
Вроде бы простой код использования, много дополнительных файлов-скинов (*.skf) в галерее ( http://skincrafter.com/gallery )
Но... Невменяемый размер плагина (6,5 метров !) и ощутимая глазом задержка при перерисовке "ошкуренных" страниц
сразу заставляют задуматься, а нужно ли такое чудо ? (K.A.V. когда то модернизировал SkinCrafter.dll , но она у меня вообще не хочет работать... Родная работает... )

Приходится искать альтернативу. И она конечно есть.

Например, программа ISSkinEx 3.0.0.2 for InnoSetup and NSIS ( http://restools.hanzify.org/ ).
Скины можно изготовить самому и загружать их ( это файлы *.cjstyles ) с помощью ISSkinEx.dll (ISSkinExU.dll)
Самостоятельное изготовление - дело хлопотное, ( хотя можно ограничиться использованием имеющихся в комплекте нескольких стилей-заготовок ) . Общий размер скина с DLL, при этом получается около 1M, что уже преемлемо...

У китайских товарищей большой популярностью пользуется NSIS SkinSharp библиотека ( SkinH.dll ), к которой в сети имеется много пакетов с разнообразными стилями оформления ( файлами *.she ) Размер вмеcте с DLL ~100K . Код подключения :
Код: Выделить весь код
!include "MUI2.nsh"  
  
!define MUI_CUSTOMFUNCTION_GUIINIT onGUIInit   
!insertmacro MUI_PAGE_WELCOME   
!insertmacro MUI_PAGE_DIRECTORY   
!insertmacro MUI_PAGE_INSTFILES   
!insertmacro MUI_PAGE_FINISH   
!insertmacro MUI_LANGUAGE "English"  
  
Name "SkinH"  
OutFile "SkinH.exe"  
InstallDir "$TEMP"  
   
Function onGUIInit   
  InitPluginsDir   
  SetOutPath $PLUGINSDIR   
  File "SkinH.dll"   
  File "skinh.she"   
  System::Call SkinH::SkinH_Attach()   
  System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.r0   
  IntOp $0 $0 + 0x0002CA98   
  System::Call Kernel32::GetCurrentProcess()i.s   
  System::Call Kernel32::VirtualProtectEx(is,ir0,i4,i0x40,*i)   
  System::Call "*$0(&i1 0)"  
FunctionEnd   
  
Function .onGUIEnd   
  System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.s   
  System::Call Kernel32::FreeLibrary(is)   
  System::Call Kernel32::SetCurrentDirectory(t"$EXEDIR\")   
FunctionEnd  

Section   
SectionEnd
Файл стиля должен называться - skinh.she ! Т.е. , т.к. названия файлов-стилей, разннобразные, то их надо переименовывать.

Вот вариант кода с прозрачной страницей и возможностью поместить на странице фоновый рисунок :

читать дальше »
Код: Выделить весь код
!define iTransparentPercent 80  
Var dlg
Var Label1
Var iTransparent
Var bTransparent
Var Bitmap
Var BitmapHandle

!include "MUI2.nsh"  
!include "WinMessages.nsh"
!include "LogicLib.nsh"
!define MUI_CUSTOMFUNCTION_GUIINIT myGuiInit
page custom MyPage
!insertmacro MUI_PAGE_INSTFILES   
!insertmacro MUI_LANGUAGE "English"  
OutFile "transparent.exe"

Function .onInit
  InitPluginsDir
  File /oname=$PLUGINSDIR\Pict.bmp "Pict.bmp"
  IntOp $iTransparent ${iTransparentPercent} * 255
  IntOp $iTransparent $iTransparent / 100
  StrCpy $bTransparent 0
FunctionEnd

Function myGuiInit
InitPluginsDir
  SetOutPath $PLUGINSDIR
  File SkinH.dll
  File skinh.she
  System::Call SkinH::SkinH_Attach()

  System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.r0
  IntOp $0 $0 + 0x0002CA98
  System::Call Kernel32::GetCurrentProcess()i.s
  System::Call Kernel32::VirtualProtectEx(is,ir0,i4,i0x40,*i)
  System::Call "*$0(&i1 0)"
 FunctionEnd

Function MyPage
  Call SetWindowAttrib
  ${If} $bTransparent == 0
  ${For} $R0 0 $iTransparent
  system::call 'user32::SetLayeredWindowAttributes(i $HWNDPARENT, i 0, i R0, i 2) .iR1'
  ${Next}
  ${Endif}

  nsDialogs::Create 1044
  Pop $dlg
  
    ${NSD_CreateLabel} 140u 10u 180u 20u " Transparent Window" 
    Pop $Label1
    FindWindow $0 "#32770" "" $HWNDPARENT
    GetDlgItem $0 $0 1200
    CreateFont $2 "tahoma" "18" "660"
    SendMessage $0 ${WM_SETFONT} $2 0

   ${NSD_CreateBitmap} 0 0 100% 100% ""
    Pop $Bitmap
    StrCpy $0 $PLUGINSDIR\Pict.bmp
    System::Call 'user32::LoadImage(i 0, t r0, i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_LOADFROMFILE}) i.s'
    Pop $BitmapHandle
    SendMessage $Bitmap ${STM_SETIMAGE} ${IMAGE_BITMAP} $BitmapHandle
	
    nsDialogs::Show
FunctionEnd
 
 Function .onGUIEnd
  System::Call Kernel32::GetModuleHandle(t"SkinH.dll")i.s
  System::Call Kernel32::FreeLibrary(is)
  System::Call Kernel32::SetCurrentDirectory(t"$EXEDIR\")
FunctionEnd

Function SetWindowAttrib
${if} $bTransparent == 0
system::call 'user32::GetWindowLong(i $HWNDPARENT, i ${GWL_EXSTYLE}) .iR0'
IntOp $R0 $R0 + 0x80000}
system::call 'user32::SetWindowLong(i $HWNDPARENT, i ${GWL_EXSTYLE}, i R0) .iR1'
system::call 'user32::SetLayeredWindowAttributes(i $HWNDPARENT, i 0, i 0, i 2) .iR2'
Pop $R2
Pop $R1
Pop $R0
${endif}
FunctionEnd

Section
SectionEnd

Последний раз редактировалось MKN, 27-08-2015 в 15:52.

Это сообщение посчитали полезным следующие участники:

Отправлено: 17:28, 17-09-2013 | #536