Что нового

[Элементы GUI] Statusbar - вывод инфо в statusbar при наведении на контрол

saavaage

Знающий
Сообщения
171
Репутация
17
Собственно, вопрос: как можно организовать вывод текстовой информации в Statusbar при наведении курсора мыши на конкретный контрол?

Вот маленький пример

Код:
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
$hGUI= GUICreate("Тест ListView", 220, 180)
$hStatus = _GUICtrlStatusBar_Create ($hGUI)
 _GUICtrlStatusBar_SetText ($hStatus, "Вывод пояснительной инфо по кнопкам")

$gmi1 = GUICtrlCreateButton ("жми1", 135,95,55,22)
$Tip_gmi1 = GUICtrlSetTip(-1, "Здесь можно перейти на страницу утилиты" & @CRLF & "xxxx.")
$gmi2=GUICtrlCreateButton ("жми2", 35,95,55,22)
$Tip_gmi2 = GUICtrlSetTip(-1, "Здесь можно перейти на страницу утилиты" & @CRLF & "yyy.")

GUISetState   ()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd


Необходимо сделать так, чтобы при наведении курсора мыши на:
1. кнопку $gmi1 в строку статуса выводился текс "Здесь можно перейти на страницу утилиты xxx.",
2. кнопку $gmi2 в строку статуса выводился текс "Здесь можно перейти на страницу утилиты yyy."
3. по умолчанию (если курсор не наведен ни на одну кнопку) в строке статуса выводится сообщение "Вывод пояснительной инфо по кнопкам"

Заранее спасибо за помощь.

PS Autoit 3.3.6.1. Win XP Pro Rus SP3
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 712
В цикле вызываешь GUIGetCursorInfo() и проверяешь над каким элементом в данный момент находится курсор...
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
Спасибо, Yashied!

Вот, что у меня получилось:

Код:
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
$hGUI= GUICreate("Тест ListView", 350, 180)
$hStatus = _GUICtrlStatusBar_Create ($hGUI)

$gmi1 = GUICtrlCreateButton ("жми1", 135,95,55,22)

$gmi2=GUICtrlCreateButton ("жми2", 35,95,55,22)

GUISetState   ()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nMsg = $gmi1, $gmi2
			$Cursor = GUIGetCursorInfo()
            Switch $Cursor[4]
                Case $gmi1
                    _GUICtrlStatusBar_SetText($hStatus, "Здесь можно перейти на страницу утилиты" & @CRLF & "xxxx.")
					sleep(100)
                Case $gmi2
                    _GUICtrlStatusBar_SetText($hStatus, "Здесь можно перейти на страницу утилиты" & @CRLF & "yyyy.")
					sleep(100)
                Case not $gmi1, $gmi2
					_GUICtrlStatusBar_SetText ($hStatus, "Вывод пояснительной инфо по кнопкам")
					sleep(100)
            EndSwitch
	EndSwitch
WEnd

Вопросы теперь следующего плана:
1. при таком скрипте у меня блокируется действие при нажатии на gmi1 и gmi2. Как этого можно избежать?
2. Если у меня есть форма с табами (вкладки) и таких подсказок на каждой - от 1 до 20, все ли будет работать безупречно (скорость работы скрипта, загрузка процессора волнует)?
3. Если эта форма сделана в стиле GUIOnEventMode, как в этом случае организовать ослеживание наведения курсора?

Так, на 1-ый вопрос ответ вроде бы получил. Необходимо было вставлять условие
Код:
Case $gmi1
	functionXXX()


до
Код:
Case $nMsg = $gmi1, $gmi2
			$Cursor = GUIGetCursorInfo()
             Switch $Cursor[4]
                Case $gmi1
                    _GUICtrlStatusBar_SetText($hStatus, "Здесь можно перейти на страницу утилиты" & @CRLF & "xxxx.")
					sleep(100)
                Case $gmi2
                    _GUICtrlStatusBar_SetText($hStatus, "Здесь можно перейти на страницу утилиты" & @CRLF & "yyyy.")
					sleep(100)
                Case not $gmi1, $gmi2
					_GUICtrlStatusBar_SetText ($hStatus, "Вывод пояснительной инфо по кнопкам")
					sleep(100)

             EndSwitch
а не после...

Рабочий код:
Код:
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
$hGUI= GUICreate("Тест ListView", 350, 180)
$hStatus = _GUICtrlStatusBar_Create ($hGUI)

$gmi1 = GUICtrlCreateButton ("жми1", 135,95,55,22)

