Что нового

[Элементы GUI] Как кликнуть по определённому label

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Есть два labela, один большой, второй размером поменьше расположен поверх первого. Делаю реакцию на клик по обоим label, через стиль $SS_NOTIFY. При клике по любому из них приходит сообщение что кликнули по первому :-X. AutoItInfo видит оба этих элемента нормально. Помогите разобраться.
Код:
#include <GUIConstants.au3>
#include <StaticConstants.au3>

GUICreate('test', 150, 150)
$label_1 = GUICtrlCreateLabel('one', 0, 0, 150, 150, $SS_NOTIFY)
GUICtrlSetBkColor(-1, 0x008000)
$label_2 = GUICtrlCreateLabel('two', 50, 50, 50, 50, $SS_NOTIFY)
GUICtrlSetBkColor(-1, 0xFFFFFF)
GUISetState()

While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = $GUI_EVENT_CLOSE
			Exit
		Case $msg = $label_1
			MsgBox(0, 'Click!', 'Label_1')
		Case $msg = $label_2
			MsgBox(0, 'Click!', 'Label_2')
	EndSelect
WEnd

PS: Если при создании элементов поменять их местами, то сообщения приходят нормально, но меньший label не виден за большим :D.
 

snoitaleR

AutoIT Гуру
Сообщения
855
Репутация
223
Re: [Элементы GUI] клик по label

Redline
Я тоже сталкивался с такой ситуацией, но с другими элементами управления...
Главное, чтобы один перекрывал другой...
Реагирует тот, который объявлен в скрипте первым...
Я думаю, что это явление напрямую связано с системой обработки сообщений AUTOIT...
Поэтому, стандартными средствами AUTOIT, скорее всего, не обойтись...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: [Элементы GUI] клик по label

GUIGetCursorInfo() выдает ID верхнего элемента. Можно сделать следующий трюк:

Код:
#include <GUIConstants.au3>
#include <StaticConstants.au3>

GUICreate('test', 150, 150)
$label_1 = GUICtrlCreateLabel('one', 0, 0, 150, 150, $SS_NOTIFY)
GUICtrlSetBkColor(-1, 0x008000)
$label_2 = GUICtrlCreateLabel('two', 50, 50, 50, 50, $SS_NOTIFY)
GUICtrlSetBkColor(-1, 0xFFFFFF)
GUISetState()

While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = $GUI_EVENT_CLOSE
			Exit
		Case $msg = $label_1
			$Cursor = GUIGetCursorInfo()
			Switch $Cursor[4]
				Case $label_1
					MsgBox(0, 'Click!', 'Label_1')
				Case $label_2
					MsgBox(0, 'Click!', 'Label_2')
			EndSwitch
	EndSelect
WEnd
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: [Элементы GUI] клик по label

Redline [?]
Если при создании элементов поменять их местами, то сообщения приходят нормально, но меньший label не виден за большим
Есть ещё такой стиль как $WS_CLIPSIBLINGS, очень полезен если например нужно создать кнопку в Input-поле:

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

GUICreate('test', 150, 150)

$label_2 = GUICtrlCreateLabel('two', 50, 50, 50, 50)
GUICtrlSetBkColor(-1, 0xFFFFFF)

$label_1 = GUICtrlCreateLabel('one', 0, 0, 150, 150, $WS_CLIPSIBLINGS)
GUICtrlSetBkColor(-1, 0x008000)

GUISetState()

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $label_1
			MsgBox(0, 'Click!', 'Label_1')
		Case $label_2
			MsgBox(0, 'Click!', 'Label_2')
	EndSwitch
WEnd
 
Автор
Redline

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Re: [Элементы GUI] клик по label

Спасибо! Оба варианта справляются :smile:. Но первый более универсален - можно накладывать любое количество элементов друг на друга. И $SS_NOTIFY оказался не нужен - без него все отрабатывает :ok:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Re: [Элементы GUI] клик по label

Redline [?]
первый более универсален - можно накладывать любое количество элементов друг на друга
Тут тоже можно:

Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

GUICreate('test', 150, 150)

$label_3 = GUICtrlCreateLabel('three', 40, 60, 70, 30)
GUICtrlSetBkColor(-1, 0xCCCCCC)

$label_2 = GUICtrlCreateLabel('two', 20, 50, 110, 50, $WS_CLIPSIBLINGS)
GUICtrlSetBkColor(-1, 0xFFFFFF)

$label_1 = GUICtrlCreateLabel('one', 0, 0, 150, 150, $WS_CLIPSIBLINGS)
GUICtrlSetBkColor(-1, 0x008000)

GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $label_1
            MsgBox(0, 'Click!', 'Label_1')
        Case $label_2
            MsgBox(0, 'Click!', 'Label_2')
        Case $label_3
            MsgBox(0, 'Click!', 'Label_3')
    EndSwitch
WEnd


правда элементы придётся создавать в обратном порядке :smile:
Согласен, трюк Yashied'а более удобен, и лишние стили не нужно использовать.
 
Верх