sawerx

Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Ни когда не занимался украшательством, вот решил попробовать, взял на вики один такой пример и простенькую игру. Но вот, с доводкой появились проблемы. Хотел оставить только окно выбора директории и хода установки, а при удалении только окно хода удаления. Выбивает ошибку сразу в первой же страничной функции 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 | рисунок на 499x361px |