"Шкурный вопрос" или об оформлении 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