Что нового

Добавить кнопку в TitleBar

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 198
Репутация
2 342
w3d [?]
созданная кнопка остается висеть посреди экрана в ожидании запуска программы куда ее надо поставить
В моём примере программа (блокнот) запускается сразу, поэтому такой проблемы не замечено, для использования в другом скрипте нужно менять не @SW_SHOW, а метод проверки окна. Можно увидеть где/как это используется?
 
Автор
W

w3d

Новичок
Сообщения
84
Репутация
3
Сейчас все работает как надо.

Кстати, поэкспериментировал тут с прозрачностью этой кнопки - что-то не выходит.
Поставил туда иконку и хотел чтобы кнопка и фон были прозрачными.
Может быть, проще тогда непосредственно иконку разместить на TitleBar, а не кнопку?

Вообще, изначально хотел что-то вроде такого сделать:
 

r35p3ct

Продвинутый
Сообщения
226
Репутация
60
CreatoR [?]
Также в этом примере поправил проблему с не перемещением кнопки при изменений размера окна.
1. CreatoR, а как обработать клик в меню по Some Item1 и т.д.?
2. Вообще нельзя ли стандартное меню, которое вызывается кликом по иконке в трее вызвать например кликом по этой доп. кнопке в титле?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 198
Репутация
2 342
r35p3ct [?]
как обработать клик в меню по Some Item1 и т.д.?
См. по примеру с $Exit_MenuItem.

