Что нового

Отключенная кнопка $GUI_EVENT_CLOSE (стиль $GUI_DISABLE)

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
На скриншоте (Прикрепленные файлы - Setup.jpg) видно, что у окна отключена кнопка закрытия. Как такое окно реализовать с помощью AutoIt?

Подробнее: как в окне, которое создано с помощью AutoIt установить стиль $GUI_DISABLE кнопке $GUI_EVENT_CLOSE (или также отключить ее любым другим способом)?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
Astel064,
Можно так попробовать сделать.
Код:
#include <GUIConstantsEx.au3>
#include <GUIMenu.au3>

Global $hGui, $nButton, $iW = 400, $iH = 300, $hMenu, $fNoClose

$hGui = GUICreate('Test', $iW, $iH)
$nButton = GUICtrlCreateButton('Click', ($iW - 100) / 2, ($iH - 30) / 2, 100, 30)
GUISetState()
$hMenu = _GUICtrlMenu_GetSystemMenu($hGui)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nButton
			$fNoClose = Not $fNoClose
			If $fNoClose Then
				_GUICtrlMenu_SetItemDisabled($hMenu, $SC_CLOSE, True, False)
			Else
				_GUICtrlMenu_SetItemEnabled($hMenu, $SC_CLOSE, True, False)
			EndIf
	EndSwitch
WEnd
 
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
madmasles [?]
Можно так попробовать сделать.

Спасибо, madmasles, это именно то, что нужно :smile:
На будущее для пользователей (и для себя конечно-же) преобразовал Ваш код в функцию.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
AZJIO
Пример у меня не работает.
 

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
CreatoR
Удалил. Он работает только я не совсем понял идею. В принципе переназначить кнопку "Закрыть" насчитал 3 варинанта, но автору нужно её сделать серой/недоступной. Но у меня такая тема оформления, что этот эффект некрасивый. У меня кнопка просто становится синей, что отличает активное окно от неактивного, но серым оно не становится. Её бы скрыть совсем, либо включить стиль с одной кнопкой и подменить рисунок на "Свернуть", либо убрать все 3 кнопки. Первое не получается, второе не по теме для автора.
 
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
AZJIO [?]
Первое не получается, второе не по теме для автора.

А я не против первых двух вариантов. Интересно, можно-ли сделать подмену рисунка, либо вообще удалить кнопку закрытия? :smile:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Код:
#include <GUIConstantsEx.au3>
#include <GUIMenu.au3>

$hGUI = GUICreate('Test')
GUISetState()

$hMenu = _GUICtrlMenu_GetSystemMenu($hGUI)
_GUICtrlMenu_DeleteMenu($hMenu, $SC_CLOSE, False)
_GUICtrlMenu_DeleteMenu($hMenu, 5, True) ;Разделитель перед пунктом "Закрыть", хотя не уверен что 5 сработает везде

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

MnM

Post-Hardcore
Сообщения
679
Репутация
90
CreatoR
А если эту кнопочку потребуется снова "прикрутить"?)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Код:
#include <GUIConstantsEx.au3>
#include <GUIMenu.au3>

$hGUI = GUICreate('Disable/Enable "Close" button Demo!', 400, 100)
$iButton = GUICtrlCreateButton('Disable Close Button', 20, 30, 360, 40)
GUISetState()

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
		Case $iButton
			$sText = 'Enable Close Button'
			$iState = 1
			
			If StringInStr(GUICtrlRead($iButton, 1), 'Enable') Then
				$sText = 'Disable Close Button'
				$iState = 0
			EndIf
			
			GUICtrlSetData($iButton, $sText)
			
			;Это нужно вызывать каждый раз, т.к после попытки доступа к меню по иконке, меняется дескриптор меню
			$hMenu = _GUICtrlMenu_GetSystemMenu($hGUI)
			_GUICtrlMenu_EnableMenuItem($hMenu, $SC_CLOSE, $iState, False)
			_GUICtrlMenu_DrawMenuBar($hMenu)
    EndSwitch
WEnd
 
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
CreatoR

Мне кажется, или такую-же функцию предложил madmasles в ответе № 1 ? ???
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Astel064 [?]
Мне кажется, или такую-же функцию предложил madmasles в ответе № 1 ?
Кажется :smile:.
Тут используется EnableMenuItem, а не SetItemDisabled.
 

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
И ещё перерисовка (_GUICtrlMenu_DrawMenuBar) позволила запускаться сразу с нужным стилем, без неё стиль переключался при клике на заголовке.


