Что нового

Как создать прямоугольник в окне поверх всего.

agikon

Знающий
Сообщения
789
Репутация
17
помогите пожалуйста создать в центре небольшой прямоугольник залитый синим цветом, и чтобы этот прямоугольник был поверх всех других обьектов.

вот окно
Код:
#include <Misc.au3>
#include <GUIConstantsEx.au3>


$GUI = GUICreate('Win', 400, 300)
GUISetState()

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

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
Re: Как создать прямоугольник в окне.

agikon
Код:
GUICreate('')
GUICtrlCreateLabel('', 40, 40, 150, 100)
GUICtrlSetBkColor(-1, 0x0000ff)
GUISetState()
Do
Until GUIGetMsg()=-3
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
AZJIO
спасибо, но это не проходит.

сори, уточник задачу.
надо чтобы этот прямоугольник был над другими обьектами.
от например есть уже прямоугольникбольшой, а над этим прямоуольником меньший прямоугольник.
то есть как прямоугольник сделать поверх всего?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
agikon,
Сделайте дочернее окно нужного цвета и делайте его видимым в нужный момент.
 

kasper_sky

Antivirus
Сообщения
116
Репутация
1
agikon [?]
от например есть уже прямоугольникбольшой, а над этим прямоуольником меньший прямоугольник.
то есть как прямоугольник сделать поверх всего?
Отрисовывать его после всех контролов(последним), или же после действия со всеми контролами использовать для него
Код:
GUICtrlSetState ( $control, $GUI_SHOW )
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
madmasles
окно это окно. то есть с заголовком и кнопками свертывания, закрытия.

а мне надо просто синий прямоугольник.
или я что-то не допонимаю?
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
agikon [?]
окно это окно. то есть с заголовком и кнопками свертывания, закрытия.
а мне надо просто синий прямоугольник.
А стили окна?
Код:
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

Global $fShow

$hMain = GUICreate('Main GUI', 600, 500)
GUISetBkColor(0xFF0000)
$nButton = GUICtrlCreateButton('button', 20, 470, 70, 20)
GUISetState(@SW_SHOW, $hMain)
$hChild = GUICreate('Child GUI', 300, 250, (600 - 300) / 2, (500 - 250) / 2, $WS_POPUP)
GUISetBkColor(0x0000FF)
_WinAPI_SetParent($hChild, $hMain)
While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nButton
			$fShow = Not $fShow
			If $fShow Then
				GUISetState(@SW_SHOWNOACTIVATE, $hChild)
			Else
				GUISetState(@SW_HIDE, $hChild)
			EndIf
	EndSwitch
WEnd
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Так ?:
Код:
GUICreate('')
;1 прямоугольник
GUICtrlCreateLabel('', 40, 40, 150, 100)
GUICtrlSetBkColor(-1, 0x0000ff)
;2 прямоугольник
GUICtrlCreateLabel('', 50, 50, 120, 130)
GUICtrlSetBkColor(-1, 0x00ff00)
;3 прямоугольник
GUICtrlCreateLabel('', 60, 60, 120, 100)
GUICtrlSetBkColor(-1, 0xff0000)
GUISetState()

Do
Until GUIGetMsg()=-3


PS За основу взят код AZJIO :smile:
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
madmasles
да спасибо вам, это полностью описывает то что мне надо, но ваш код не совсем выводит прямоугольник на передний план.

Zaramot
да но но требуется чтобы эти прямоугольники скрывались, а потом показывались.

извините что заморачиваю так.


вот, например почему синий прямоугольник не поверх кнопки?
Код:
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

Global $fShow

$hMain = GUICreate('Main GUI', 600, 500)
;GUISetBkColor(0xFF0000)
$nButton = GUICtrlCreateButton('button', 20, 470, 70, 20)
GUISetState(@SW_SHOW, $hMain)

$nButton_alarm = GUICtrlCreateButton('??', 320, 220, 100, 25)

$hChild = GUICreate('Child GUI', 300, 250, (600 - 300) / 2, (500 - 250) / 2, $WS_POPUP)
GUISetBkColor(0x0000FF)
_WinAPI_SetParent($hChild, $hMain)



While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nButton
            $fShow = Not $fShow
            If $fShow Then
                GUISetState(@SW_SHOWNOACTIVATE, $hChild)
            Else
                GUISetState(@SW_HIDE, $hChild)
            EndIf
    EndSwitch
WEnd
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
А если сделать так ?:
Код:
#include <GUIConstantsEx.au3>
#include <WinAPI.au3>
#include <WindowsConstants.au3>

Global $fShow

$hMain = GUICreate('Main GUI', 600, 500)
;GUISetBkColor(0xFF0000)
$nButton = GUICtrlCreateButton('button', 20, 470, 70, 20)
GUISetState(@SW_SHOW, $hMain)

$nButton_alarm = GUICtrlCreateButton('??', 320, 220, 100, 25)

