Автор: sawerx
Дата сообщения: 11.12.2010 01:14
Ни когда не занимался украшательством, вот решил попробовать, взял на вики один такой пример и простенькую игру.
Но вот, с доводкой появились проблемы.
Хотел оставить только окно выбора директории и хода установки, а при удалении только окно хода удаления. Выбивает ошибку сразу в первой же страничной функции FindWindow.
И при удалении одна область не заполняется цветом.
Код:
;Определения пользователя!
!define VERSION 1.0.5 # Версия ${VERSION}
!define APP_NAME "Beat Hazard" # Имя программы ${APP_NAME}
!define PUBLISHER "Cold Beam Games" # Имя компании ${PUBLISHER}
!define REG_UNINSTALL "Software\Microsoft\Windows\CurrentVersion\Uninstall\Beat Hazard" # ${REG_UNINSTALL}
!define /date FIXTIME "%d-%m-%Y_%H:%M:%S" # формат (13-07-2007_21:49:00) ${FIXTIME}
; ---- Подпись файла инсталлятора ---!
VIProductVersion "1.0.5.0" # версия только в формате X.X.X.X
VIAddVersionKey "FileVersion" "${VERSION}" # полная версия!
VIAddVersionKey "ProductName" "Beat Hazard" # имя продукта!
VIAddVersionKey "CompanyName" "Cold Beam Games" # имя компании!
VIAddVersionKey "LegalTrademarks" "Cold Beam Games" # юридическая торговая марка!
VIAddVersionKey "LegalCopyright" "CopyRights © 2008 Cold Beam Games" # юридический копирайт!
VIAddVersionKey "FileDescription" "The Games Beat Hazard" # краткое описание!
; ---- Конец подписи файла инсталлятора ---!
SetCompressor /FINAL /SOLID lzma # вид компресии!
XPStyle on # стиль WinXP включён
SetOverwrite try
ShowInstDetails show
ShowUninstDetails show
AutoCloseWindow true
!include MUI.nsh
!include WinMessages.nsh
!define HAVE_UPX
!ifdef HAVE_UPX
!packhdr temp.dat '"${NSISDIR}\UPX\upx.exe" -9 -q temp.dat'
!endif
Name "Beat Hazard"
OutFile "Beat.Hazard_${VERSION}.exe"
InstallDir "C:\Games\Beat Hazard"
InstallDirRegKey HKLM "${REG_UNINSTALL}" "InstallLocation"
RequestExecutionLevel user
DirText "$\r" # псевдо затирание!
!define BITMAP_FILE "Res\fores.bmp" # фоновое!
!define MUI_ICON "Res\BeatHazard.ico"
!define MUI_UNICON "Res\BeatHazard.ico"
!define MUI_WELCOMEFINISHPAGE_BITMAP "Res\for.bmp" # боковое!
!define MUI_LICENSEPAGE_BGCOLOR 455545
!define MUI_DIRECTORYPAGE_BGCOLOR 455545
!define MUI_INSTFILESPAGE_COLORS "FFFFFF 455545"
;!define MUI_INSTFILESPAGE_PROGRESSBAR {"00FF00 455545"|colored|smooth}
!define MUI_CUSTOMFUNCTION_GUIINIT myGUIInit
!define LR_LOADFROMFILE 0x0010
!define LR_CREATEDIBSECTION 0x2000
!define IMAGE_BITMAP 0
!define SS_BITMAP 0x0000000E
!define WS_CHILD 0x40000000
!define WS_VISIBLE 0x10000000
!define HWND_TOP 0
!define SWP_NOSIZE 0x0001
!define SWP_NOMOVE 0x0002
!define IDC_BITMAP 1500
!define stRECT "(i, i, i, i) i"
Var HBitmap
; !define MUI_UI_HEADERIMAGE ".\modern_headed.exe"
!define MUI_INNERTEXT_LICENSE_TOP "$\r" # затирание!
!define MUI_INNERTEXT_LICENSE_BOTTOM "$\r" # затирание!
!define MUI_PAGE_CUSTOMFUNCTION_SHOW LicensePageShow
!insertmacro MUI_PAGE_LICENSE "Res\License.txt"
!define MUI_TEXT_DIRECTORY_TITLE "Компания Cold Beam Games представляет вам игру Опасность Удара"
!define MUI_TEXT_DIRECTORY_SUBTITLE "Пожалуйста выберите папку для установки аркадной игры $(^NameDA)."
!define MUI_PAGE_CUSTOMFUNCTION_SHOW DirectoryPageShow
!insertmacro MUI_PAGE_DIRECTORY
!define MUI_PAGE_CUSTOMFUNCTION_SHOW InstFilesPageShow
!insertmacro MUI_PAGE_INSTFILES
!define MUI_PAGE_CUSTOMFUNCTION_SHOW FinishPageShow
!insertmacro MUI_PAGE_FINISH
!define MUI_CUSTOMFUNCTION_UNGUIINIT un.myGuiInit
!define MUI_UNPAGE_CUSTOMFUNCTION_SHOW insFilesPageShow
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE Russian
;Уничтожить окно!
!macro DestroyWindow HWND IDC
GetDlgItem $R0 ${HWND} ${IDC}
System::Call `user32::DestroyWindow(i R0)`
!macroend
;Придать окну прозрачный фон!
!macro SetTransparent HWND IDC
GetDlgItem $R0 ${HWND} ${IDC}
SetCtlColors $R0 0xFFFFFF transparent
!macroend
;Обновление окна!
!macro RefreshWindow HWND IDC
GetDlgItem $R0 ${HWND} ${IDC}
ShowWindow $R0 ${SW_HIDE}
ShowWindow $R0 ${SW_SHOW}
!macroend
Function myGUIInit
;Извлечение BMP изображения!
InitPluginsDir
ReserveFile "${BITMAP_FILE}"
File "/ONAME=$PLUGINSDIR\bg.bmp" "${BITMAP_FILE}"
; Получить размер окна!
System::Call `*${stRECT} .R0`
System::Call `user32::GetClientRect(i $HWNDPARENT, i R0)`
System::Call `*$R0${stRECT} (, , .R1, .R2)`
System::Free $R0
;Создать контроль над BMP изображением!
System::Call `kernel32::GetModuleHandle(i 0) i.R3`
System::Call `user32::CreateWindowEx(i 0, t "STATIC", t "", i ${SS_BITMAP}|${WS_CHILD}|${WS_VISIBLE}, i 0, i 0, i R1, i R2, i $HWNDPARENT, i ${IDC_BITMAP}, i R3, i 0) i.R1`
System::Call `user32::SetWindowPos(i R1, i ${HWND_TOP}, i 0, i 0, i 0, i 0, i ${SWP_NOSIZE}|${SWP_NOMOVE})`
;Установка BMP изображения!
System::Call `user32::LoadImage(i 0, t "$PLUGINSDIR\bg.bmp", i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s`
Pop $HBitmap
SendMessage $R1 ${STM_SETIMAGE} ${IMAGE_BITMAP} $HBitmap
;Устанавить прозрачный фон!
!insertmacro SetTransparent $HWNDPARENT 3
!insertmacro SetTransparent $HWNDPARENT 1
!insertmacro SetTransparent $HWNDPARENT 2
!insertmacro SetTransparent $HWNDPARENT 1034
!insertmacro SetTransparent $HWNDPARENT 1035
!insertmacro SetTransparent $HWNDPARENT 1036
!insertmacro SetTransparent $HWNDPARENT 1037
!insertmacro SetTransparent $HWNDPARENT 1038
!insertmacro SetTransparent $HWNDPARENT 1039
!insertmacro SetTransparent $HWNDPARENT 1040
!insertmacro SetTransparent $HWNDPARENT 1044
;Удаление нежелательных областей контроля!
!insertmacro DestroyWindow $HWNDPARENT 1256
!insertmacro DestroyWindow $HWNDPARENT 1000
!insertmacro DestroyWindow $HWNDPARENT 1028
!insertmacro DestroyWindow $HWNDPARENT 1029
!insertmacro DestroyWindow $HWNDPARENT 1035
!insertmacro DestroyWindow $HWNDPARENT 1036
!insertmacro DestroyWindow $HWNDPARENT 1039
!insertmacro DestroyWindow $HWNDPARENT 1040
FunctionEnd
;Обновить родительские контрольные окона, если у них есть прозрачный фон!
Function RefreshParentControls
!insertmacro RefreshWindow $HWNDPARENT 1037
!insertmacro RefreshWindow $HWNDPARENT 1038
FunctionEnd
;Для страницы лицензии!
Function LicensePageShow
;Устанавить прозрачный фон!
FindWindow $MUI_HWND "#32770" "" $HWNDPARENT
SetCtlColors $MUI_HWND 0xFFFFFF transparent
!insertmacro SetTransparent $MUI_HWND 1040
!insertmacro SetTransparent $MUI_HWND 1000
!insertmacro SetTransparent $MUI_HWND 1006
!insertmacro SetTransparent $MUI_HWND 1034
Call RefreshParentControls ;Обновление управления!
FunctionEnd
;Для страницы деректории!
Function DirectoryPageShow
;Устанавить прозрачный фон.
FindWindow $MUI_HWND "#32770" "" $HWNDPARENT
SetCtlColors $MUI_HWND 0xFFFFFF transparent
!insertmacro SetTransparent $MUI_HWND 1001
!insertmacro SetTransparent $MUI_HWND 1024
!insertmacro SetTransparent $MUI_HWND 1008
!insertmacro SetTransparent $MUI_HWND 1023
!insertmacro SetTransparent $MUI_HWND 1006
!insertmacro SetTransparent $MUI_HWND 1020
SendMessage $R0 ${WM_SETTEXT} 0 STR: # папка установки"
Call RefreshParentControls ;Обновление управления!
FunctionEnd
;Для страницы хода выполнения!
Function InstFilesPageShow
;Устанавить прозрачный фон!
FindWindow $MUI_HWND "#32770" "" $HWNDPARENT
SetCtlColors $MUI_HWND 0xFFFFFF transparent
!insertmacro SetTransparent $MUI_HWND 1027
!insertmacro SetTransparent $MUI_HWND 1000
!insertmacro SetTransparent $MUI_HWND 1004
!insertmacro SetTransparent $MUI_HWND 1006
!insertmacro SetTransparent $MUI_HWND 1016
!insertmacro SetTransparent $MUI_HWND 1029
Call RefreshParentControls ;Обновление управления!
FunctionEnd
;Для конечной страницы!
Function FinishPageShow
;Устанавить прозрачный фон!
SetCtlColors $MUI_HWND 0xFFFFFF transparent
!insertmacro SetTransparent $MUI_HWND 1200
!insertmacro SetTransparent $MUI_HWND 1201
!insertmacro SetTransparent $MUI_HWND 1202
!insertmacro SetTransparent $MUI_HWND 1203
!insertmacro SetTransparent $MUI_HWND 1204
!insertmacro SetTransparent $MUI_HWND 1205
!insertmacro SetTransparent $MUI_HWND 1206
FunctionEnd
Section
SetOutPath $INSTDIR
SetDateSave off
File "Beat Hazard\BeatHazard.exe"
File "Beat Hazard\Content.res"
File "Beat Hazard\*.dll"
;Установка изображения для папки!
WriteINIStr "$INSTDIR\Desktop.ini" ".ShellClassInfo" "IconFile" "$INSTDIR\BeatHazard.exe" # имя файла с иконкой!
WriteINIStr "$INSTDIR\Desktop.ini" ".ShellClassInfo" "IconIndex" 0 # номер индекса иконки!
SetFileAttributes "$INSTDIR\Desktop.ini" ARCHIVE|HIDDEN|SYSTEM # присвоить атрибут файлу!
SetFileAttributes "$INSTDIR" ARCHIVE|SYSTEM # присвоить атрибут папке!
;Запись удоляемых строк!
WriteRegStr HKLM "${REG_UNINSTALL}" "InstallLocation" $INSTDIR # путь установки!
WriteRegStr HKLM "${REG_UNINSTALL}" "InstallDate" "${FIXTIME}" # время создания установки!
WriteRegStr HKLM "${REG_UNINSTALL}" "DisplayIcon" "$INSTDIR\BeatHazard.exe"
WriteRegStr HKLM "${REG_UNINSTALL}" "DisplayName" "$(^Name)"
WriteRegStr HKLM "${REG_UNINSTALL}" "DisplayVersion" "${VERSION}"
WriteRegStr HKLM "${REG_UNINSTALL}" "Publisher" "${PUBLISHER}"
WriteRegStr HKLM "${REG_UNINSTALL}" "Comments" "Космическое аркадное сражение"
WriteRegDWORD HKLM "${REG_UNINSTALL}" "NoModify" 1 # без изменения!
WriteRegDWORD HKLM "${REG_UNINSTALL}" "NoRepair" 1 # без изменения!
WriteRegStr HKLM "${REG_UNINSTALL}" "UninstallString" '"$INSTDIR\UinstallGame.exe"'
WriteUninstaller "$INSTDIR\UinstallGame.exe" # создание деинстолятора!
Sleep 400
CreateShortCut "$DESKTOP\$(^Name).lnk" "$INSTDIR\BeatHazard.exe" "" "$INSTDIR\BeatHazard.exe" 0 "" "" "Космическое аркадное сражение"
Sleep 400
Sleep 400
SectionEnd
Function .onGUIEnd # уничтожить BMP изображение!
System::Call `gdi32::DeleteObject(i s)` $HBitmap
FunctionEnd
Function un.myGUIInit
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Вы желаете удалить $(^Name) и все компоненты?" IDYES +2
Abort # это сообщение заменяет окно подготовки удаления!
;Извлечение BMP изображения!
InitPluginsDir
ReserveFile `${BITMAP_FILE}`
File `/ONAME=$PLUGINSDIR\bg.bmp` `${BITMAP_FILE}`
; Получить размер окна!
System::Call `*${stRECT} .R0`
System::Call `user32::GetClientRect(i $HWNDPARENT, i R0)`
System::Call `*$R0${stRECT} (, , .R1, .R2)`
System::Free $R0
;Создать контроль над BMP изображением!
System::Call `kernel32::GetModuleHandle(i 0) i.R3`
System::Call `user32::CreateWindowEx(i 0, t "STATIC", t "", i ${SS_BITMAP}|${WS_CHILD}|${WS_VISIBLE}, i 0, i 0, i R1, i R2, i $HWNDPARENT, i ${IDC_BITMAP}, i R3, i 0) i.R1`
System::Call `user32::SetWindowPos(i R1, i ${HWND_TOP}, i 0, i 0, i 0, i 0, i ${SWP_NOSIZE}|${SWP_NOMOVE})`
;Установка BMP изображения!
System::Call `user32::LoadImage(i 0, t "$PLUGINSDIR\bg.bmp", i ${IMAGE_BITMAP}, i 0, i 0, i ${LR_CREATEDIBSECTION}|${LR_LOADFROMFILE}) i.s`
Pop $HBitmap
SendMessage $R1 ${STM_SETIMAGE} ${IMAGE_BITMAP} $HBitmap
;Устанавить прозрачный фон!
!insertmacro SetTransparent $HWNDPARENT 3
!insertmacro SetTransparent $HWNDPARENT 1
!insertmacro SetTransparent $HWNDPARENT 2
!insertmacro SetTransparent $HWNDPARENT 1006
!insertmacro SetTransparent $HWNDPARENT 1018
!insertmacro SetTransparent $HWNDPARENT 1034
!insertmacro SetTransparent $HWNDPARENT 1035
!insertmacro SetTransparent $HWNDPARENT 1036
!insertmacro SetTransparent $HWNDPARENT 1037
!insertmacro SetTransparent $HWNDPARENT 1038
!insertmacro SetTransparent $HWNDPARENT 1039
!insertmacro SetTransparent $HWNDPARENT 1044
;Удаление нежелательных областей управления!
!insertmacro DestroyWindow $HWNDPARENT 1256
!insertmacro DestroyWindow $HWNDPARENT 1000
!insertmacro DestroyWindow $HWNDPARENT 1006
!insertmacro DestroyWindow $HWNDPARENT 1028
!insertmacro DestroyWindow $HWNDPARENT 1029
!insertmacro DestroyWindow $HWNDPARENT 1035
!insertmacro DestroyWindow $HWNDPARENT 1036
!insertmacro DestroyWindow $HWNDPARENT 1038
!insertmacro DestroyWindow $HWNDPARENT 1039
!insertmacro RefreshWindow $HWNDPARENT 1018
!insertmacro RefreshWindow $HWNDPARENT 1037
!insertmacro RefreshWindow $HWNDPARENT 1038
FunctionEnd
Section Uninstall # секция удаления!
DeleteRegKey HKLM "${REG_UNINSTALL}"
Delete "$INSTDIR\UinstallGame.exe"
Delete "$INSTDIR\BeatHazard.exe"
Delete "$INSTDIR\Content.res"
Delete "$INSTDIR\*.dll"
RMDir /r "$INSTDIR"
SetShellVarContext Current # для текущего пользователя!
Delete "$DESKTOP\$(^Name).lnk"
RMDir /r "$APPDATA\Beat Hazard"
SectionEnd
Function un.onGUIEnd # уничтожить BMP изображение!
System::Call `gdi32::DeleteObject(i s)` $HBitmap
FunctionEnd