Войти

Показать полную графическую версию : События OnMouseOver / OnMouseClick + вопрос во созданию установщика


0xDEADBEEF
06-08-2009, 22:26
Здравствуйте.
Решил сделать инсталлер для игрушки, есть несколько вопросов:
1. Не могу понять как отловить события onMouseOver и onMouseClick - хочу сделать смену картинок при наведении/отведении мыши и при клике. В справке не нашел.
2. Создаю бэкграунд инсталлера:
$Pic1 = GUICtrlCreatePic("С:\installer\files\installer_background.jpg", 0, 0, 640, 480)
Затем, добавляю кнопку "Установить" (картинка):
$Pic2 = GUICtrlCreatePic("G:\installer\files\install_button.jpg", 144, 168, 358, 59)
Затем, отлов нажатий на кнопку и кнопку выхода:
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit

Case $Pic2
Run("install.exe")
EndSwitch
WEndПроблема в том, что с картинкой бэкграунда событие почему-то не происходит - кликаю, кликаю, результата нет. Убираю бэкграунд, Case отрабатывает. Как эту неприятность можно обойти?

3. Не хватает идей для создания формы установщика. Точнее, как её отобразить - ну как в обычных инсталляторах - "Выберите путь" -> "Далее" -> (уже новая страница) "Создавать ярлыки" и т.п. Можете направить в правильную сторону?

4. AutoIt умеет работать с архивами (интересует распаковка)?

Буду рад, если поможете советами хотя бы на один вопрос :)

FlatX007
07-08-2009, 01:06
4.

#include <Process.au3>

$NameArx = "Data.rar" ; Aрхив
$NameOut = @ProgramsDir & "\" ; Путь для распаковки