Astel064 [?]
А я не против первых двух вариантов. Интересно, можно-ли сделать подмену рисунка, либо вообще удалить кнопку закрытия?
я не знаю, я подозреваю, что можно сделать подмену. Например в CloneSpy добавлена кнопка "?" четвёртой, хотя по описанию стилей это кнопка не совместима в такой комбинации.
Можно сделать удаление всех трёх кнопок, а удаления только кнопки "Закрыть" оставив "Свернуть" не видел. Но можно сделать окно без кнопок, а в углу добавить свою кнопку "Свернуть", не в заголовке. Но это опять же костыль.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
AZJIO [?]
можно сделать окно без кнопок, а в углу добавить свою кнопку "Свернуть", не в заголовке
Можно и в заголовке.

Вот кривой пример такой реализации:

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

Global Enum $i_CGB_BttnCnt, $i_CGB_BttnID, $i_CGB_hWin, $i_CGB_Total
Global $aGCB_Data[1][1]

$hGUI = GUICreate('GUICaptionButton', 300, 200, -1, -1, BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP))
GUISetState(@SW_SHOW, $hGUI)

$iClose_Bttn = _GUICaptionButton_Create($hGUI, $SC_CLOSE)
$iMax_Bttn = _GUICaptionButton_Create($hGUI, $SC_MAXIMIZE, $GUI_DISABLE)
$iMin_Bttn = _GUICaptionButton_Create($hGUI, $SC_MINIMIZE)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE, $iClose_Bttn
			Exit
		Case $iMax_Bttn
			
		Case $iMin_Bttn
			GUISetState(@SW_MINIMIZE, $hGUI)
	EndSwitch
WEnd

Func _GUICaptionButton_Create($hWnd, $iButton, $iState = -1)
	Local $aWinPos, $aWinClntSize, $iCaption_Height, $iW, $iH, $iL, $iT, $hGUI, $iBttn
	
	Static $SC_BTTN_COUNT = -1
	$SC_BTTN_COUNT += 1
	
	$aWinPos = WinGetPos($hWnd)
	$aWinClntSize = WinGetClientSize($hWnd)
	$iCaption_Height = $aWinPos[3] - $aWinClntSize[1]
	
	$iW = 20
	$iH = $iCaption_Height - 7
	$iL = ($aWinPos[0] + $aWinPos[2]) - $iW - 5 - (($iW + 3) * $SC_BTTN_COUNT)
	$iT = $aWinPos[1]
	
	$hGUI = GUICreate('', $iW, $iH, $iL, $iT, $WS_POPUP, $WS_EX_TOPMOST, $hWnd)
	
	Switch $iButton
		Case $SC_CLOSE
			$iBttn = GUICtrlCreateButton('x', 0, 0, $iW, $iH, $BS_ICON)
			GUICtrlSetImage(-1, 'imageres.dll', -219, 0)
			GUICtrlSetFont(-1, 8.5, 800, 0, 'Wingdings')
		Case $SC_MINIMIZE
			$iBttn = GUICtrlCreateButton('', 0, 0, $iW, $iH)
			GUICtrlSetFont(-1, 8.5, 800, 0, 'Webdings')
		Case $SC_MAXIMIZE
			$iBttn = GUICtrlCreateButton('c', 0, 0, $iW, $iH)
			GUICtrlSetFont(-1, 8.5, 800, 0, 'Webdings')
		Case $SC_CONTEXTHELP
			$iBttn = GUICtrlCreateButton('?', 0, 0, $iW, $iH)
	EndSwitch
	
	GUICtrlSetState($iBttn, $iState)
	
	GUISetState(@SW_SHOWNOACTIVATE, $hGUI)
	
	If $SC_BTTN_COUNT = 0 Then
		GUIRegisterMsg($WM_WINDOWPOSCHANGED, '__GCB_WM_WINDOWPOS')
		;GUIRegisterMsg($WM_ACTIVATE, '__GCB_WM_WINDOWPOS')
	EndIf
	
	ReDim $aGCB_Data[$SC_BTTN_COUNT + 2][$i_CGB_Total]
	
	$aGCB_Data[0][0] = $hWnd
	$aGCB_Data[$SC_BTTN_COUNT + 1][$i_CGB_BttnCnt] = $SC_BTTN_COUNT
	$aGCB_Data[$SC_BTTN_COUNT + 1][$i_CGB_BttnID] = $iBttn
	$aGCB_Data[$SC_BTTN_COUNT + 1][$i_CGB_hWin] = $hGUI
	
	Return $iBttn
EndFunc