$gmi2=GUICtrlCreateButton ("жми2", 35,95,55,22)

GUISetState   ()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		[b]Case $gmi1
			 Exit[/b] ; для примера
			 
        Case $nMsg = $gmi1, $gmi2
			$Cursor = GUIGetCursorInfo()
             Switch $Cursor[4]
                Case $gmi1
                    _GUICtrlStatusBar_SetText($hStatus, "Здесь можно перейти на страницу утилиты" & @CRLF & "xxxx.")
					sleep(100)
                Case $gmi2
                    _GUICtrlStatusBar_SetText($hStatus, "Здесь можно перейти на страницу утилиты" & @CRLF & "yyyy.")
					sleep(100)
                Case not $gmi1, $gmi2
					_GUICtrlStatusBar_SetText ($hStatus, "Вывод пояснительной инфо по кнопкам")
					sleep(100)

             EndSwitch
    EndSwitch
WEnd

Таким образом, осталось 2 последних вопроса...
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
madmasles, мда... Слона-то я и не заметил...

Рабочий код:

Код:
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <StaticConstants.au3>

$hGUI= GUICreate("Тест ListView", 350, 180)
$hStatus = _GUICtrlStatusBar_Create ($hGUI)
$gmi1 = GUICtrlCreateButton ("жми1", 135,95,55,22, $SS_NOTIFY)

$gmi2=GUICtrlCreateButton ("жми2", 35,95,55,22, $SS_NOTIFY)

GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $gmi1
			 Exit
        Case $gmi1 OR $gmi2
			$Cursor = GUIGetCursorInfo()
             Switch $Cursor[4]
				Case $gmi1
                    _GUICtrlStatusBar_SetText($hStatus, "Здесь можно перейти на страницу утилиты" & @CRLF & "xxxx.")
					sleep(100)
				Case $gmi2
                    _GUICtrlStatusBar_SetText($hStatus, "Здесь можно перейти на страницу утилиты" & @CRLF & "yyyy.")
					sleep(100)
	        EndSwitch
        Case NOT($gmi1 and $gmi2)
			_GUICtrlStatusBar_SetText ($hStatus, "Вывод пояснительной инфо по кнопкам")
			sleep(100)
    EndSwitch
WEnd
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
Кто-нибудь подскажет ответы насчет последних 2-х вопросов:

2. Если у меня есть форма с табами (вкладки) и таких подсказок на каждой - от 1 до 20, все ли будет работать безупречно (скорость работы скрипта, загрузка процессора волнует)?

3. Если эта форма сделана в стиле GUIOnEventMode, как в этом случае организовать ослеживание наведения курсора?

Заранее спасибо за помощь
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
saavaage
У меня получилось двумя способами.
Первый:
Код:
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
$b_1 = True
$b_2 = True
$b_0 = True
$b_NA = True

$hGUI = GUICreate('Тест', 400, 180)
$hStatus = _GUICtrlStatusBar_Create($hGUI)
;_GUICtrlStatusBar_SetText($hStatus, 'Вывод пояснительной инфо по кнопкам')

$gmi1 = GUICtrlCreateButton('жми1', 50, 95, 100, 25)
GUICtrlSetCursor(-1, 0)
;$Tip_gmi1 = GUICtrlSetTip(-1, 'Здесь можно перейти на страницу утилиты' & @CRLF & 'xxxx.')
$gmi2 = GUICtrlCreateButton('жми2', 250, 95, 100, 25)
GUICtrlSetCursor(-1, 0)
;$Tip_gmi2 = GUICtrlSetTip(-1, 'Здесь можно перейти на страницу утилиты' & @CRLF & 'yyy.')

GUISetState()

AdlibRegister('_StatusBarText', 100)
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $gmi1
			MsgBox(0, '', 'xxxx')
		Case $gmi2
			MsgBox(0, '', 'yyy')
	EndSwitch
WEnd

