Что нового

Как различить Button, CheckBox, RadioBox

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Как можно отличить Button, CheckBox, RadioBox друг от друга, у всех этих элементов класс 'Button'

Код:
#Include <WindowsConstants.au3>
#Include <WinAPIEx.au3>

$hForm = GUICreate('', 800, 600)
$Button1 = GUICtrlCreateButton('Кнопка 1', 10, 20, 80, 20)
$Button2 = GUICtrlCreateButton('Кнопка 2', 10, 50, 80, 20)
GUISetState()

SetControl($hForm)

While 1
	Switch GUIGetMsg()
		Case -3
			Exit
		Case $Button1
			MsgBox(0, '', 'Кнопка 1')
		Case $Button2
			MsgBox(0, '', 'Кнопка 2')
	EndSwitch
WEnd

Func SetControl($hWnd)
	Local $Enum = _WinAPI_EnumChildWindows($hWnd)
	For $i = 1 To UBound($Enum) -1
		$id = _WinAPI_GetDlgCtrlID($Enum[$i][0])
		Local $iPos = ControlGetPos($hWnd, '', $id)
		Local $sText = GUICtrlRead($id)
		GUICtrlDelete($id)
		$id = GUICtrlCreateLabel($sText, $iPos[0], $iPos[1], $iPos[2], $iPos[3])
	Next
EndFunc
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Потому что все они и есть Button. Различать нужно по стилю, см. описание для _GUICtrlButton_Create(), думаю разберетесь сами.
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Как тогда распознать стиль, если их применено несколько, то _WinAPI_GetWindowLong() тут не помошник...
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
За тип кнопки отвечают последние 4 бита в ее стиле (всего 16 типов).

Код:
#Include <APIConstants.au3>
#Include <ButtonConstants.au3>
#Include <WinAPIEx.au3>

$hForm = GUICreate('', 800, 600)
$Button1 = GUICtrlCreateButton('Кнопка 1', 10, 20, 80, 20)
$Button2 = GUICtrlCreateRadio('Кнопка 2', 10, 50, 80, 20)
$Button3 = GUICtrlCreateCheckbox('Кнопка 3', 10, 80, 80, 20)
$Button4 = GUICtrlCreateGroup('Кнопка 4', 10, 120, 80, 20)
GUISetState()

_Button($Button1)
_Button($Button2)
_Button($Button3)
_Button($Button4)

Func _Button($CtrlID)

	Local $Style = _WinAPI_GetWindowLong(GUICtrlGetHandle($CtrlID), $GWL_STYLE)

	Switch BitAND($Style, 0xF)
		Case 0, $BS_DEFPUSHBUTTON ; BS_PUSHBUTTON = 0x0000
			ConsoleWrite('Push button' & @CR)
		Case $BS_3STATE, $BS_AUTO3STATE, $BS_CHECKBOX, $BS_AUTOCHECKBOX
			ConsoleWrite('Checkbox' & @CR)
		Case $BS_RADIOBUTTON, $BS_AUTORADIOBUTTON
			ConsoleWrite('Radio' & @CR)
		Case $BS_GROUPBOX
			ConsoleWrite('Groupbox' & @CR)
		Case $BS_PUSHBOX
			ConsoleWrite('Pushbox' & @CR)
		Case 8, $BS_OWNERDRAW ; BS_USERBUTTON = 0x0008
			ConsoleWrite('Owner-drawn button' & @CR)
		Case $BS_SPLITBUTTON, $BS_DEFSPLITBUTTON
			ConsoleWrite('Split button' & @CR)
		Case $BS_COMMANDLINK, $BS_DEFCOMMANDLINK
			ConsoleWrite('Command link' & @CR)
	EndSwitch
EndFunc   ;==>_Button

Do
Until GUIGetMsg() = -3
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Viktor1703 [?]
Как тогда распознать стиль, если их применено несколько, то _WinAPI_GetWindowLong() тут не помошник...
Почему нет?

Код:
#Include <Constants.au3>
#Include <ButtonConstants.au3>
#Include <WinAPI.au3>

$hForm = GUICreate('', 800, 600)

