Что нового

[Элементы 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,724
В цикле вызываешь 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,322
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,671
Репутация
2,481
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,671
Репутация
2,481
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,874
Репутация
1,194
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,874
Репутация
1,194
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
Репутация
31
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тировал со скриптом, который, кроме того, содержал большое кол-во вкладок и дочерних окон. Все отработало корректно. На настоящий момент, зависаний не обнаружено.

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