Func _StatusBarText()

	Local $aCursor = GUIGetCursorInfo()
	If IsArray($aCursor) Then
		Switch $aCursor[4]
			Case $gmi1
				If $b_1 Then
					_WinAPI_MessageBeep(1)
					_GUICtrlStatusBar_SetText($hStatus, 'Здесь можно перейти на страницу утилиты xxxx.')
					$b_1 = False
					$b_2 = True
					$b_0 = True
					$b_NA = True
				EndIf
			Case $gmi2
				If $b_2 Then
					_WinAPI_MessageBeep(1)
					_GUICtrlStatusBar_SetText($hStatus, 'Здесь можно перейти на страницу утилиты yyyy.')
					$b_1 = True
					$b_2 = False
					$b_0 = True
					$b_NA = True
				EndIf
			Case 0
				If $b_0 Then
					_GUICtrlStatusBar_SetText($hStatus, 'Вывод пояснительной инфо по кнопкам')
					$b_1 = True
					$b_2 = True
					$b_0 = False
					$b_NA = True
				EndIf
		EndSwitch
	Else
		If $b_NA Then
			_GUICtrlStatusBar_SetText($hStatus, 'Окно не активно')
			$b_1 = True
			$b_2 = True
			$b_0 = True
			$b_NA = False
		EndIf
	EndIf
EndFunc   ;==>_StatusBarText

Второй:
Код:
#include <GUICtrlOnHover.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>

$hGUI = GUICreate('Тест', 400, 180)
$hStatus = _GUICtrlStatusBar_Create($hGUI)
_GUICtrlStatusBar_SetText($hStatus, 'Вывод пояснительной инфо по кнопкам')
$gmi1 = GUICtrlCreateButton('жми1', 50, 95, 100, 25)
_GUICtrl_OnHoverRegister(-1, '_Hover_Func', '_Leave_Hover_Func')
GUICtrlSetCursor(-1, 0)

$gmi2 = GUICtrlCreateButton('жми2', 250, 95, 100, 25)
_GUICtrl_OnHoverRegister(-1, '_Hover_Func', '_Leave_Hover_Func')
GUICtrlSetCursor(-1, 0)

GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $gmi1
			MsgBox(0, '', 'xxxx')
		Case $gmi2
			MsgBox(0, '', 'yyy')
	EndSwitch
WEnd

Func _Hover_Func($CtrlID)
	Switch $CtrlID
		Case $gmi1
			_WinAPI_MessageBeep(1)
			_GUICtrlStatusBar_SetText($hStatus, 'Здесь можно перейти на страницу утилиты xxxx.')
		Case $gmi2
			_WinAPI_MessageBeep(1)
			_GUICtrlStatusBar_SetText($hStatus, 'Здесь можно перейти на страницу утилиты yyyy.')
	EndSwitch
EndFunc   ;==>_Hover_Func

Func _Leave_Hover_Func($CtrlID)
	_GUICtrlStatusBar_SetText($hStatus, 'Вывод пояснительной инфо по кнопкам')
EndFunc   ;==>_Leave_Hover_Func
GUICtrlOnHover - Обработка событии при наведении мышки.
Насчет скорости и загрузки процессора - не знаю...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 402
saavaage [?]
В Swith не используется оператор Or, там для этого используются запятые:

Код:
Switch $nMsg
        ...
        Case $gmi1, $gmi2
            ...
            EndSwitch
    EndSwitch
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
CreatoR, у меня с Вашими изменениями скрипт не сработал как надо...

madmasles, отлично! Немного изменил Ваш скрипт под GUIOnEventMode и все получилось. Thanks a lot!

Код:
#include <GUICtrlOnHover.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>

Opt("GUIOnEventMode", 1)


$hGUI = GUICreate('Тест', 400, 180)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

$hStatus = _GUICtrlStatusBar_Create($hGUI)
_GUICtrlStatusBar_SetText($hStatus, 'Вывод пояснительной инфо по кнопкам')

$gmi1 = GUICtrlCreateButton('жми1', 50, 95, 100, 25)
_GUICtrl_OnHoverRegister(-1, '_Hover_Func', '_Leave_Hover_Func')
GUICtrlSetCursor(-1, 0)
GUICtrlSetOnEvent($gmi1 , "_Button_Gmi1")

$gmi2 = GUICtrlCreateButton('жми2', 250, 95, 100, 25)
_GUICtrl_OnHoverRegister(-1, '_Hover_Func', '_Leave_Hover_Func')
GUICtrlSetCursor(-1, 0)
GUICtrlSetOnEvent($gmi2 , "_Button_Gmi2")

GUISetState()

While 1
    Sleep(100)
WEnd


Func CLOSEClicked()
   Exit
EndFunc

Func _Hover_Func($CtrlID)
    Switch $CtrlID
        Case $gmi1
            _WinAPI_MessageBeep(1)
            _GUICtrlStatusBar_SetText($hStatus, 'Здесь можно перейти на страницу утилиты xxxx.')
        Case $gmi2
            _WinAPI_MessageBeep(1)
            _GUICtrlStatusBar_SetText($hStatus, 'Здесь можно перейти на страницу утилиты yyyy.')
    EndSwitch