$hChild = GUICreate('Child GUI', 300, 250, (600 - 300) / 2, (500 - 250) / 2, $WS_POPUP, $WS_EX_TOPMOST)
GUISetBkColor(0x0000FF)
_WinAPI_SetParent($hChild, $hMain)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            Exit
        Case $nButton
            $fShow = Not $fShow
            If $fShow Then
                GUISetState(@SW_SHOWNOACTIVATE, $hChild)
				ControlHide($hMain, '', $nButton_alarm) ;Добавлено
            Else
                GUISetState(@SW_HIDE, $hChild)
				ControlShow($hMain, '', $nButton_alarm) ;Добавлено
            EndIf
    EndSwitch
WEnd
или так:
Код:
#include <GUIConstantsEx.au3>

Global $Show

$Form1 = GUICreate("Form1", 633, 449, 192, 124)
$Button1 = GUICtrlCreateButton("Hello", 277, 189, 75, 25)
$Button2 = GUICtrlCreateButton("Show", 8, 416, 75, 25)
$Label1 = GUICtrlCreateLabel("", 24, 24, 580, 372)
GUICtrlSetBkColor(-1, 0x0000FF)
GUICtrlSetState(-1, $GUI_HIDE)
GUISetState()

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button2
			$Show = Not $Show
			If $Show Then
				GUICtrlSetState($Label1, $GUI_SHOW)
				GUICtrlSetState($Button1, $GUI_Hide)
				GUICtrlSetData($Button2, 'Hide')
			Else
				GUICtrlSetState($Label1, $GUI_HIDE)
				GUICtrlSetState($Button1, $GUI_SHOW)
				GUICtrlSetData($Button2, 'Show')
			EndIf
	EndSwitch
WEnd
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
agikon,
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StaticConstants.au3>

Global $fShow, $aBkColor[3] = [0x0000FF, 0xFF0000, 0x00FF00], $iCount, _
		$sText = 'agikon, так дочернее окно перекрывает другие элементы основного.'

$hMain = GUICreate('Main GUI', 600, 500)
GUICtrlCreateLabel($sText, 10, 240, 580, 20, $SS_CENTER)
GUICtrlSetFont(-1, 10, 600, 1, 'Comic Sans MS')
GUICtrlCreateButton('Test Button', 250, 200, 100, 30)
$nButton = GUICtrlCreateButton('Click', 20, 470, 70, 20)
GUISetState(@SW_SHOW, $hMain)
$hChild = GUICreate('Child GUI', 300, 250, (600 - 300) / 2, (500 - 250) / 2, $WS_POPUP, -1, $hMain)
GUIRegisterMsg($WM_MOVE, 'WM_MOVE')
_MoveWindow($hChild, $hMain, (600 - 300) / 2, (500 - 250) / 2)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $nButton
			$fShow = Not $fShow
			If $fShow Then
				GUISetBkColor($aBkColor[$iCount])
				GUISetState(@SW_SHOWNOACTIVATE, $hChild)
				$iCount += 1
				If $iCount = 3 Then $iCount = 0
			Else
				GUISetState(@SW_HIDE, $hChild)
			EndIf
	EndSwitch
WEnd

