Что нового

Отображение элементов без оболочки GUI

Viktor217

Осваивающий
Сообщения
233
Репутация
31
Вот простейший скрипт:
Код:
GUICreate("Window",200,55)
GUICtrlCreateButton("Button №1", 25, 15, 70)
GUICtrlCreateButton("Button №1", 105, 15, 70)
GUICtrlCreateLabel("Label №1", 38, 0)
GUISetState(@SW_SHOW)
While 1
	Sleep(99999999999999)
WEnd

Меня очень интересует, можно ли каким-либо образом сделать так чтобы кнопки(Надписи, поля) появлялись, а окно нет...
Вот так вот въобщем:
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
218
Re: Кнопки без окна

autoit.de/index.php?page=Thread&threadID=9231
Код:
#include <WindowsConstants.au3>
#include <WinAPI.au3>

Global $aButton[5]

$gui = GUICreate("Test Windows regions", 150, 150, @DesktopWidth-170, -1, $WS_POPUP, $WS_EX_TOPMOST)
$aButton[0] = GUICtrlCreateButton("Button 1", 0, 0, 150)
$aButton[1] = GUICtrlCreateButton("Button 2", 0, 30, 150)
$aButton[2] = GUICtrlCreateButton("Button 3", 0, 60, 150)
$aButton[3] = GUICtrlCreateButton("Button 4", 0, 90, 150)
$aButton[4] = GUICtrlCreateButton("Exit", 0, 120, 150)
GUISetState(@SW_SHOW)

$pos = WinGetPos($gui)
_GuiHole($gui, 0, 0, 150, 150)

While 1
    $msg = GUIGetMsg()
    Switch $msg
        Case $aButton[4]
            ExitLoop
        Case $aButton[0]
            MsgBox(0, '', 'Button1 geklickt')
        Case $aButton[1]
            MsgBox(0, '', 'Button2 geklickt')
        Case $aButton[2]
            MsgBox(0, '', 'Button3 geklickt')
        Case $aButton[3]
            MsgBox(0, '', 'Button4 geklickt')
    EndSwitch
WEnd

Func _GuiHole($h_win, $i_x, $i_y, $i_sizew, $i_sizeh)
    Local $outer_rgn, $inner_rgn, $combined_rgn
    $combined_rgn = _WinAPI_CreateRectRgn(0, 0, 0, 0)
    _WinAPI_DeleteObject($outer_rgn)
    _WinAPI_DeleteObject($inner_rgn)
    _AddCtrlRegion($combined_rgn, $aButton)
    _WinAPI_SetWindowRgn($h_win, $combined_rgn)
EndFunc   ;==>_GuiHole

Func _AddCtrlRegion($full_rgn, $ctrl_id)
    Local $ctrl_pos, $ctrl_rgn
    If IsArray($ctrl_id) Then
        For $i = 0 To UBound($ctrl_id) -1
            $ctrl_pos = ControlGetPos($gui, "", $ctrl_id[$i])
            $ctrl_rgn = _WinAPI_CreateRectRgn($ctrl_pos[0], $ctrl_pos[1], $ctrl_pos[0] + $ctrl_pos[2], $ctrl_pos[1] + $ctrl_pos[3])
            _WinAPI_CombineRgn($full_rgn, $full_rgn, $ctrl_rgn, $RGN_OR)
            _WinAPI_DeleteObject($ctrl_rgn)
        Next
    Else
        $ctrl_pos = ControlGetPos($gui, "", $ctrl_id)
        $ctrl_rgn = _WinAPI_CreateRectRgn($ctrl_pos[0], $ctrl_pos[1], $ctrl_pos[0] + $ctrl_pos[2], $ctrl_pos[1] + $ctrl_pos[3])
        _WinAPI_CombineRgn($full_rgn, $full_rgn, $ctrl_rgn, $RGN_OR)
        _WinAPI_DeleteObject($ctrl_rgn)
    EndIf
EndFunc   ;==>_AddCtrlRegion
 
Автор
V

Viktor217

Осваивающий
Сообщения
233
Репутация
31
Re: Кнопки без окна