EndFunc   ;==>_Hover_Func

Func _Leave_Hover_Func($CtrlID)
    _GUICtrlStatusBar_SetText($hStatus, 'Вывод пояснительной инфо по кнопкам')
EndFunc   ;==>_Leave_Hover_Func

Func _Button_Gmi1()
     MsgBox(0, '', 'xxxx')
 EndFunc

 Func _Button_Gmi2()
     MsgBox(0, '', 'xxxx')
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 472
Репутация
2 402
saavaage [?]
у меня с Вашими изменениями скрипт не сработал как надо
Потому что изначально это неправильно, в случае с Or сравнивалось значение переменной $nMsg с True или False ($gmi1 OR $gmi2), и в данном случае оно всегда True ($gmi1 = 3 и $gmi2 = 4), поэтому данное условие срабатывает при любом событий ($nMsg <> 0).
«Case NOT($gmi1 and $gmi2)» тоже неправильно, оно срабатывает всегда.
Правильнее так:

Код:
While 1
	$nMsg = GUIGetMsg()

	Switch $nMsg
		Case $GUI_EVENT_CLOSE, $gmi1
			Exit
		Case Else
			If $nMsg = 0 Then ContinueLoop
			
			$Cursor = GUIGetCursorInfo()
			
			Switch $Cursor[4]
				Case $gmi1
					_GUICtrlStatusBar_SetText($hStatus, "Здесь можно перейти на страницу утилиты" & @CRLF & "xxxx.")
				Case $gmi2
					_GUICtrlStatusBar_SetText($hStatus, "Здесь можно перейти на страницу утилиты" & @CRLF & "yyyy.")
				Case Else
					_GUICtrlStatusBar_SetText($hStatus, "Вывод пояснительной инфо по кнопкам")
			EndSwitch
	EndSwitch
WEnd


Но ещё правильнее использовать мою библиотеку «GUICtrlOnHover.au3», которая специально для таких целей и была написана ;)
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
"Но ещё правильнее использовать мою библиотеку «GUICtrlOnHover.au3», которая специально для таких целей и была написана" - это я уже понял и даже успел применить. :smile:.
Спасибо всем за помощь!

Тема решена.
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
saavaage
Вот ещё вариант на WM-сообщениях.

Код:
; переделанный пример из UDF _GUICtrlButton_Create
#include <GuiButton.au3>
Global $k=0
Global $L=0
Global Const $GUI_RUNDEFMSG = 'GUI_RUNDEFMSG'
Global $btn1, $btn2, $iMemo

$GUI = GUICreate("Наведи на кнопки", 430, 150)
GUICtrlCreateLabel("Функция WM_NOTIFY срабатывает при взаимодействии с кнопкой", 90, 5, 330, 40)
$iMemo = GUICtrlCreateLabel("", 90, 45, 330, 100)
$btn1 = GUICtrlCreateButton("= Кнопка1 =", 5, 5, 70, 25)
$btn2 = GUICtrlCreateButton("Кнопка2", 5, 35, 70, 25)
GUIRegisterMsg(0x004E, "WM_NOTIFY")

GUISetState()

While 1
	Switch GUIGetMsg()
		Case -3
			Exit
	EndSwitch
WEnd

Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
	$L+=1
	$GP = MouseGetPos()
	WinSetTitle($Gui, '', 'Вызов ' &$k& ', Событие '&$L& ' раз, x='&$GP[0]&', y='&$GP[1])
	
    #forceref $hWnd, $Msg, $wParam
    Local Const $BCN_HOTITEMCHANGE = -1249
    Local $tNMBHOTITEM = DllStructCreate("hwnd hWndFrom;int IDFrom;int Code;dword dwFlags", $lParam)
    Local $nNotifyCode = DllStructGetData($tNMBHOTITEM, "Code")
    Local $nID = DllStructGetData($tNMBHOTITEM, "IDFrom")
    Local $hCtrl = DllStructGetData($tNMBHOTITEM, "hWndFrom")
    Local $dwFlags = DllStructGetData($tNMBHOTITEM, "dwFlags")
    Local $sText = ""
    
    Switch $nNotifyCode
        Case $BCN_HOTITEMCHANGE ; Win XP and Above
            If BitAND($dwFlags, 0x10) = 0x10 Then
                $sText = "Наведено на кнопку" & @CRLF
				$k+=1
				WinSetTitle($Gui, '', 'Вызов ' &$k& ', Событие '&$L& ' раз, x='&$GP[0]&', y='&$GP[1])
            ElseIf BitAND($dwFlags, 0x20) = 0x20 Then
                $sText = "Оставлена кнопка" & @CRLF
				$k+=1
				WinSetTitle($Gui, '', 'Вызов ' &$k& ', Событие '&$L& ' раз, x='&$GP[0]&', y='&$GP[1])
            EndIf
    GUICtrlSetData($iMemo, $sText &'Имя кнопки - '& _GUICtrlButton_GetText($hCtrl))
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc


И кстати, эти WM-сообщения мне помогли избавится от циклов.
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
AZJIO, отличный подарок подкинули. Меня как раз это (обилие циклов) и смущало. Спасибо!
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
Уважаемые гуру, не проверите, правильно ли я адаптировал скрипт AZJIO под свой пример:

Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
; переделанный пример из UDF _GUICtrlButton_Create

;~ Global Const $GUI_RUNDEFMSG = 'GUI_RUNDEFMSG'
Global $btn1, $btn2, $iMemo

Opt("GUIOnEventMode", 1)

$GUI = GUICreate("Наведи на кнопки", 430, 155, -1, -1, $WS_SIZEBOX)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

$iMemo = GUICtrlCreateLabel("", 0, 100, 430, 28,  $BS_MULTILINE+$SS_SUNKEN)
$btn1 = GUICtrlCreateButton("= Кнопка1 =", 5, 5, 70, 25)
$btn2 = GUICtrlCreateButton("Кнопка2", 5, 35, 70, 25)
$btn3 = GUICtrlCreateButton("Кнопка3", 5, 65, 70, 25)
$btn4 = GUICtrlCreateCheckbox("Кнопка4", 105, 65, 70, 25)
GUIRegisterMsg(0x004E, "WM_NOTIFY")

GUISetState()

While 1
    Sleep(100)
WEnd


Func CLOSEClicked()
   Exit
EndFunc

Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
    #forceref $hWnd, $Msg, $wParam
    Local Const $BCN_HOTITEMCHANGE = -1249
    Local $tNMBHOTITEM = DllStructCreate("hwnd hWndFrom;int IDFrom;int Code;dword dwFlags", $lParam)
    Local $nNotifyCode = DllStructGetData($tNMBHOTITEM, "Code")
    Local $nID = DllStructGetData($tNMBHOTITEM, "IDFrom")
    Local $hCtrl = DllStructGetData($tNMBHOTITEM, "hWndFrom")
    Local $dwFlags = DllStructGetData($tNMBHOTITEM, "dwFlags")

    Switch $nNotifyCode
        Case $BCN_HOTITEMCHANGE ; Win XP and Above
            If BitAND($dwFlags, 0x10) = 0x10 Then
                Switch $nID
				 Case 4
				     GUICtrlSetData($iMemo, 'Excellent 55555555 55555555 55555555555555 555555555 55555555555 55555555555 555555555555 555555555555 5555555555')
				 Case 5
				     GUICtrlSetData($iMemo, 'Good 44444444 55555555 66666666 7777777777 88888888 999999999 1010101010 2222222222222 3333333333 88888 1112223336655')
				 Case 6
					 GUICtrlSetData($iMemo, 'Bad 222222 2222222222222222222 22222222222222222')
				 Case 7
					 GUICtrlSetData($iMemo, 'Very Bad 11111111 1111111111111111 1111111111 11111111111111 1111111111111')
				EndSwitch
            ElseIf BitAND($dwFlags, 0x20) = 0x20 Then
                 GUICtrlSetData($iMemo, "Вывод пояснительной инфо по кнопкам")
			EndIf
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc

Если не сложно, еще несколько вопросов по этому скрипту:
1. Не поясните смысл "Return $GUI_RUNDEFMSG"? Без него все отрабатывает корректно, с ним - аналогично.
2. Не нашел как просто сделать выделение $iMemo в виде простого бордюра (не утопленного). На крайний случай, сойдет и $SS_SUNKEN, но, лучше, имхо выпуклый или плоский вариант.
 

AZJIO

Меценат
Меценат
Сообщения
2 752
Репутация
1 149
saavaage
По случайным обстоятельствам я тебе плюсанул ;)

Так лейблами сделай тень, хотя как это будет выглядеть, если тема не стандартная. Если только принудительно все цвета установить.
Код:
$iMemo = GUICtrlCreateLabel("", 0, 155-55, 430, 28,  $BS_MULTILINE)
GUICtrlSetColor(-1,0x333333)
GUICtrlSetBkColor(-1, 0xcccccc)
; GUICtrlCreateLabel ('', 0, 99, 430, 1,$SS_ETCHEDHORZ)
GUICtrlCreateLabel ('', 0, 98, 430, 1)
GUICtrlSetBkColor(-1, 0xffffff)


