Что нового

[Элементы GUI] Кнопки в заголовке окна GUI

NoMad73rus

Продвинутый
Сообщения
124
Репутация
80
Собственно есть GUI в котором 100% клиентской части занимает элемент ActiveX. Хотелось бы добавить несколько кнопок в заголовок, тем более что нужны именно около стандартные(закрепить, поверх всех и д.р.)
Подскажите как реализовать?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
Вот пример от CreatoR-a, замена стандартных кнопок, свои можно добавить по аналогии.


Код:
#include <GUIConstantsEx.au3> 
#include <WindowsConstants.au3> 
#include <StaticConstants.au3> 
 
$iWidth = 200 
$iHeight = 150 
 
$hGUI = GUICreate("Tiny GUI", $iWidth, $iHeight, -1, -1, BitOR($WS_POPUP, $WS_BORDER)) 
 
$nMinimize_Button = GUICtrlCreateButton("—", $iWidth - 35, 3, 16, 16) 
GUICtrlSetColor(-1, 0xFFFFFF) 
GUICtrlSetBkColor(-1, 0x0000FF) 
 
$nClose_Button = GUICtrlCreateButton("X", $iWidth - 19, 3, 16, 16) 
GUICtrlSetColor(-1, 0xFFFFFF) 
GUICtrlSetBkColor(-1, 0xFF0000) 
 
GUICtrlCreateLabel("", 0, 0, $iWidth, 22, $WS_CLIPSIBLINGS, BitOR($WS_EX_DLGMODALFRAME, $GUI_WS_EX_PARENTDRAG)) 
GUICtrlSetBkColor(-1, 0x9D9DFF) 
 
GUISetState(@SW_SHOW, $hGUI) 
 
While 1 
    Switch GUIGetMsg() 
        Case $GUI_EVENT_CLOSE, $nClose_Button 
            Exit 
        Case $nMinimize_Button 
            GUISetState(@SW_MINIMIZE, $hGUI) 
    EndSwitch 
WEnd
 
Автор
N

NoMad73rus

Продвинутый
Сообщения
124
Репутация
80
WSWR сказал(а):
Вот пример от CreatoR-a, замена стандартных кнопок, свои можно добавить по аналогии.

Это конечно вариант, но сдаётся мне должно существовать более лаконичное решение...
OffTopic:
Вот смотрю на заголовок квипа... вот бы выдрать от туда кнопочку "поверх всех"..
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
NoMad73rus [?]
сдаётся мне должно существовать более лаконичное решение
Можно создать кнопку дополнительным GUI, и следить за перемещением главного окна, и соответственно перемещать эту кнопку. Но это тоже не самый лучший вариант.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вот пример:

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

Global Const $SM_CXFIXEDFRAME 	= 7 ;Window border size

$nCaption_Color = _SwitchColor_RGB_BGR(_WinAPI_GetSysColor($COLOR_ACTIVECAPTION))
$iCaption_Height = _WinAPI_GetSystemMetrics($SM_CYCAPTION)
$iBorder_Size = _WinAPI_GetSystemMetrics($SM_CXFIXEDFRAME)

$hGUI = GUICreate("                  Custom Caption button", 350, 200)

$hButton_GUI = GUICreate("", 25, $iCaption_Height - $iBorder_Size, -1, -1, $WS_POPUP, $WS_EX_LAYERED, $hGUI)
GUISetBkColor($nCaption_Color)
$nStick_Button = GUICtrlCreateCheckbox("л", 0, 0, 25, $iCaption_Height - $iBorder_Size, BitOr($GUI_SS_DEFAULT_CHECKBOX, $BS_PUSHLIKE), $WS_EX_STATICEDGE)
GUICtrlSetFont(-1, 14, 200, 0, "Webdings")
GUICtrlSetTip(-1, "Stick window (Set OnTop)")

_WinAPI_SetLayeredWindowAttributes($hButton_GUI, $nCaption_Color, 0, $LWA_COLORKEY)
GUIRegisterMsg($WM_MOVE, "WM_MOVE")
_GUIButtonSetPos_Proc()

GUISetState(@SW_SHOW, $hButton_GUI)
GUISetState(@SW_SHOW, $hGUI)

AdlibRegister("_CheckButtonState", 10)

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

Func _CheckButtonState()
	Local $aCurInfo = GUIGetCursorInfo($hButton_GUI)
	
	If IsArray($aCurInfo) And $aCurInfo[2] = 1 And $aCurInfo[4] = $nStick_Button Then
		WinSetOnTop($hGUI, "", GUICtrlRead($nStick_Button) <> $GUI_CHECKED)
	ElseIf WinActive($hButton_GUI) Then
		WinActivate($hGUI)
	EndIf
EndFunc

Func _GUIButtonSetPos_Proc()
	Local $aGUIPos = WinGetPos($hGUI)
	
	Local $iX = $aGUIPos[0]
	Local $iY = $aGUIPos[1]
	
	WinMove($hButton_GUI, "", $iX + 30, $iY + $iBorder_Size + ($iBorder_Size / 2))
EndFunc

Func WM_MOVE($hWndGUI, $iMsg, $wParam, $lParam)
	;Local $iX = BitAND($lParam, 0xFFF)
	;Local $iY = BitShift($lParam, 16)
	
	_GUIButtonSetPos_Proc()
EndFunc

Func _SwitchColor_RGB_BGR($iColor)
	Local $iMask = BitXOR(BitAND($iColor, 0xFF), ($iColor / 0x10000))
	Return "0x" & Hex(BitXOR($iColor, ($iMask * 0x10001)), 6)
EndFunc
 
Автор
N

NoMad73rus

Продвинутый
Сообщения
124
Репутация
80
CreatoR, спасибо. Это в целом то что нужно, но столько кода ради одной кнопки... но тему решённой, с вашего позволения, отмечать пока не буду, вдруг кто то предложит ещё вариант...
 
Верх