$Button1 = GUICtrlCreateButton('Кнопка 1', 10, 20, 80, 20)
$Button2 = GUICtrlCreateCheckbox('Кнопка 2', 10, 50, 80, 20)
$Button3 = GUICtrlCreateRadio('Кнопка 3', 10, 70, 80, 20)

GUISetState()

ConsoleWrite(_GUICtrlButton_GetType($Button1) & @LF)
ConsoleWrite(_GUICtrlButton_GetType($Button2) & @LF)
ConsoleWrite(_GUICtrlButton_GetType($Button3) & @LF)

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

Func _GUICtrlButton_GetType($hButton)
	If Not IsHWnd($hButton) Then
		$hButton = GUICtrlGetHandle($hButton)
	EndIf
	
	$nStyle = _WinAPI_GetWindowLong($hButton, $GWL_STYLE)
	
	If BitAND($nStyle, $BS_AUTOCHECKBOX) = $BS_AUTOCHECKBOX Then
		Return 1 ;"CheckBox"
	ElseIf BitAND($nStyle, $BS_AUTORADIOBUTTON) = $BS_AUTORADIOBUTTON Then
		Return 2 ;"Radio"
	Else
		Return 0 ;"Button"
	EndIf
EndFunc
 
Автор
V

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Спасибо огромное :smile:

Чуть - чуть оффтопа, CreatoR, в вашей подписи 'Мои работы' не корректная кодировка символов.

 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
CreatoR,
У Вас в функции _GUICtrlButton_GetType() не учтены стили $BS_AUTO3STATE и $BS_3STATE, с ними будет возвращать 0, а не 1.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
OffTopic:
Viktor1703 [?]
в вашей подписи 'Мои работы' не корректная кодировка символов.
В опере нормально...
Поправил вроде.


madmasles [?]
в функции _GUICtrlButton_GetType() не учтены стили $BS_AUTO3STATE и $BS_3STATE
Это стили кнопок, а не CheckBox, т.ч они не должны учитываться :smile:
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
CreatoR [?]
Это стили кнопок, а не CheckBox, т.ч они не должны учитываться
Почему?
Код:
#include <Constants.au3>
#include <ButtonConstants.au3>
#include <WinAPI.au3>
#include <GUIConstantsEx.au3>

$hForm = GUICreate('', 200, 200)

$Button1 = GUICtrlCreateCheckbox('Checkbox 1', 10, 20, 80, 20, $BS_3STATE)
GUICtrlSetState(-1, $GUI_INDETERMINATE)
$Button2 = GUICtrlCreateCheckbox('Checkbox 2', 10, 50, 80, 20, $BS_AUTO3STATE)
$Button3 = GUICtrlCreateCheckbox('Checkbox 3', 10, 70, 80, 20)

GUISetState()

ConsoleWrite(_GUICtrlButton_GetType($Button1) & @LF);0?
ConsoleWrite(_GUICtrlButton_GetType($Button2) & @LF);0?
ConsoleWrite(_GUICtrlButton_GetType($Button3) & @LF);1

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

Func _GUICtrlButton_GetType($hButton)
	If Not IsHWnd($hButton) Then
		$hButton = GUICtrlGetHandle($hButton)
	EndIf

	$nStyle = _WinAPI_GetWindowLong($hButton, $GWL_STYLE)

	If BitAND($nStyle, $BS_AUTOCHECKBOX) = $BS_AUTOCHECKBOX Then
		Return 'CheckBox' ;1
	ElseIf BitAND($nStyle, $BS_AUTORADIOBUTTON) = $BS_AUTORADIOBUTTON Then
		Return 'Radio';2
	Else
		Return 'Button';0
	EndIf
EndFunc   ;==>_GUICtrlButton_GetType
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
madmasles [?]
Извиняюсь, я немного ошибся.

В любом случае, и в функции небольшая ошибочка, там не нужно сравнивать стили:

Код:
...
    If BitAND($nStyle, $BS_AUTOCHECKBOX) Then
        Return 'CheckBox' ;1
    ElseIf BitAND($nStyle, $BS_AUTORADIOBUTTON) Then
        Return 'Radio';2
    Else
        Return 'Button';0
    EndIf
...
 
Верх