Про $GUI_RUNDEFMSG написано в справке. Я тоже не понял более того что написано. Типа корректный выход из функции, но у меня тоже и без него всё работает.
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
AZJIO, к сожалению, не знаю как отплюсить твой плюс. Ладно, главное, что я не случайно тебе свой поставил.

Насчет последней подсказки - намотаю на ус, но пока не использую, т.к. если нельзя это решить стилем, то пусть будет $SS_SUNKEN

Насчет $GUI_RUNDEFMSG, раз не мешает, то пусть пока остается... Просто меня волновало, как это отразиться на использовании этого примера в большом скрипте, где данный - только маленькая часть функционала...
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
В ходе работы со скриптом AZJIO обнаружил одну проблему:
Информация для GuiCtrlLabel и GUICtrlCreateIcon не считывается в строку состояния формы

Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
; переделанный пример из UDF _GUICtrlButton_Create

;~ Global Const $GUI_RUNDEFMSG = 'GUI_RUNDEFMSG'
Global $btn1, $btn2, $iMemo

Opt("GUIOnEventMode", 1)

$GUI = GUICreate("Наведи на кнопки", 430, 155, -1, -1, $WS_SIZEBOX)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
$icon = GUICtrlCreateIcon("shell32.dll", 10, 150, 20)

$iMemo = GUICtrlCreateLabel("", 0, 100, 430, 28,  $BS_MULTILINE+$SS_SUNKEN)
GUICtrlSetColor(-1, 0x0066ff)
$lbl1 = GUICtrlCreateLabel("blin", 230, 55, 30, 28)
$btn1 = GUICtrlCreateButton("= Кнопка1 =", 5, 5, 70, 25)
$btn2 = GUICtrlCreateCheckbox("Кнопка4", 105, 65, 70, 25)
GUIRegisterMsg(0x004E, "WM_NOTIFY")

GUISetState()

While 1
    Sleep(100)
WEnd


Func CLOSEClicked()
   Exit
EndFunc

Func WM_NOTIFY($hWnd, $Msg, $wParam, $lParam)
    #forceref $hWnd, $Msg, $wParam
    Local Const $BCN_HOTITEMCHANGE = -1249
    Local $tNMBHOTITEM = DllStructCreate("hwnd hWndFrom;int IDFrom;int Code;dword dwFlags", $lParam)
    Local $nNotifyCode = DllStructGetData($tNMBHOTITEM, "Code")
    Local $nID = DllStructGetData($tNMBHOTITEM, "IDFrom")
    Local $hCtrl = DllStructGetData($tNMBHOTITEM, "hWndFrom")
    Local $dwFlags = DllStructGetData($tNMBHOTITEM, "dwFlags")

    Switch $nNotifyCode
        Case $BCN_HOTITEMCHANGE ; Win XP and Above
            If BitAND($dwFlags, 0x10) = 0x10 Then
                Switch $nID
				 Case 3; icon
				     GUICtrlSetData($iMemo, 'Excellent 55555555 55555555 55555555555555 555555555 55555555555 55555555555 555555555555 555555555555 5555555555')
				 Case 5; label
				     GUICtrlSetData($iMemo, 'Good 44444444 55555555 66666666 7777777777 88888888 999999999 1010101010 2222222222222 3333333333 88888 1112223336655')
				 Case 6
					 GUICtrlSetData($iMemo, 'Bad 222222 2222222222222222222 22222222222222222')
				 Case 7
					 GUICtrlSetData($iMemo, 'Very Bad 11111111 1111111111111111 1111111111 11111111111111 1111111111111')
				EndSwitch
            ElseIf BitAND($dwFlags, 0x20) = 0x20 Then
                 GUICtrlSetData($iMemo, "Вывод пояснительной инфо по кнопкам")
			EndIf
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc

В чем может быть проблема?
 

beve

Осваивающий
Сообщения
104
Репутация
30
saavaage [?]
В чем может быть проблема?
Попробуй сделать тест и в первой строчке функции: WM_NOTIFY($hWnd, $Msg, $wParam, $lParam) поставь, например MsgBox(64,"проверка", "есть вызов",1). Ты увидеш, что в этом случае функция WM_NOTIFY не вызывается. Поэтому ищи другой путь.
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
beve, это я уже понял. Я так понимаю, что, в принципе, через WM тяжело это сделать (привязать к наведению на label)?
Уже пробовал делать через функцию GUICtrlOnHover.au3,
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <GUICtrlOnHover.au3>