Func _MoveWindow($hWnd, $hParent = 0, $iX = Default, $iY = Default, $iW = -1, $iH = -1, $fClient = 1, $fResize = 0)
	;Yashied, http://autoit-script.ru/index.php/topic,1406.0.html
	Local $Area[4], $Wx[2], $Cx[2], $tRect, $pRect, $Pos, $Ret

	$Ret = DllCall('user32.dll', 'long', 'GetWindowLongW', 'hwnd', $hWnd, 'int', -16)
	If (@error) Or (BitAND($Ret[0], 0x21000000)) Then
		Return 0
	EndIf
	$Pos = WinGetPos($hWnd)
	If @error Then
		Return 0
	EndIf
	If $iW = -1 Then
		$iW = $Pos[2]
	EndIf
	If $iH = -1 Then
		$iH = $Pos[3]
	EndIf
	$tRect = DllStructCreate('int;int;int;int')
	$pRect = DllStructGetPtr($tRect)
	$Ret = DllCall('dwmapi.dll', 'uint', 'DwmGetWindowAttribute', 'hwnd', $hWnd, 'dword', 9, 'ptr', $pRect, 'dword', 16)
	If (Not @error) And (Not $Ret[0]) Then
		For $i = 0 To 1
			$Wx[$i] = DllStructGetData($tRect, $i + 3) - DllStructGetData($tRect, $i + 1) - $Pos[$i + 2]
		Next
	Else
		For $i = 0 To 1
			$Wx[$i] = 0
		Next
	EndIf
	$iW += $Wx[0]
	$iH += $Wx[1]
	$Ret = DllCall('user32.dll', 'int', 'SystemParametersInfoW', 'uint', 0x0030, 'uint', 0, 'ptr', $pRect, 'uint', 0)
	If (@error) Or (Not $Ret[0]) Then
		$Area[0] = 0
		$Area[1] = 0
		$Area[2] = @DesktopWidth
		$Area[3] = @DesktopHeight
	Else
		For $i = 0 To 3
			$Area[$i] = DllStructGetData($tRect, $i + 1)
		Next
	EndIf
	Do
		If $hParent Then
			$Ret = DllCall('user32.dll', 'long', 'GetWindowLongW', 'hwnd', $hParent, 'int', -16)
			If @error Then
				Return 0
			EndIf
			If Not BitAND($Ret[0], 0x20000000) Then
				If $fClient Then
					$Ret = DllCall('user32.dll', 'int', 'GetClientRect', 'hwnd', $hParent, 'ptr', $pRect)
					If (@error) Or (Not $Ret[0]) Then
						Return 0
					EndIf
					$Ret = DllCall('user32.dll', 'int', 'ClientToScreen', 'hwnd', $hParent, 'ptr', $pRect)
					If (@error) Or (Not $Ret[0]) Then
						Return 0
					EndIf
					If $iX = Default Then
						$iX = Int((DllStructGetData($tRect, 3) - $iW) / 2)
					EndIf
					If $iY = Default Then
						$iY = Int((DllStructGetData($tRect, 4) - $iH) / 2)
					EndIf
					$iX += DllStructGetData($tRect, 1)
					$iY += DllStructGetData($tRect, 2)
				Else
					$Pos = WinGetPos($hParent)
					If @error Then
						Return 0
					EndIf
					$Ret = DllCall('dwmapi.dll', 'uint', 'DwmGetWindowAttribute', 'hwnd', $hParent, 'dword', 9, 'ptr', $pRect, 'dword', 16)
					If (Not @error) And (Not $Ret[0]) Then
						For $i = 0 To 1
							$Cx[$i] = DllStructGetData($tRect, $i + 3) - DllStructGetData($tRect, $i + 1) - $Pos[$i + 2]
						Next
					Else
						For $i = 0 To 1
							$Cx[$i] = 0
						Next
					EndIf
					If $iX = Default Then
						$iX = Int(($Pos[2] + $Cx[0] - $iW) / 2)
					EndIf
					If $iY = Default Then
						$iY = Int(($Pos[3] + $Cx[1] - $iH) / 2)
					EndIf
					$iX += $Pos[0] - $Cx[0] / 2
					$iY += $Pos[1] - $Cx[1] / 2
				EndIf
				ExitLoop
			EndIf
		EndIf
		If $iX = Default Then
			$iX = Int(($Area[2] - $iW) / 2)
		EndIf
		If $iY = Default Then
			$iY = Int(($Area[3] - $iH) / 2)
		EndIf
		$iX += $Area[0]
		$iY += $Area[1]
	Until 1
	$iX += $Wx[0] / 2
	$iY += $Wx[1] / 2
	If ($fResize) And ($iW > $Area[2] - $Area[0]) Then
		$iW = $Area[2] - $Area[0] - $Wx[0]
	EndIf
	If ($fResize) And ($iH > $Area[3] - $Area[1]) Then
		$iH = $Area[3] - $Area[1] - $Wx[1]
	EndIf
	If $iX > $Area[2] - $iW Then
		$iX = $Area[2] - $iW + $Wx[0] / 2
	EndIf
	If $iX < $Area[0] Then
		$iX = $Area[0] + $Wx[0] / 2
	EndIf
	If $iY > $Area[3] - $iH Then
		$iY = $Area[3] - $iH + $Wx[1] / 2
	EndIf
	If $iY < $Area[1] Then
		$iY = $Area[1] + $Wx[1] / 2
	EndIf
	If WinMove($hWnd, '', $iX, $iY, $iW - $Wx[0], $iH - $Wx[1]) Then
		Return 0
	Else
		Return 1
	EndIf
EndFunc   ;==>_MoveWindow

Func WM_MOVE($hWnd, $iMsg, $wParam, $lParam)
	Local $a_Pos, $t_Area, $i_RightA, $i_BottomA
	Switch $hWnd
		Case $hMain
			_MoveWindow($hChild, $hMain, (600 - 300) / 2, (500 - 250) / 2)
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_MOVE
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
madmasles,
Zaramot
спасибо!

вот теперь точно то что надо.
ваш madmasles последний код и ваш Zaramot предпоследний код
бо в них нет ($Button1, $GUI_Hide). а картинка поверх сделана другим способом., то что я и хотел понять.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
agikon
Скрывай не нужные тебе элементы с помощью GUICtrlSetState. Сделай функции по количеству слоёв. Например первая функция скрывает всё и отображает квадрат, вторая функция скрывает всё и отображает комбо и чекбокс. По надобности вызывай нужную функию.
 
Автор
A

agikon

Знающий
Сообщения
789
Репутация
17
AZJIO
тут в том и вопрос чтобы не скрывать все элементы через $GUI_Hide, а сразу чтобы прямоугольник был поверх всех.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
agikon
Это одно и тоже, ведь ты собираешься скрыть элементы прямоугольником.

Кстати, в функции GUICtrlSetState есть параметр $GUI_ONTOP. В моём понимании это как раз переместить элемент выше всех, но у меня почему то это не работало, проверь, может у тебя получится.

OffTopic:
чтобы вставить ник в сообщение кликай по нику над аватарой
 
Верх