FileInstall("Rar.exe", @TempDir & "\Rar.exe", 1) ; Файл Rar.exe в должен быть в паке со скриптом (украдёш из WinRar`a)
$RunDos = _RunDOS(@TempDir & '\' & 'Rar.exe x -Y ' & @ScriptDir & "\" & StringLeft($NameArx, StringLen($NameArx) - 4) & ' *.* ' & $NameOut)

If $RunDos > 0 Then
MsgBox(16, "Сообщение WinRar", "Распаковка архива" & $NameArx & @CRLF & _ReturnErrorWinRar($RunDos))
Exit
EndIf

Func _ReturnErrorWinRar($Error = "x") ; Функция для возврата кодов ошибок.

Switch $Error
Case 0
Return "Операция успешно завершена."
Case 1
Return "Предупреждение. Произошли некритические ошибки."
Case 2
Return "Произошла критическая ошибка."
Case 3
Return "При распаковке обнаружена ошибка CRC."
Case 4
Return "Предпринята попытка изменить заблокированный архив."
Case 5
Return "Произошла ошибка записи на диск."
Case 6
Return "Произошла ошибка открытия файла."
Case 7
Return "Ошибка при указании параметра в командной строке."
Case 8
Return "Недостаточно памяти для выполнения операции."
Case 9
Return "Ошибка при создании файла."
Case 255
Return "Операция была прервана пользователем."
EndSwitch

EndFunc ;==>_ReturnErrorWinRar

Medic84
07-08-2009, 08:18
Вот тебе в помощь Wizard написанный Creator'ом (Извини раскрашенный не вмещается)

#include <GuiConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>
#include <EditConstants.au3>

; Устанавливаем иконки
;Используются системные
;FileInstall("Resources\Ok.ico", "Ok.ico")
;FileInstall("Resources\NotOk.ico", "NotOk.ico")

;Рисуем главное окно
$Main_GUI = GUICreate("Мастер создания настроек", 500, 360, (@DesktopWidth - 500) / 2, (@DesktopHeight - 300) / 2)
_GUICtrlCreateSeperator(0, 2, 320, 3, 496)
; Рисуем кнопки
$Back_Button = GUICtrlCreateButton("< Назад", 240, 327, 80)
GUICtrlSetState(-1, $GUI_DISABLE)
$Next_Button = GUICtrlCreateButton("Далее >", 320, 327, 80)
$Exit_Button = GUICtrlCreateButton("Выход", 410, 327, 80)

;Рисуем первый диалог мастера
$ChildGui_1 = GUICreate("", 493, 300, 1, 1, $WS_POPUP)
DllCall("user32.dll", "int", "SetParent", "hwnd", $ChildGui_1, "hwnd", $Main_GUI) ; помещаем диалог в главное окно
$Label1_1_1 = GUICtrlCreateLabel("Этот мастер создания настроек последовательно проведет Вас через все шаги создания нового Интернет-чемпионата по деловой игре ""Никсдорф-Дельта"".", 30, 50, 450, 34)
$Label1_1_2 = GUICtrlCreateLabel("Вы всегда можете вызвать справку в любом диалоге, нажав F1", 30, 84, 450, 17)

;Рисуем второй диалог мастера
$ChildGui_2 = GUICreate("", 493, 300, 1, 1, $WS_POPUP)
DllCall("user32.dll", "int", "SetParent", "hwnd", $ChildGui_2, "hwnd", $Main_GUI) ; помещаем диалог в главное окно
$Label2_1_1 = GUICtrlCreateLabel("Шаг 1/10: Общие настройки", 24, 8, 147, 17)
$Group2_2_1 = GUICtrlCreateGroup("Приветствие", 32, 32, 455, 41)
$Checkbox2_2_1 = GUICtrlCreateCheckbox("Выводить приветствие AutoSend&&Get при запуске", 48, 48, 273, 17, $WS_TABSTOP)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group2_3_1 = GUICtrlCreateGroup("Название чемпионата", 32, 80, 455, 41)
$Label2_3_1 = GUICtrlCreateLabel("Введите название чемпионата:", 48, 100, 163, 17)
$Input2_3_1 = GUICtrlCreateInput("Грейт-4", 210, 96, 113, 21, $WS_TABSTOP)
$Icon_2_3_1 = GUICtrlCreateIcon("inetcpl.cpl", -23, 435, 98, 15, 15)
$Icon_2_3_2 = GUICtrlCreateIcon("inetcpl.cpl", -22, 450, 90, 25, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group2_4_1 = GUICtrlCreateGroup("E-mail", 32, 128, 455, 68)
$Label2_4_1 = GUICtrlCreateLabel("Введите адрес основного ящика, через который Вы будете общаться с участниками. Внимание! Именно ящик для живого общения, а не для рассылки архивов.", 48, 140, 436, 27)
$Input2_4_1 = GUICtrlCreateInput("delta-greit@yandex.ru", 280, 170, 150, 21, $WS_TABSTOP)
$Icon_2_4_1 = GUICtrlCreateIcon("inetcpl.cpl", -23, 435, 173, 15, 15)
$Icon_2_4_2 = GUICtrlCreateIcon("inetcpl.cpl", -22, 450, 165, 25, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group2_5_1 = GUICtrlCreateGroup("Форум", 32, 200, 455, 53)
$Label2_5_1 = GUICtrlCreateLabel("Введите номер топика Вашего турнира на форуме:", 48, 215, 260, 17)
$Label2_5_2 = GUICtrlCreateLabel("http://deltaon.ucoz.ru/forum/2-", 49, 230, 149, 17)
$Input2_5_1 = GUICtrlCreateInput("20", 200, 227, 25, 21, $WS_TABSTOP)
$Icon_2_5_1 = GUICtrlCreateIcon("inetcpl.cpl", -23, 435, 228, 15, 15)
$Icon_2_5_2 = GUICtrlCreateIcon("inetcpl.cpl", -22, 450, 220, 25, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)
$Group2_6_1 = GUICtrlCreateGroup("Периоды", 32, 257, 455, 41)
$Label2_6_1 = GUICtrlCreateLabel("Введите количество периодов (от 1 до 20):", 48, 275, 220, 17)
$InputGui_2_6_1 = GUICtrlCreateInput("12", 265, 273, 34, 17)
$UpDownGui_2_6_1 = GUICtrlCreateUpdown($InputGui_2_6_1)
GUICtrlSetLimit(-1, 20, 1)
$Icon_2_6_1 = GUICtrlCreateIcon("inetcpl.cpl", -23, 435, 275, 15, 15)
$Icon_2_6_2 = GUICtrlCreateIcon("inetcpl.cpl", -22, 450, 267, 25, 25)
GUICtrlCreateGroup("", -99, -99, 1, 1)

;Рисуем третий диалог мастера
$ChildGui_3 = GUICreate("", 493, 300, 1, 1, $WS_POPUP)
DllCall("user32.dll", "int", "SetParent", "hwnd", $ChildGui_3, "hwnd", $Main_GUI) ; помещаем диалог в главное окно
$Label3_1_1 = GUICtrlCreateLabel("Шаг 2/10: Настройка исходящих писем", 24, 8, 200, 17)

$Group3_2_1 = GUICtrlCreateGroup("Создание текстов писем", 32, 32, 455, 120)
$Checkbox3_2_1 = GUICtrlCreateCheckbox("Использовать шаблоны", 48, 50, 140, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$Button3_2_1 = GUICtrlCreateButton("Пример", 320, 48, 60, 20)
$Checkbox3_2_2 = GUICtrlCreateCheckbox("Использовать обычный шаблон", 62, 75, 180, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$Button3_2_2 = GUICtrlCreateButton("Указать", 320, 73, 60, 20)
;GUICtrlSetState (-1, $GUI_DISABLE)
$Button3_2_5 = GUICtrlCreateButton("Редактировать", 390, 73, 90, 20)
$Checkbox3_2_3 = GUICtrlCreateCheckbox("Использовать шаблон выходного дня", 62, 100, 210, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$Button3_2_3 = GUICtrlCreateButton("Указать", 320, 98, 60, 20)
$Button3_2_6 = GUICtrlCreateButton("Редактировать", 390, 98, 90, 20)
$Checkbox3_2_4 = GUICtrlCreateCheckbox("Использовать шаблон последнего периода", 62, 125, 240, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$Button3_2_4 = GUICtrlCreateButton("Указать", 320, 123, 60, 20)
$Button3_2_7 = GUICtrlCreateButton("Редактировать", 390, 123, 90, 20)
GUICtrlCreateGroup("", -99, -99, 1, 1)

$Group3_3_1 = GUICtrlCreateGroup("Тексты писем и архивы", 32, 217, 455, 78)
$Checkbox3_3_1 = GUICtrlCreateCheckbox("Сохранять отправленные", 48, 233, 145, 17)
GUICtrlSetState(-1, $GUI_CHECKED)
$Button3_3_1 = GUICtrlCreateButton("Выбрать папку", 200, 230, 85, 25, 0)
$Label3_3_1 = GUICtrlCreateLabel("Текущая папка: ", 48, 250, 90, 17)
If Not IsDeclared("save_path") Then $save_path = @ScriptDir & "\to_send"
$Label3_3_2 = GUICtrlCreateLabel($save_path, 48, 265, 435, 25)
GUICtrlSetColor(-1, 0x335EA8)
GUICtrlCreateGroup("", -99, -99, 1, 1)

_CheckInputsProc()

GUIRegisterMsg($WM_COMMAND, "WM_COMMAND")

;Выводим окна на экран
GUISetState(@SW_SHOW, $Main_GUI)
GUISetState(@SW_SHOW, $ChildGui_1)
GUISetState(@SW_HIDE, $ChildGui_2)
GUISetState(@SW_HIDE, $ChildGui_3)

While 1
$Msg = GUIGetMsg(1)

Switch $Msg[0]
Case $GUI_EVENT_CLOSE, $Exit_Button
If Not _WinIsVisible($ChildGui_1) Then
$Ask = MsgBox(4096+36, "Attention", "Are you sure you want to exit the Wizard now?", 0, $Msg[1])
If $Ask <> 6 Then ContinueLoop
EndIf

If $Msg[1] = $Main_GUI Then Exit
Case $Next_Button
GUICtrlSetState($Back_Button, $GUI_ENABLE)

Local $CurrentHandle = 0
Local $NextHandle = 0

Select
Case _WinIsVisible($ChildGui_1)
$CurrentHandle = $ChildGui_1
$NextHandle = $ChildGui_2
_CheckInputsProc(1)
Case _WinIsVisible($ChildGui_2)
$CurrentHandle = $ChildGui_2
$NextHandle = $ChildGui_3
GUICtrlSetState($Next_Button, $GUI_DISABLE)
EndSelect

If $CurrentHandle <> 0 Then
GUISetState(@SW_HIDE, $CurrentHandle)
GUISetState(@SW_SHOW, $NextHandle)
EndIf

WinActivate($Main_GUI)
Case $Back_Button
GUICtrlSetState($Next_Button, $GUI_ENABLE)

Local $CurrentHandle = 0
Local $BackHandle = 0

Select
Case _WinIsVisible($ChildGui_3)
$CurrentHandle = $ChildGui_3
$BackHandle = $ChildGui_2
Case _WinIsVisible($ChildGui_2)
$CurrentHandle = $ChildGui_2
$BackHandle = $ChildGui_1
GUICtrlSetState($Back_Button, $GUI_DISABLE)
EndSelect

If $CurrentHandle <> 0 Then
GUISetState(@SW_HIDE, $CurrentHandle)
GUISetState(@SW_SHOW, $BackHandle)
EndIf

WinActivate($Main_GUI)
EndSwitch
WEnd

Func _GUICtrlCreateSeperator($Direction, $Left, $Top, $Width = 3, $Lenght = 25)
Switch $Direction
Case 0
GUICtrlCreateLabel("", $Left, $Top, $Lenght, $Width, $SS_SUNKEN)
Case 1
GUICtrlCreateLabel("", $Left, $Top, $Width, $Lenght, $SS_SUNKEN)
EndSwitch
EndFunc ;==>_GUICtrlCreateSeperator

Func _WinIsVisible($hWnd)
Return BitAND(WinGetState($hWnd), 2)
EndFunc ;==>_WinIsVisible

Func _CheckInputsProc($iCheckNextButton=0)
Local $iNextButtonState = $GUI_ENABLE

If GUICtrlRead($Input2_3_1) = "" Then
_GUICtrlSetState($Icon_2_3_1, $GUI_SHOW)
_GUICtrlSetState($Icon_2_3_2, $GUI_HIDE)

$iNextButtonState = $GUI_DISABLE
Else
_GUICtrlSetState($Icon_2_3_1, $GUI_HIDE)
_GUICtrlSetState($Icon_2_3_2, $GUI_SHOW)
EndIf

If GUICtrlRead($Input2_4_1) = "" Then
_GUICtrlSetState($Icon_2_4_1, $GUI_SHOW)
_GUICtrlSetState($Icon_2_4_2, $GUI_HIDE)

$iNextButtonState = $GUI_DISABLE
Else
_GUICtrlSetState($Icon_2_4_1, $GUI_HIDE)
_GUICtrlSetState($Icon_2_4_2, $GUI_SHOW)
EndIf

If GUICtrlRead($Input2_5_1) = "" Then
_GUICtrlSetState($Icon_2_5_1, $GUI_SHOW)
_GUICtrlSetState($Icon_2_5_2, $GUI_HIDE)

$iNextButtonState = $GUI_DISABLE
Else
_GUICtrlSetState($Icon_2_5_1, $GUI_HIDE)
_GUICtrlSetState($Icon_2_5_2, $GUI_SHOW)
EndIf

If GUICtrlRead($InputGui_2_6_1) <> 12 Then
_GUICtrlSetState($Icon_2_6_1, $GUI_SHOW)
_GUICtrlSetState($Icon_2_6_2, $GUI_HIDE)

$iNextButtonState = $GUI_DISABLE
Else
_GUICtrlSetState($Icon_2_6_1, $GUI_HIDE)
_GUICtrlSetState($Icon_2_6_2, $GUI_SHOW)
EndIf

If $iCheckNextButton Then _GUICtrlSetState($Next_Button, $iNextButtonState)
EndFunc ;==>_CheckInputsProc

Func WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
Local $nNotifyCode = BitShift($wParam, 16)
Local $nID = BitAND($wParam, 0xFFFF)
Local $hCtrl = $lParam

Switch $nNotifyCode
Case $EN_CHANGE, $EN_UPDATE
_CheckInputsProc(1)
EndSwitch

Return $GUI_RUNDEFMSG
EndFunc ;==>WM_COMMAND

Func _GUICtrlSetState($nCtrl, $iState)
If BitAND(GUICtrlGetState($nCtrl), $iState) <> $iState Then GUICtrlSetState($nCtrl, $iState)
EndFunc

Вот (http://forum.ru-board.com/topic.cgi?forum=5&topic=17705&start=1700#8) ссылка откуда взято(там далее есть наработки еще)

FlatX007
07-08-2009, 15:34
А если сделать Inno Setup , то всё гораздо проще, там даже есть мастер создания инсталяторов ...




© OSzone.net 2001-2012