Opt("GUIOnEventMode", 1)


$hGUI = GUICreate('Тест', 619, 475, -1, -1,  $WS_SIZEBOX)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
$hStatus_Pre = GUICtrlCreateLabel('', 0,418,619,32, $SS_SUNKEN)
$hStatus = GUICtrlCreateLabel('Вывод пояснительной инфо по кнопкам', 10,420,599,28, $BS_MULTILINE+$SS_RIGHT)
GUICtrlSetColor(-1, 0x0066ff)

$icon = GUICtrlCreateIcon("shell32.dll", 10, 150, 20)
_GUICtrl_OnHoverRegister(-1, '_Hover_Func', '_Leave_Hover_Func')
GUICtrlSetCursor(-1, 0)

$combo = GUICtrlCreateCombo('Комбо', 200, 25, 50)
_GUICtrl_OnHoverRegister(-1, '_Hover_Func', '_Leave_Hover_Func')
GUICtrlSetCursor(-1, 0)

$btn = GUICtrlCreateButton('Кнопка', 250, 95, 100, 25)
_GUICtrl_OnHoverRegister(-1, '_Hover_Func', '_Leave_Hover_Func')
GUICtrlSetCursor(-1, 0)

$lbl = GUICtrlCreateLabel("Лэйбл", 250, 200, 330, 100)
_GUICtrl_OnHoverRegister(-1, '_Hover_Func', '_Leave_Hover_Func')
GUICtrlSetCursor(-1, 0)

$ckb = GUICtrlCreateCheckbox("Чекбокс", 105, 65, 70, 25)
_GUICtrl_OnHoverRegister(-1, '_Hover_Func', '_Leave_Hover_Func')
GUICtrlSetCursor(-1, 0)

GUISetState()

While 1
    Sleep(100)
WEnd


Func CLOSEClicked()
   Exit
EndFunc

Func _Hover_Func($CtrlID)
    Switch $CtrlID
        Case $icon
            GUICtrlSetData($hStatus, 'ИКОНКА РАБОТАЕТ!  для всех разделов одинаковых размер Корзины: от 0 до 15%. Внимание!! После 9%, 0xa=10%, 0xb=11%, 0xc=12%, 0xd=13%, 0xe=14%, 0xf=15%.1111111111111111111111 22222222222222222 333333333333101')
        Case $btn
            GUICtrlSetData($hStatus, 'Кнопка Работает!. 1111111111 222222222222222 3 333333333')
		Case $lbl
            GUICtrlSetData($hStatus, 'Лэйбл Работает!!!')
		Case $combo
            GUICtrlSetData($hStatus, 'Комбо Работает!!!')
		Case $ckb
            GUICtrlSetData($hStatus, 'Чекбокс Работает!!!')
    EndSwitch
EndFunc   ;==>_Hover_Func

Func _Leave_Hover_Func($CtrlID)
    GuiCtrlSetData($hStatus, 'Вывод пояснительной инфо по кнопкам')
EndFunc   ;==>_Leave_Hover_Func