Func __GCB_WM_WINDOWPOS($hWnd, $iMsg, $wParam, $lParam)
	If $aGCB_Data[0][0] <> $hWnd Or Not BitAND(WinGetState($hWnd), 8) Then
		Return $GUI_RUNDEFMSG
	EndIf
	
	Local $aWinPos, $aWinClntSize, $iCaption_Height, $iW, $iH, $iL, $iT
	
	$aWinPos = WinGetPos($hWnd)
	$aWinClntSize = WinGetClientSize($hWnd)
	$iCaption_Height = $aWinPos[3] - $aWinClntSize[1]
	
	For $i = 1 To UBound($aGCB_Data)-1
		$iW = 20
		$iH = $iCaption_Height - 7
		$iL = ($aWinPos[0] + $aWinPos[2]) - $iW - 5 - (($iW + 3) * $aGCB_Data[$i][$i_CGB_BttnCnt])
		$iT = $aWinPos[1]
		
		WinMove($aGCB_Data[$i][$i_CGB_hWin], '', $iL, $iT)
	Next
	
	Return $GUI_RUNDEFMSG
EndFunc


Кривой потому, что...
1) При активировании кнопок снимается активность главного окна.
2) При развёртывании свёрнутого окна, кнопки появляются раньше.
3) Не удалось красиво нарисовать все кнопки, да особо и не старался, не это было главным на данном этапе.
 
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
И кстати, о "птичках" :smile:

AZJIO [?]
добавлена кнопка "?"

Как пользоваться этой "?" кнопкой, не подскажите? Просто я знаю, что ее можно добавить, но как ей, например, задать событие, а уж тем-более, как отображать всплывающие подсказки при нажатии "? + элемент" (как это реализовано софте от Microsoft) - не знаю...


CreatoR [?]
Тут используется EnableMenuItem, а не SetItemDisabled.
Буду иметь в виду. :smile:
 

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
OffTopic:
Astel064
Почему бы новую тему не создать? В справке WM_HELP
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Astel064 [?]
Как пользоваться этой "?" кнопкой
Как то так:

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

$hGUI = GUICreate('$WS_EX_CONTEXTHELP Demo', 300, 200, -1, -1, BitOR($WS_CAPTION, $WS_POPUP, $WS_SYSMENU), $WS_EX_CONTEXTHELP)

$iButton = GUICtrlCreateButton('Button', 20, 40, 60, 20)
$hButton = GUICtrlGetHandle($iButton)

GUIRegisterMsg($WM_HELP, 'WM_HELP')
GUISetState(@SW_SHOW, $hGUI)

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

Func WM_HELP($hWnd, $Msg, $wParam, $lParam)
    Local $HELPINFO, $hControl
    
    $HELPINFO = DllStructCreate('int cbSize;int iContextType;int iCtrlId;hwnd hItemHandle;dword dwContextId;long MousePos[2]', $lParam)
    $hControl = DllStructGetData($HELPINFO, 'hItemHandle')
    
	Switch $hControl
		Case $hButton
			ToolTip('Button')
			AdlibRegister('_ClearTooltip_Proc', 10)
	EndSwitch
    
    Return $GUI_RUNDEFMSG
EndFunc

Func _ClearTooltip_Proc()
	Local $stPoint = DllStructCreate($tagPOINT)
	
	DllStructSetData($stPoint, 'x', MouseGetPos(0))
    DllStructSetData($stPoint, 'y', MouseGetPos(1))
	
	If _WinAPI_WindowFromPoint($stPoint) <> $hButton Then
		ToolTip('')
		AdlibUnRegister('_ClearTooltip_Proc')
	EndIf
EndFunc
 
Автор
Astel064

Astel064

Помог мой пост, ставь +!
Сообщения
276
Репутация
51
На будущее, если кому понадобится: UDF GuiCloseButton.au3
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,673
Репутация
2,486
Astel064 [?]
На будущее, если кому понадобится: UDF GuiCloseButton.au3
Вот так будет удобнее/корректнее:

Код:
_GUICloseButton_Enable($hWnd, False, 0)
Sleep(2000)
_GUICloseButton_Enable($hWnd, True, 1)

Func _GUICloseButton_Enable($hGUI, $bEnable, $iCloseOnESC = 1)
	Local $hMenu
	
	$hMenu = _GUICtrlMenu_GetSystemMenu($hGui)
	_GUICtrlMenu_EnableMenuItem($hMenu, $SC_CLOSE, Not $bEnable, False)
	_GUICtrlMenu_DrawMenuBar($hMenu)
	
	AutoItSetOption('GUICloseOnESC', $iCloseOnESC)
EndFunc
 
Верх