нельзя ли стандартное меню, которое вызывается кликом по иконке в трее вызвать например кликом по этой доп. кнопке в титле?
Вроде можно, но найти немогу, офф. сайт в дауне :(.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5 379
Репутация
2 710
Sniper сказал(а):
может можно както через WinAPI...
Можно, но во-первых, все это придется отрисовывать в ручную, во-вторых, получится достаточно много кода, а в-третьих, эти кнопочки, явно не лучшим образом скажутся на стабильности программы в целом. Проще уж тогда нарисовать свой скин и в нем уже добавить все, что душе угодно.
 

musicstashall

Новичок
Сообщения
236
Репутация
3
CreatoR сказал(а):
w3d [?]
в результате, если таскаю появившееся окно по экрану - остаются нарисованные кнопки в разных местах
А что ты ожидаешь если эта кнопка создаётся в цикле, и при чём постоянно, пока окно активно :smile:.
Нужно создать кнопку вне цикла, и прятать её если окно назначения не активно, вот другой пример на эту тему:

Код:
#include <WindowsConstants.au3>

Opt("GUICloseOnESC", 0)
Opt("GUIOnEventMode", 1)
Opt("WinWaitDelay", 0)

Global $hButton_GUI, $nButton, $ContextMenu
Global $MenuItem1, $MenuItem2, $MenuItem3, $Exit_MenuItem
Global $aOld_ParentPos = -1, $hParent, $hOld_Parent

Global $sMain_Title = "[CLASS:Notepad]"

Run(@WindowsDir & "\Notepad.exe")
WinWait($sMain_Title)
$hParent = WinGetHandle($sMain_Title)

_ExternalButtonCreate_Proc()
AdlibEnable("_ExternalButtonFollow_Proc", 1)

While 1
    Sleep(100)
WEnd

Func _ExternalButtonCreate_Proc()
	$hButton_GUI = GUICreate("", 65, 18, -1, -1, $WS_POPUP, $WS_EX_TOPMOST+$WS_EX_TOOLWINDOW)
	$nButton = GUICtrlCreateButton("Button", 0, 0, 65, 18)
	GUICtrlSetOnEvent(-1, "_Button_Event")
	
	Local $DummyMenu = GUICtrlCreateDummy()
	$ContextMenu = GUICtrlCreateContextMenu($DummyMenu)
	$MenuItem1 = GUICtrlCreateMenuItem("Some Item1", $ContextMenu)
	$MenuItem2 = GUICtrlCreateMenuItem("Some Item2", $ContextMenu)
	$MenuItem3 = GUICtrlCreateMenuItem("Some Item3", $ContextMenu)
	GUICtrlCreateMenuItem("", $ContextMenu)
	$Exit_MenuItem = GUICtrlCreateMenuItem("Exit", $ContextMenu)
	GUICtrlSetOnEvent(-1, "_Exit")
	
	GUISetState(@SW_SHOW, $hButton_GUI)
EndFunc

Func _ExternalButtonFollow_Proc()
	If $hParent <> -1 And Not WinExists($hParent) Then
		GUISetState(@SW_HIDE, $hButton_GUI)
		$hParent = -1
	ElseIf $hParent = -1 And WinExists($sMain_Title) Then
		GUISetState(@SW_SHOW, $hButton_GUI)
		$hParent = WinGetHandle($sMain_Title)
	ElseIf $hParent = -1 Then
		Return
	EndIf
	
	$aParentPos = WinGetPos($hParent)
    $aParentClientSize = WinGetClientSize($hParent)
	
	If Not IsArray($aParentPos) Then Return
	
	If Not WinActive($hParent) And Not WinActive($hButton_GUI) Then
		$aParentPos[0] = -3200
		$aParentPos[1] = -3200
	EndIf
	
    If $aOld_ParentPos = -1 Or $aOld_ParentPos[0] <> $aParentPos[0] Or $aOld_ParentPos[1] <> $aParentPos[1] Or _
		$aOld_ParentPos[2] <> $aParentPos[2] Then
        
		$aOld_ParentPos = $aParentPos
		
        $iBorder_Size = ($aParentPos[2] - $aParentClientSize[0]) / 2
		
        $iX = ($aParentPos[0] + $aParentPos[2]) - 170
        $iY = $aParentPos[1] + $iBorder_Size
        
		If $aParentPos[2] < 170 Then $iX = $aParentPos[0] + $iBorder_Size
		
		WinMove($hButton_GUI, "", $iX, $iY)
    EndIf
EndFunc

Func _Button_Event()
	ConsoleWrite("Button clicked" & @CRLF)
	
	_GUICtrlMenu_Show($hButton_GUI, $ContextMenu, $nButton)
EndFunc

Func _GUICtrlMenu_Show($hWnd, $nContextID, $nContextControlID, $iMouse=0)
	Local $hMenu = GUICtrlGetHandle($nContextID)
    Local $iCtrlPos = ControlGetPos($hWnd, "", $nContextControlID)
	
	Local $iX = $iCtrlPos[0]
	Local $iY = $iCtrlPos[1] + $iCtrlPos[3]
	
	; Convert the client (GUI) coordinates to screen (desktop) coordinates
	;ClientToScreen
	Local $stPoint = DllStructCreate("int;int")
    
    DllStructSetData($stPoint, 1, $iX)
    DllStructSetData($stPoint, 2, $iY)

    DllCall("user32.dll", "int", "ClientToScreen", "hwnd", $hWnd, "ptr", DllStructGetPtr($stPoint))
    
    $iX = DllStructGetData($stPoint, 1)
    $iY = DllStructGetData($stPoint, 2)
	;ClientToScreen
	
	If $iMouse Then
		$iX = MouseGetPos(0)
		$iY = MouseGetPos(1)
	EndIf
	
	DllCall("user32.dll", "int", "TrackPopupMenuEx", "hwnd", $hMenu, "int", 0, "int", $iX, "int", $iY, "hwnd", $hWnd, "ptr", 0)
EndFunc

Func _Exit()
	Exit
EndFunc
Этот пример, вероятно, подходит мне, но не понятно, какие библиотеки нужно подключить, получаю ошибку на AdlibEnable("_ExternalButtonFollow_Proc", 1) в строке 18.
Люди!! Очень надо))
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
musicstashall

Предупреждение За нарушение общих правил (пункт В.2):
Старайтесь избегать “Over quoting” (преувеличенное цитирование) - цитируйте только необходимую часть сообщения, которая наилучшим образом подчеркнёт суть цитируемого.


С уважением, ваш Глобальный модератор.





Вы на дату последнего поста смотрели?! Создать свою тему не судьба?!
 
Верх