Автор Тема: GUI окно создается, но виснет  (Прочитано 1448 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Malderin [?]

  • Новичок
  • *
  • Сообщений: 55
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
День добрый. Есть такая непонятная проблема. Имеется скрипт:
Код: AutoIt [Выделить]
#include "ModernMenuRaw.au3"
#NoTrayIcon

Opt("GUIOnEventMode", 1)
Opt("TrayMenuMode", 7)
_SetFlashTimeOut(250)

$nTrayIcon = _TrayIconCreate("Создание ...", "shell32.dll", -160)

_TrayCreateContextMenu()
_SetTrayTextColor(0x000000)
_SetTrayBkColor(0xFFD8C0)
_SetTrayIconBkColor(0xFDFDFD)
_SetTrayIconBkGrdColor(0xC0A0A0)
_SetTraySelectBkColor(0x662222)
_SetTraySelectRectColor(0x800000)
_SetTraySelectTextColor(0x66FFFF)
;~ $bUseAdvTrayMenu = False ;Перекрашивает фон меню

_TrayCreateItem("")

$iAddNew = _TrayCreateItem("1_Запустить GUI")
GUICtrlSetOnEvent($iAddNew, "iGui") ; Запуск GUI
_TrayItemSetIcon(-1, "shell32.dll", -195)

$nExit = _TrayCreateItem('Выход')
GUICtrlSetOnEvent(-1, "_Quit")
_TrayItemSetIcon(-1, "shell32.dll", -216)

_TrayIconSetState()

While 1
    Sleep(5000)
WEnd

Func _Quit()
    _TrayIconDelete($nTrayIcon)
    Exit
EndFunc   ;==>_Quit

Func iGui() ; Не покатило
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>

        Local $iRadio3, $iRadio4, $iRadio5, $msg1, $hGUI1
        $hGUI1 = GUICreate("Выбор типа ДСЕ", 250, 100) ; Создаёт окно в центре экрана

        GUICtrlCreateGroup("Выберите тип ДСЕ (ДЕ или СБ)", 10, 10, 230, 80)
        $iRadio3 = GUICtrlCreateRadio("-", 30, 35, 40, 40, $BS_PUSHLIKE + $BS_ICON)
        GUICtrlSetImage(-1, "shell32.dll", 22)
        GUICtrlSetState(-1, $GUI_CHECKED) ; параметр -1 определяет последнюю использованную переменную

        $iRadio4 = GUICtrlCreateRadio("-", 80, 35, 40, 40, $BS_PUSHLIKE + $BS_ICON)
        GUICtrlSetImage(-1, "shell32.dll", 23)

        $iRadio5 = GUICtrlCreateRadio("-", 130, 35, 40, 40, $BS_PUSHLIKE + $BS_BITMAP)
        GUICtrlSetImage(-1, "oemlogo.bmp")
        GUICtrlCreateGroup("", -99, -99, 1, 1)

        GUISetState() ; показывает созданное окно

        ; Запускается цикл опроса GUI до тех пор пока окно не будет закрыто
        While 1
            $msg1 = GUIGetMsg()
            Select ; рекомендуется использовать Switch вместо Select
                Case $msg1 = $GUI_EVENT_CLOSE
                    ExitLoop
                Case $msg1 = $iRadio3 And BitAND(GUICtrlRead($iRadio3), $GUI_CHECKED) = $GUI_CHECKED
                    MsgBox(64, 'Информация:', 'В кликнули Радио кнопку слева и этот выбор отмечен визуально.', 0, $hGUI1)
                    ExitLoop
                Case $msg1 = $iRadio4 And BitAND(GUICtrlRead($iRadio4), $GUI_CHECKED) = $GUI_CHECKED
                    MsgBox(64, 'Информация:', 'В кликнули Радио кнопку в центре и этот выбор отмечен визуально.', 0, $hGUI1)
                    ExitLoop
                Case $msg1 = $iRadio5 And BitAND(GUICtrlRead($iRadio5), $GUI_CHECKED) = $GUI_CHECKED
                    MsgBox(64, 'Информация:', 'В кликнули Радио кнопку справа и этот выбор отмечен визуально.', 0, $hGUI1)
                    ExitLoop
            EndSelect
        WEnd
GUIDelete($hGUI1)
EndFunc
 


Сделано меню в трее на основе библиотеки ModernMenuRaw.au3 (если у кого ее нет, могу прикрепить отдельным файлом). Далее Функция iGui - не что иное как обычное окно с тремя кнопками, при нажатию на каждую из которых вылезает окно с указанием какая из кнопок была нажата. Вызывается это окно из меню в трее.
Теперь о проблеме. Окно GUI конечно вызывается, но дальше все, при нажатии на эти кнопки ничего не происходит, а должны выходить всплывающие сообщения что нажата такая то кнопка.
В чем проблема и как исправить я не понимаю, помогите разобраться.
« Последнее редактирование: Май 11, 2017, 10:56:53 от Malderin »

Русское сообщество AutoIt

GUI окно создается, но виснет
« Отправлен: Май 11, 2017, 10:40:52 »

Оффлайн Prog [?]

  • Осваивающий
  • **
  • Сообщений: 292
  • Репутация: 29
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: GUI окно создается, но виснет
« Ответ #1, Отправлен: Май 11, 2017, 12:09:19 »
Malderin  [?]
Цитировать
While 1
    Sleep(5000)
WEnd
Попробуйте заменить Sleep(5000) на GUIGetMsg()

Но я бы сделал не так. Окно изначально создал бы невидимым и отображал его когда нужно.

Помечен как лучший ответ пользователем Malderin Отправлен Май 12, 2017, 09:26:47

Оффлайн Alofa [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1433
  • Репутация: 212
  • Пол: Мужской
  • Windows 7 /10 [x64]
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: GUI окно создается, но виснет
« Ответ #2, Отправлен: Май 11, 2017, 13:32:06 »
... Окно GUI конечно вызывается, но дальше все...

Цитата из описания функции GUIGetMsg():
Цитировать
... Если опция GUIOnEventMode установлена в 1, то GUIGetMsg() всегда возвращает 0 и @error установленный в 1.

Оффлайн Malderin [?]

  • Новичок
  • *
  • Сообщений: 55

  • Автор темы
  • Репутация: 1
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: GUI окно создается, но виснет
« Ответ #3, Отправлен: Май 11, 2017, 15:11:47 »
Цитата из описания функции GUIGetMsg():
Цитировать
... Если опция GUIOnEventMode установлена в 1, то GUIGetMsg() всегда возвращает 0 и @error установленный в 1.
Спасибо за подсказку, но это помогло лишь частично. Добавил в начале функции iGUI переключение этой опции в значение 0, а в конце в значение 1. Один раз срабатывает, но при повторном вызове этой функции получаем сообщение:
Цитировать
"C:\Program Files\AutoIt3\Include\GUIConstantsEx.au3" (14) : ==> Can not redeclare a constant.:
Global Const $GUI_EVENT_CLOSE = -3
Global Const ^ ERROR

В итоге воспользовался советом Prog выше и сделал так:

Код: AutoIt [Выделить]
#include "ModernMenuRaw.au3"
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>
#NoTrayIcon


#Region GUI
        Local $iRadio3, $iRadio4, $iRadio5, $msg1, $hGUI1
        $hGUI1 = GUICreate("Выбор типа ДСЕ", 250, 100) ; Создаёт окно в центре экрана

        GUICtrlCreateGroup("Выберите тип ДСЕ (ДЕ или СБ)", 10, 10, 230, 80)
        $iRadio3 = GUICtrlCreateRadio("-", 30, 35, 40, 40, $BS_PUSHLIKE + $BS_ICON)
        GUICtrlSetImage(-1, "shell32.dll", 22)
        GUICtrlSetState(-1, $GUI_CHECKED) ; параметр -1 определяет последнюю использованную переменную

        $iRadio4 = GUICtrlCreateRadio("-", 80, 35, 40, 40, $BS_PUSHLIKE + $BS_ICON)
        GUICtrlSetImage(-1, "shell32.dll", 23)

        $iRadio5 = GUICtrlCreateRadio("-", 130, 35, 40, 40, $BS_PUSHLIKE + $BS_BITMAP)
        GUICtrlSetImage(-1, "oemlogo.bmp")
        GUICtrlCreateGroup("", -99, -99, 1, 1)

        GUISetState(@SW_HIDE) ; показывает созданное окно

#EndRegion

Opt("GUIOnEventMode", 1)
Opt("TrayMenuMode", 7)
_SetFlashTimeOut(250)

$nTrayIcon = _TrayIconCreate("Создание ...", "shell32.dll", -160)

_TrayCreateContextMenu()
_SetTrayTextColor(0x000000)
_SetTrayBkColor(0xFFD8C0)
_SetTrayIconBkColor(0xFDFDFD)
_SetTrayIconBkGrdColor(0xC0A0A0)
_SetTraySelectBkColor(0x662222)
_SetTraySelectRectColor(0x800000)
_SetTraySelectTextColor(0x66FFFF)
;~ $bUseAdvTrayMenu = False ;Перекрашивает фон меню

_TrayCreateItem("")

$iAddNew = _TrayCreateItem("1_Запустить GUI")
GUICtrlSetOnEvent($iAddNew, "AddNew") ; Запуск GUI
_TrayItemSetIcon(-1, "shell32.dll", -195)

$nExit = _TrayCreateItem('Выход')
GUICtrlSetOnEvent(-1, "_Quit")
_TrayItemSetIcon(-1, "shell32.dll", -216)

_TrayIconSetState()

While 1
    Sleep(10000)
WEnd

Func AddNew()
Opt("GUIOnEventMode", 0)
GUISetState(@SW_SHOW, $hGUI1) ; показывает созданное окно

        While 1
            $msg1 = GUIGetMsg()
            Select ; рекомендуется использовать Switch вместо Select
                Case $msg1 = $GUI_EVENT_CLOSE
                    ExitLoop
                Case $msg1 = $iRadio3 And BitAND(GUICtrlRead($iRadio3), $GUI_CHECKED) = $GUI_CHECKED
                    MsgBox(64, 'Информация:', 'В кликнули Радио кнопку слева и этот выбор отмечен визуально.', 0, $hGUI1)
                    GUISetState(@SW_HIDE, $hGUI1)
                    Opt("GUIOnEventMode", 1)
                    ExitLoop
                Case $msg1 = $iRadio4 And BitAND(GUICtrlRead($iRadio4), $GUI_CHECKED) = $GUI_CHECKED
                    MsgBox(64, 'Информация:', 'В кликнули Радио кнопку в центре и этот выбор отмечен визуально.', 0, $hGUI1)
                    GUISetState(@SW_HIDE, $hGUI1)
                    Opt("GUIOnEventMode", 1)
                    ExitLoop
                Case $msg1 = $iRadio5 And BitAND(GUICtrlRead($iRadio5), $GUI_CHECKED) = $GUI_CHECKED
                    MsgBox(64, 'Информация:', 'В кликнули Радио кнопку справа и этот выбор отмечен визуально.', 0, $hGUI1)
                    GUISetState(@SW_HIDE, $hGUI1)
                    Opt("GUIOnEventMode", 1)
                    ExitLoop
            EndSelect
        WEnd
EndFunc

Func _Quit()
    _TrayIconDelete($nTrayIcon)
    Exit
EndFunc   ;==>_Quit
 


Вроде наконец работает.

Русское сообщество AutoIt

Re: GUI окно создается, но виснет
« Ответ #3 Отправлен: Май 11, 2017, 15:11:47 »

Оффлайн inververs [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 2135
  • Репутация: 461
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: GUI окно создается, но виснет
« Ответ #4, Отправлен: Май 11, 2017, 15:26:26 »
Malderin
Не правильные выводы сделали. GUIOnEventMode - не может вызывать такую ошибку.
Эта ошибка из за того - что в вашем коде не правильно использовался #include

Русское сообщество AutoIt

Re: GUI окно создается, но виснет
« Ответ #4 Отправлен: Май 11, 2017, 15:26:26 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
2 Ответов
2421 Просмотров
Последний ответ Февраль 13, 2011, 21:15:30
от dwerf
4 Ответов
3230 Просмотров
Последний ответ Июнь 03, 2012, 13:42:30
от inververs
13 Ответов
6430 Просмотров
Последний ответ Июль 05, 2012, 12:35:40
от InnI
20 Ответов
5474 Просмотров
Последний ответ Июнь 11, 2013, 22:32:08
от InnI
7 Ответов
4670 Просмотров
Последний ответ Июль 25, 2013, 09:31:40
от pvnn
0 Ответов
1736 Просмотров
Последний ответ Июль 25, 2013, 07:22:19
от madmasles
3 Ответов
1244 Просмотров
Последний ответ Август 31, 2014, 13:15:58
от AZJIO
2 Ответов
847 Просмотров
Последний ответ Ноябрь 30, 2015, 18:32:55
от Sln
6 Ответов
1711 Просмотров
Последний ответ Апрель 11, 2017, 20:48:34
от Alofa
4 Ответов
2738 Просмотров
Последний ответ Май 04, 2017, 09:20:18
от fMike