Большое спасибо, сразу всё понял, завтра переделаю скриптик(=
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Re: Кнопки без окна

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Как правильно называть темы

[Кнопки без окна] это неприемлемое название темы, переименуйте тему иначе она будет закрыта.








темку бы переместить
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Re: Кнопки без окна

Это делается проще:

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

$Main_GUI = GUICreate("", 400, 400, -1, -1, $WS_POPUP, $WS_EX_TOPMOST + $WS_EX_LAYERED)
GUISetBkColor(0xFF0011)

GUICtrlCreateLabel("Label", 200, 130, 150)
GUICtrlSetFont(-1, 14, 800)
GUICtrlSetColor(-1, 0xFF0000)

$But1 = GUICtrlCreateButton(" Exit ", 100, 100, 80, 21)
$Info_Edit = GUICtrlCreateEdit("A few words to start off with", 80, 150, 300, 220)

GUISetState(@SW_SHOW, $Main_GUI)

_WinAPI_SetLayeredWindowAttributes($Main_GUI, 0xFF0011, 0, $LWA_COLORKEY)

While GUIGetMsg() <> $But1
WEnd


Или так, как я делал раньше:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

HotKeySet("{ESC}", "QuitApp")

$Main_GUI = GUICreate("", 400, 400, -1, -1, $WS_POPUP, $WS_EX_TOPMOST)

$But1 = GUICtrlCreateButton("Exit", 100, 100, 80, 21)
$Info_Edit = GUICtrlCreateEdit("A few words to start off with", 80, 150, 300, 220)

_GUISetControlsVisible($Main_GUI)
GUISetState(@SW_SHOW, $Main_GUI)

While GUIGetMsg() <> $But1
WEnd

Func QuitApp()
	Exit
EndFunc

Func _GUISetControlsVisible($hWnd)
	Local $aClassList, $aM_Mask, $aCtrlPos, $aMask
	
	;Set $WS_POPUP style part:
	Local Const $GWL_STYLE = -16
	Local Const $GWL_EXSTYLE = -20
	Local Const $SWP_NOMOVE = 0x2
	Local Const $SWP_NOSIZE = 0x1
	Local Const $SWP_SHOWWINDOW = 0x40
	Local Const $SWP_NOZORDER = 0x4
	
	Local $iFlags = BitOR($SWP_SHOWWINDOW, $SWP_NOSIZE, $SWP_NOMOVE, $SWP_NOZORDER)
	DllCall("User32.dll", "int", "SetWindowLong", "hwnd", $hWnd, "int", $GWL_STYLE, "int", $WS_POPUP)
	DllCall("User32.dll", "int", "SetWindowPos", "hwnd", $hWnd, "hwnd", 0, "int", 0, "int", 0, "int", 0, "int", 0, "int", $iFlags)
	;End Set $WS_POPUP style part
	
	$aClassList = StringSplit(_WinGetClassListEx($hWnd), @LF)
	$aM_Mask = DllCall("gdi32.dll", "long", "CreateRectRgn", "long", 0, "long", 0, "long", 0, "long", 0)
	
	For $i = 1 To UBound($aClassList) - 1
		$aCtrlPos = ControlGetPos($hWnd, '', $aClassList[$i])
		If Not IsArray($aCtrlPos) Then ContinueLoop
		
		$aMask = DllCall("gdi32.dll", "long", "CreateRectRgn", _
			"long", $aCtrlPos[0], _
			"long", $aCtrlPos[1], _
			"long", $aCtrlPos[0] + $aCtrlPos[2], _
			"long", $aCtrlPos[1] + $aCtrlPos[3])
		DllCall("gdi32.dll", "long", "CombineRgn", "long", $aM_Mask[0], "long", $aMask[0], "long", $aM_Mask[0], "int", 2)
	Next
	DllCall("user32.dll", "long", "SetWindowRgn", "hwnd", $hWnd, "long", $aM_Mask[0], "int", 1)
EndFunc

Func _WinGetClassListEx($sTitle)
	Local $sClassList = WinGetClassList($sTitle)
	Local $aClassList = StringSplit($sClassList, @LF)
	Local $sRetClassList = "", $sHold_List = "|"
	Local $aiInHold, $iInHold
	
	For $i = 1 To UBound($aClassList) - 1
		If $aClassList[$i] = "" Then ContinueLoop
		
		If StringRegExp($sHold_List, "\|" & $aClassList[$i] & "~(\d+)\|") Then
			$aiInHold = StringRegExp($sHold_List, ".*\|" & $aClassList[$i] & "~(\d+)\|.*", 1)
			$iInHold = Number($aiInHold[UBound($aiInHold)-1])
			
			If $iInHold = 0 Then $iInHold += 1
			
			$aClassList[$i] &= "~" & $iInHold + 1
			$sHold_List &= $aClassList[$i] & "|"
			
			$sRetClassList &= $aClassList[$i] & @LF
		Else
			$aClassList[$i] &= "~1"
			$sHold_List &= $aClassList[$i] & "|"
			$sRetClassList &= $aClassList[$i] & @LF
		EndIf
	Next
	
	Return StringReplace(StringStripWS($sRetClassList, 3), "~", "")
EndFunc
 
Автор
V

Viktor217

Осваивающий
Сообщения
233
Репутация
31
Re: Кнопки без окна

Kaster, закрывай, всё что хотел я узнал(=
Криатор, спасибо, попробую также первый вариант твоего скрипта, но в скрипте дверфа мне меньше работы нужно будет выполнять(=
 
Автор
V

Viktor217

Осваивающий
Сообщения
233
Репутация
31
Re: Кнопки без окна

А как к скрипту dwerf'а добавить горячую клавишу, которая развернёт окошко(А точнее отобразит кнопки)?
Пробывал так, но не получилось:
Код:
HotKeySet("{-}", "show")
Func show() ;Вызов окна
	GUISetState(@SW_RESTORE)
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Re: Кнопки без окна

Viktor217
Добавьте в скрипт dwerf`a
Код:
;...
HotKeySet("{-}", "show")

Global $aButton[5], $bVis = False
;...
Func show()
	$bVis = Not $bVis
	If $bVis Then
		GUISetState(@SW_HIDE)
	Else
		GUISetState(@SW_SHOW)
	EndIf
EndFunc   ;==>show
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Автор
V

Viktor217

Осваивающий
Сообщения
233
Репутация
31
Re: Кнопки без окна

Креатор, я и не говорил что там меньше работы выполнять придётся, я сказал что МНЕ меньше работы делать, по сути мне только добавить пару функций и заменить эти строчки:
Код:
MsgBox(0, '', 'Button1 geklickt')

На свои...

Форум очень даже нужен, я про тему...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403
Re: Кнопки без окна

Viktor217 [?]
Форум очень даже нужен, я про тему
Если нужен, то будь добр уважить модератора раздела который дал тебе предупреждение, потому что когда пишут «закрывайте тему я свой ответ получил», я понимаю это как «а мне пофиг на модератора и этот форум, я своё получил».
 
Автор
V

Viktor217

Осваивающий
Сообщения
233
Репутация
31
Re: Кнопки без окна

CreatoR сказал(а):
Viktor217 [?]
Форум очень даже нужен, я про тему
Если нужен, то будь добр уважить модератора раздела который дал тебе предупреждение, потому что когда пишут «закрывайте тему я свой ответ получил», я понимаю это как «а мне пофиг на модератора и этот форум, я своё получил».
Просто я уже привык что когда ответ получен тему закрывают, так что извиняюсь, я подразумевал другое...
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Re: Кнопки без окна

а я тут не модератор :blum:
даже не знаю, почему мое сообщение о предупреждении тут проскочило. отправлял по привычке
 
Автор
V

Viktor217

Осваивающий
Сообщения
233
Репутация
31
Re: Кнопки без окна

По-моему заголовок вполне осмысленный, не содержит тупых просьб о помощи и вопросов...
Да и других нормальных вариантов в голову не приходит
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8 473
Репутация
2 403

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
Автор
V

Viktor217

Осваивающий
Сообщения
233
Репутация
31
Переименовал(=
 
Автор
V

Viktor217

Осваивающий
Сообщения
233
Репутация
31
Kaster, поздравляю(=
 
Верх