но у меня в сложном скрипте с большим кол-вом подсказок для контроллов (больше 100) скрипт при попытке выйти через закрытие формы по клику на ESC (крестик в правом верхнем углу формы) (GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")), периодически происходит зависание с выдачей такого сообщения:

Код:
F:\LABORATORY\WORK_1(SmartXP)\SmartXP.au3 (1216) : ==> Recursion level has been exceeded - AutoIt will quit to prevent stack overflow.:
Sleep(100)
Эксперименты с увеличением sleep() до sleep(1000) к успеху не привели..


Добавлено:
Сообщение автоматически объединено:

Сейчас пробую адаптировать такой вариант

Код:
#include <Array.au3>
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <StaticConstants.au3>

Opt("GUIOnEventMode", 1)

$hGUI= GUICreate("Тест ListView", 350, 180)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")

$hStatus = _GUICtrlStatusBar_Create ($hGUI)
$gmi1 = GUICtrlCreateButton ("жми1", 135,95,55,22, $SS_NOTIFY)

$gmi2=GUICtrlCreateButton ("жми2", 35,95,55,22, $SS_NOTIFY)

$icon = GUICtrlCreateIcon("shell32.dll", 10, 150, 20)

$combo = GUICtrlCreateCombo('Комбо', 200, 25, 50)

$ckb = GUICtrlCreateCheckbox("Чекбокс", 105, 65, 70, 25)

GUISetState()
AdlibRegister('_StatusBarText', 100)

While 1
    Sleep(100)
WEnd


Func CLOSEClicked()
   Exit
EndFunc

Func _StatusBarText()
       Local $aCursor = GUIGetCursorInfo()
    If IsArray($aCursor) Then
        Switch $aCursor[4]

                Case $gmi1
                    _GUICtrlStatusBar_SetText($hStatus, "Здесь можно перейти на страницу утилиты жми1")
                Case $gmi2
                    _GUICtrlStatusBar_SetText($hStatus, "Здесь можно перейти на страницу утилиты жми2")
				Case $icon
                    _GUICtrlStatusBar_SetText($hStatus, "Здесь можно перейти на страницу утилиты icon")
				Case $combo
                    _GUICtrlStatusBar_SetText($hStatus, "Здесь можно перейти на страницу утилиты комбо.")
				Case $ckb
                    _GUICtrlStatusBar_SetText($hStatus, "Здесь можно перейти на страницу утилиты чекбокс.")
                Case Else
                    _GUICtrlStatusBar_SetText($hStatus, "Вывод пояснительной инфо по кнопкам")
			EndSwitch
	EndIf
EndFunc

или тоже, только с лэйбл в виде статусбара
Код:
#include <GUIConstantsEx.au3>
#include <GuiStatusBar.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <ButtonConstants.au3>

Opt("GUIOnEventMode", 1)


$hGUI = GUICreate('Тест', 619, 475, -1, -1,  $WS_SIZEBOX)
GUISetOnEvent($GUI_EVENT_CLOSE, "CLOSEClicked")
$hStatus_Pre = GUICtrlCreateLabel('', 0,418,619,32, $SS_SUNKEN)
$hStatus = GUICtrlCreateLabel('Вывод пояснительной инфо по кнопкам', 10,420,599,28, $BS_MULTILINE+$SS_RIGHT)
GUICtrlSetColor(-1, 0x0066ff)

$icon = GUICtrlCreateIcon("shell32.dll", 10, 150, 20)

$combo = GUICtrlCreateCombo('Комбо', 200, 25, 50)

$btn = GUICtrlCreateButton('Кнопка', 250, 95, 100, 25)

$lbl = GUICtrlCreateLabel("Лэйбл", 250, 200, 330, 100)

$ckb = GUICtrlCreateCheckbox("Чекбокс", 105, 65, 70, 25)

GUISetState()
AdlibRegister('_StatusBarText', 100)


While 1
    Sleep(100)
WEnd


Func CLOSEClicked()
   Exit
EndFunc

Func _StatusBarText()
       Local $aCursor = GUIGetCursorInfo()
    If IsArray($aCursor) Then
        Switch $aCursor[4]
			Case $icon
				GUICtrlSetData($hStatus, 'ИКОНКА РАБОТАЕТ!  для всех разделов одинаковых размер Корзины: от 0 до 15%. Внимание!! После 9%, 0xa=10%, 0xb=11%, 0xc=12%, 0xd=13%, 0xe=14%, 0xf=15%.1111111111111111111111 22222222222222222 333333333333101')
			Case $btn
				GUICtrlSetData($hStatus, 'Кнопка Работает!. 1111111111 222222222222222 3 333333333')
			Case $lbl
				GUICtrlSetData($hStatus, 'Лэйбл Работает!!!')
			Case $combo
				GUICtrlSetData($hStatus, 'Комбо Работает!!!')
			Case $ckb
				GUICtrlSetData($hStatus, 'Чекбокс Работает!!!')
			Case Else
			   GUICtrlSetData($hStatus, "Вывод пояснительной инфо по кнопкам")
		EndSwitch
	EndIf
EndFunc

Потом отпишусь


Добавлено:
Сообщение автоматически объединено:

Мда.. попробовал - результат аналогичен результату с GUICtrlOnHover.au3. Все тоже зависание при попытке выхода через ESC.... :( Малость поторопился с выводом...
 
Автор
S

saavaage

Знающий
Сообщения
171
Репутация
17
Итак, вариант из последнего топика показал себя с крупным скриптом (очень много контролов+подсказок) лучше всего. Теcтировал со скриптом, который, кроме того, содержал большое кол-во вкладок и дочерних окон. Все отработало корректно. На настоящий момент, зависаний не обнаружено.

Тема решена. Все спасибо.
 
Верх