Что нового

Как нарисовать прямоугольник? Ярко-зелёный, прозрачный, полый внутри.

akoulev

Новичок
Сообщения
166
Репутация
2
Есть примерно такая конструкция:
Код:
$brom=PixelChecksum (140, 207, 157, 225)
;Тра-ля-ля
	If $brom= 2895136772 Then 
		MouseClick("left", 168, 213, 1);
	Else 
		MouseClick("left", 150, 213, 1); 
	EndIf

Страшно интересует, как должна выглядеть "Тра-ля-ля-строчка" :smile:, чтобы она рисовала пустотелый, ярко-зелёный прямоугольник, с прозрачными границами (регулирумой "по вкусу" толщины)? Координаты прямоугольника - те же, что и у PixelChecksum (140, 207, 157, 225).
Ай нид хелп, плиз!
 

madmasles

Модератор
Глобальный модератор
Сообщения
7 790
Репутация
2 319
Не совсем понял, что значит
akoulev [?]
чтобы она рисовала пустотелый, ярко-зелёный прямоугольник
Но похулиганить можно так: :smile:
Код:
#include <GUIConstantsEx.au3>

Opt("MouseCoordMode", 2)

$Form1 = GUICreate("Проба", 400, 300, -1, -1)
GUISetBkColor(0xFFFFCC)
$Label1 = GUICtrlCreateLabel("", 100, 30, 200, 0)
GUICtrlSetBkColor($Label1, 0x33FF00)
$Button1 = GUICtrlCreateButton("Поехали", 100, 250, 200, 30)
GUISetState(@SW_SHOW)

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $Button1
			GUICtrlSetState($Button1, $GUI_DISABLE)
			BlockInput(1)
			$pos = ControlGetPos("", "", $Label1)
			For $i = 1 To 200
				MouseMove($pos[0], $pos[1] + $i, 25)
				GUICtrlSetPos($Label1, $pos[0], $pos[1], $pos[2], $i)
			Next
			BlockInput(0)
	EndSwitch
WEnd



PS
А лучше всего посмотреть здесь: Как нарисовать графический элемент на стороннем приложении?, там уже готовое решение есть.
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Так только умею =)

Спасибо за пример дяденьке Yashied - Тут его пример

Код:
#Include <GDIPlus.au3>
#Include <GUIConstantsEx.au3>
#Include <WinAPIEx.au3>
#Include <WindowsConstants.au3>

_GDIPlus_Startup()

$hImage = _GDIPlus_ImageLoadFromFile(@ScriptDir & '\Image.png')
$hBitmap = _GDIPlus_BitmapCreateHBITMAPFromBitmap($hImage)
_GDIPlus_ImageDispose($hImage)

$hForm = GUICreate('', 440, 440, 200, 200, $WS_POPUPWINDOW, $WS_EX_LAYERED)
_WinAPI_UpdateLayeredWindowEx($hForm, $hBitmap, 127)
$hPopup = GUICreate('', 380, 380, 200 + 30, 200 + 30, $WS_POPUP, $WS_EX_LAYERED, $hForm)
GUISetBkColor(0xABABAB)
_WinAPI_SetLayeredWindowAttributes($hPopup, 0xABABAB, 0, $LWA_COLORKEY)

GUIRegisterMsg($WM_MOVE, 'WM_MOVE')
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')

GUISetState(@SW_SHOW, $hForm)
GUISetState(@SW_SHOW, $hPopup)

_WinAPI_UpdateLayeredWindowEx($hForm, $hBitmap, 255)

While 1
    $Msg = GUIGetMsg()
    Switch $Msg
        Case $GUI_EVENT_CLOSE
            ExitLoop

    EndSwitch
WEnd

_GDIPlus_Shutdown()

Func WM_MOVE($hWnd, $iMsg, $wParam, $lParam)
    Switch $hWnd
        Case $hForm
            WinMove($hPopup, '', BitAND($lParam, 0xFFFF) + 30, BitShift($lParam, 16) + 30)
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_MOVE

Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam)
    Switch $hWnd
        Case $hForm
            Switch $iMsg
                Case $WM_NCHITTEST
                    Return $HTCAPTION
            EndSwitch
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_NCHITTEST
 

Garrett

Модератор
Локальный модератор
Сообщения
3 999
Репутация
964
OffTopic:
FlatX007 [?]
Спасибо за пример дяденьке Yashied - Тут его пример
Странная ссылка FlatX007 если вы хотите дать ссылку на ответ, то нужно кликнуть на "Ответ#..." (находится в каждом посте под темой) и скопировать ссылку из открывшегося окна.
 

FlatX007

Tattoo!
Сообщения
197
Репутация
35
Чёрд =) я не ту ссылку скопировал :rofl:
 
Автор
A

akoulev

Новичок
Сообщения
166
Репутация
2
FlatX007 сказал(а):
Так только умею =)
Спасибо за пример и код. Вот что бывает, когда некорректно (ну, или -всего-то!- не до конца) задашь вопрос:
- К примеру, скажешь ты джинну, что тебе холодно и ты хочешь согреться. А джинн на тебя возьмет и дохнет пламенем! Согрелась? Согрелась! То, что при этом сгорела, вроде как не считается. (с) http://www.top4man.ru/society/lukjanenko/2675.php

Итак: мне мало нарисовать прямоугольник: надо, чтобы он ещё и исчезал через какое-то время (от долей секунды (моргнуть) до ... ну, порядка неск. минут): будучи заданной в коде; но ещё круто было бы, чтоб прямоугольник исчезал от клика на нём. И чтоб толщина границ прямоугольника могла меняться - это возможно?
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
akoulev [?]
Итак: мне мало нарисовать прямоугольник: надо, чтобы он ещё и исчезал через какое-то время (от долей секунды (моргнуть) до ... ну, порядка неск. минут): будучи заданной в коде; но ещё круто было бы, чтоб прямоугольник исчезал от клика на нём. И чтоб толщина границ прямоугольника могла меняться - это возможно?
Переделал свою рамку http://autoit-script.ru/index.php?topic=1895.0 под твои нужды, но все управление на горячих клавишах (Ctrl-PgUP/DOWN - толщина рамки, Ctrl-Space - дает исчезнуть) :smile: подойдет?
Код:
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#include <Constants.au3>
#include <WinAPIEx.au3>

$proj = 'Рамка'
$width = 10
$sTime = 2000

HotKeySet('^{PGUP}', '_borderSizePlus')
HotKeySet('^{PGDN}', '_borderSizeMinus')

HotKeySet('{LEFT}', '_moveLeft')
HotKeySet('{UP}', '_moveUp')
HotKeySet('{RIGHT}', '_moveRight')
HotKeySet("{DOWN}", '_moveDown')

HotKeySet('^{LEFT}', '_sizeWidthPlus')
HotKeySet('^{UP}', '_sizeHeightMinus')
HotKeySet('^{RIGHT}', '_sizeWidthMinus')
HotKeySet("^{DOWN}", '_sizeHeightPlus')

HotKeySet("^{SPACE}", '_hide')

Opt('GUICloseOnESC', 0)

#region - GUI Create
$hGUI = GUICreate($proj, 300, 300, -1, -1, $WS_POPUPWINDOW, $WS_EX_LAYERED + $WS_EX_TOPMOST)
GUISetBkColor(0x0000F1)
$labelMenu = GUICtrlCreateLabel('', 0, 0, 300, 300, -1, $GUI_WS_EX_PARENTDRAG)
GUICtrlSetBkColor($labelMenu, 0x0000F1)
Dim $label[4] = [GUICtrlCreateLabel('', 0, 0, $width, 300), GUICtrlCreateLabel('', 0, 0, 300, $width), GUICtrlCreateLabel('', 300 - $width, 0, $width, 300), GUICtrlCreateLabel('', 0, 300 - $width, 300, $width)]
GUICtrlSetResizing($label[0], $GUI_DOCKLEFT + $GUI_DOCKWIDTH)
GUICtrlSetResizing($label[1], $GUI_DOCKTOP + $GUI_DOCKHEIGHT)
GUICtrlSetResizing($label[2], $GUI_DOCKRIGHT + $GUI_DOCKWIDTH)
GUICtrlSetResizing($label[3], $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)
$colorOld = 0x00FF00

For $i = 0 To 3
	GUICtrlSetBkColor($label[$i], $colorOld)
	GUICtrlSetStyle($label[$i], -1, $GUI_WS_EX_PARENTDRAG)
Next
_WinAPI_SetLayeredWindowAttributes($hGUI, 0x0000F1, 0, $LWA_COLORKEY)

GUISetState()

$wincoord = WinGetPos($proj)
$labelcoord = ControlGetPos($proj, '', 'Static1')
$border = ($wincoord[2] - $labelcoord[2]) / 2
$hTitle = $wincoord[3] - $labelcoord[3] - $border

#endregion - GUI Create

While 1
	$msg = GUIGetMsg()
	Select
		Case $msg = -3
			Exit
	EndSelect
WEnd

Func _borderSizePlus()
	$width += 1
	If $width < 5 Then $width = 5
	If $width > 60 Then $width = 60
	$coord = WinGetPos($proj)
	GUICtrlSetPos($label[0], 0, 0, $width, $coord[3])
	GUICtrlSetPos($label[1], 0, 0, $coord[2], $width)
	GUICtrlSetPos($label[2], $coord[2] - 2 * $border - $width, 0, $width, $coord[3])
	GUICtrlSetPos($label[3], 0, $coord[3] - $hTitle - $border - $width, $coord[2], $width)
EndFunc   ;==>_borderSizePlus

Func _borderSizeMinus()
	$width -= 1
	If $width < 5 Then $width = 5
	If $width > 60 Then $width = 60
	$coord = WinGetPos($proj)
	GUICtrlSetPos($label[0], 0, 0, $width, $coord[3])
	GUICtrlSetPos($label[1], 0, 0, $coord[2], $width)
	GUICtrlSetPos($label[2], $coord[2] - 2 * $border - $width, 0, $width, $coord[3])
	GUICtrlSetPos($label[3], 0, $coord[3] - $hTitle - $border - $width, $coord[2], $width)
EndFunc   ;==>_borderSizeMinus

Func _hide($sTime = 2000)
	GUISetState(@SW_HIDE)
	Sleep($sTime)
	GUISetState(@SW_SHOW)
EndFunc   ;==>_hide

Func _moveLeft()
	$coord = WinGetPos($proj)
	WinMove($proj, '', $coord[0] - 1, $coord[1])
EndFunc   ;==>_moveLeft

Func _moveRight()
	$coord = WinGetPos($proj)
	WinMove($proj, '', $coord[0] + 1, $coord[1])
EndFunc   ;==>_moveRight

Func _moveUp()
	$coord = WinGetPos($proj)
	WinMove($proj, '', $coord[0], $coord[1] - 1)
EndFunc   ;==>_moveUp

Func _moveDown()
	$coord = WinGetPos($proj)
	WinMove($proj, '', $coord[0], $coord[1] + 1)
EndFunc   ;==>_moveDown

Func _sizeWidthMinus()
	$coord = WinGetPos($proj)
	WinMove($proj, '', $coord[0], $coord[1], $coord[2] + 1)
EndFunc   ;==>_sizeWidthMinus

Func _sizeWidthPlus()
	$coord = WinGetPos($proj)
	WinMove($proj, '', $coord[0], $coord[1], $coord[2] - 1)
EndFunc   ;==>_sizeWidthPlus

Func _sizeHeightMinus()
	$coord = WinGetPos($proj)
	WinMove($proj, '', $coord[0], $coord[1], $coord[2], $coord[3] - 1)
EndFunc   ;==>_sizeHeightMinus

Func _sizeHeightPlus()
	$coord = WinGetPos($proj)
	WinMove($proj, '', $coord[0], $coord[1], $coord[2], $coord[3] + 1)
EndFunc   ;==>_sizeHeightPlus

PS: WinAPIEx бери тут http://autoit-script.ru/index.php?topic=47.0
 
Автор
A

akoulev

Новичок
Сообщения
166
Репутация
2
Redline сказал(а):
Ух, круто, спасибо!!! Пожалуй, даже слишком круто. :smile: Под "меняющейся толщиной линии" я, собственно, имел в виду просто наличие такого места в программе, где стоял бы комментарий: "А вот здесь мы задаём толщину границы, с помощью переменной такой-то" - и всё! :laugh:
А вот что совсем меня "перепугало", так это появление этого прямоугольника вновь и вновь - Ты мог бы приделать выход, Но не совсем из скрипта ("Exit" я и сам могу вставить - сообразить бы вот только, куда :wacko: ) ; а переход к концу скрипта - чтобы его можно было вставить в мой код.
И ещё - по клику на прямоугольнике (как на самой рамке, так и внутри неё), он (зелёный прямоугольник) не исчезает - Ты мог бы это добавить? Pls.

PS: Не подумай, что я наглею - просто Ты знаешь этот код в идеале, а я только покорёжу всё, за многие-многие часы... И ещё раз, - спасибо!
PPS: Чуть не забыл: и двигаться ему (прямоугольнику) посредством курсоро-стрелок - без надобности: его место там, где ему координаты предписывают вспыхнуть, и только там. Уберёшь? Pls. (К тому моменту, глядишь, и я уже смогу в этом коде разобраться! :D )
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
Переделал, с использованием этого: http://autoit-script.ru/index.php?topic=326.0
Добавил подробные комментарии, изучай :D
Если рамку не нужно двигать с помощью мыши, то удали вот эти строчки:
Код:
GUICtrlSetStyle($label[$i], -1, $GUI_WS_EX_PARENTDRAG)
GUIRegisterMsg($WM_MOVE, 'WM_MOVE')
и саму функцию WM_MOVE
и замени
Код:
$center_label = GUICtrlCreateLabel('', 0, 0, 800, 600, -1,$GUI_WS_EX_PARENTDRAG)
на
Код:
$center_label = GUICtrlCreateLabel('', 0, 0, 800, 600)

Код:
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#include <Constants.au3>
#include <WinAPIEx.au3>

$proj = 'Рамка'
$width = 10 ; Толщина границы
$size = 300 ; Размер стороны рамки
$color = 0x00FF00 ; Цвет рамки
$time = 2000 ; Время через которое рамка исчезнет сама в миллисекундах

Dim $hGUI, $hForm

Opt('GUICloseOnESC', 0)

_createBorder($width, $size, $color, $time) ; в скобках можно перечислить все параметры

Func _createBorder($width = 10, $size = 300, $color = 0x00FF00, $time = 2000) ; если параметры не указаны - будут применены эти "дефолтные" значения
	$timer = TimerInit() ; запускаем таймер
	$hForm = GUICreate($proj, $size, $size, -1, -1, $WS_POPUP) ; GUI-родитель как фон для рамки - чтобы отрабатывал клик внутри нее
	$center_label = GUICtrlCreateLabel('', 0, 0, 800, 600, -1,$GUI_WS_EX_PARENTDRAG) ; элемент на котором срабатывает клик, и за который можно "таскать" окно
	WinSetTrans($hForm, '', 1) ; задаем прозрачность GUI ноль ставить нельзя

	$hGUI = GUICreate($proj, $size, $size, -1, -1, $WS_POPUP, $WS_EX_LAYERED + $WS_EX_TOPMOST, $hForm) ; GUI-"дочка" с элементами самой рамки
	GUISetBkColor(0x0000F1) ; задаем цвет для GUI, который в последствии станет прозрачным (цвет станет прозрачным)
	Dim $label[4] = [GUICtrlCreateLabel('', 0, 0, $width, $size), GUICtrlCreateLabel('', 0, 0, $size, $width), GUICtrlCreateLabel('', $size - $width, 0, $width, $size), GUICtrlCreateLabel('', 0, $size - $width, $size, $width)] ; создаем элементы рамки в виде массива - чтобы было удобнее к ним обращаться
	GUICtrlSetResizing($label[0], $GUI_DOCKLEFT + $GUI_DOCKWIDTH) ; задаем стророны к которым нужно "прилепить" элементы если будут меняться размеры окна
	GUICtrlSetResizing($label[1], $GUI_DOCKTOP + $GUI_DOCKHEIGHT)
	GUICtrlSetResizing($label[2], $GUI_DOCKRIGHT + $GUI_DOCKWIDTH)
	GUICtrlSetResizing($label[3], $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)
	For $i = 0 To 3 ; задаем цвет элементов рамки и свойство, за счет которого можно будет "таскать" окно за эти элементы
		GUICtrlSetBkColor($label[$i], $color)
		GUICtrlSetStyle($label[$i], -1, $GUI_WS_EX_PARENTDRAG)
	Next

	GUIRegisterMsg($WM_MOVE, 'WM_MOVE') ; регистрация события перемещения окна и вызов функции на это событие WM_MOVE (см. ниже)

	_WinAPI_SetLayeredWindowAttributes($hGUI, 0x0000F1, 0, $LWA_COLORKEY) ; делаем цвет 0x0000F1 прозрачным

	GUISetState(@SW_SHOW, $hForm) ; показ окон
	GUISetState(@SW_SHOW, $hGUI)
	While TimerDiff($timer) < $time ; цикл будет крутиться пока время на таймере меньше заданного в $time, по истечении его рамка исчезнет
		$msg = GUIGetMsg()
		Select
			Case $msg = $label[0] Or $msg = $label[1] Or $msg = $label[2] Or $msg = $label[3] Or $msg = $center_label ; клик по одному из пяти элементов вызовет выход из функции
				GUIDelete($hForm)
				Return 1
		EndSelect
		Sleep(25)
	WEnd
	GUIDelete($hForm)
EndFunc

Func WM_MOVE($hWnd, $iMsg, $wParam, $lParam) ; функция перемещает окна друг за другом, что бы они всегда находились вместе
    WinMove($hGUI, '', BitAND($lParam, 0xFFFF), BitShift($lParam, 16))
	WinMove($hForm, '', BitAND($lParam, 0xFFFF), BitShift($lParam, 16))
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_MOVE
 
Автор
A

akoulev

Новичок
Сообщения
166
Репутация
2
Здорово и спасибо - но вставить этот код в мой скрипт я так и не могу. :( Это код квадрата, находящегося в центре экрана; а мне бы вершины прямоугольника в этот код передать, как в изначальном примере. Мммм... а ещё границы непрозрачны, что, оказывается, тоже важно. ;) Впрочем, это я сейчас попробую сам сделать дома. Пока что я только так сделал:
Код:
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#include <Constants.au3>
#include <WinAPIEx.au3>

$proj = 'Рамка'
$width = 10 ; Толщина границы
$size = 300 ; Размер стороны рамки
$color = 0x00FF00 ; Цвет рамки
$time = 7000 ; Время через которое рамка исчезнет сама в миллисекундах

Dim $hGUI, $hForm

Opt('GUICloseOnESC', 0)

_createBorder($width, $size, $color, $time) ; в скобках можно перечислить все параметры

Func _createBorder($width = 10, $size = 300, $color = 0x00FF00, $time = 2000) ; если параметры не указаны - будут применены эти "дефолтные" значения
    $timer = TimerInit() ; запускаем таймер
    $hForm = GUICreate($proj, $size, $size, -1, -1, $WS_POPUP) ; GUI-родитель как фон для рамки - чтобы отрабатывал клик внутри нее
    ;$center_label = GUICtrlCreateLabel('', 0, 0, 800, 600, -1,$GUI_WS_EX_PARENTDRAG) ; элемент на котором срабатывает клик, и за который можно "таскать" окно
	;и замени Код: AutoIt [Выделить]
	;$center_label = GUICtrlCreateLabel('', 0, 0, 800, 600, -1,$GUI_WS_EX_PARENTDRAG)на Код: AutoIt [Выделить]
	;$center_label = GUICtrlCreateLabel('', 0, 0, 800, 600)
	$center_label = GUICtrlCreateLabel('', 0, 0, 800, 600)
    WinSetTrans($hForm, '', 1) ; задаем прозрачность GUI ноль ставить нельзя

    $hGUI = GUICreate($proj, $size, $size, -1, -1, $WS_POPUP, $WS_EX_LAYERED + $WS_EX_TOPMOST, $hForm) ; GUI-"дочка" с элементами самой рамки
    GUISetBkColor(0x0000F1) ; задаем цвет для GUI, который в последствии станет прозрачным (цвет станет прозрачным)
    Dim $label[4] = [GUICtrlCreateLabel('', 0, 0, $width, $size), GUICtrlCreateLabel('', 0, 0, $size, $width), GUICtrlCreateLabel('', $size - $width, 0, $width, $size), GUICtrlCreateLabel('', 0, $size - $width, $size, $width)] ; создаем элементы рамки в виде массива - чтобы было удобнее к ним обращаться
    GUICtrlSetResizing($label[0], $GUI_DOCKLEFT + $GUI_DOCKWIDTH) ; задаем стророны к которым нужно "прилепить" элементы если будут меняться размеры окна
    GUICtrlSetResizing($label[1], $GUI_DOCKTOP + $GUI_DOCKHEIGHT)
    GUICtrlSetResizing($label[2], $GUI_DOCKRIGHT + $GUI_DOCKWIDTH)
    GUICtrlSetResizing($label[3], $GUI_DOCKBOTTOM + $GUI_DOCKHEIGHT)
    For $i = 0 To 3 ; задаем цвет элементов рамки и свойство, за счет которого можно будет "таскать" окно за эти элементы
        GUICtrlSetBkColor($label[$i], $color)
    ;   GUICtrlSetStyle($label[$i], -1, $GUI_WS_EX_PARENTDRAG);Если рамку не нужно двигать с помощью мыши, то удали вот эти строчки:
    Next

    ;GUIRegisterMsg($WM_MOVE, 'WM_MOVE') ; регистрация события перемещения окна и вызов функции на это событие WM_MOVE (см. ниже); Если рамку не нужно двигать с помощью мыши, то удали вот эти строчки:

    _WinAPI_SetLayeredWindowAttributes($hGUI, 0x0000F1, 0, $LWA_COLORKEY) ; делаем цвет 0x0000F1 прозрачным

    GUISetState(@SW_SHOW, $hForm) ; показ окон
    GUISetState(@SW_SHOW, $hGUI)
    While TimerDiff($timer) < $time ; цикл будет крутиться пока время на таймере меньше заданного в $time, по истечении его рамка исчезнет
        $msg = GUIGetMsg()
        Select
            Case $msg = $label[0] Or $msg = $label[1] Or $msg = $label[2] Or $msg = $label[3] Or $msg = $center_label ; клик по одному из пяти элементов вызовет выход из функции
                GUIDelete($hForm)
                Return 1
        EndSelect
        Sleep(25)
    WEnd
    GUIDelete($hForm)
EndFunc

#cs ----------------------------------------------------------------------------
http://autoit-script.ru/index.php?topic=1939.msg14283#msg14283
Если рамку не нужно двигать с помощью мыши, то удали вот эти строчки:
Код: AutoIt [Выделить]
GUICtrlSetStyle($label[$i], -1, $GUI_WS_EX_PARENTDRAG)
GUIRegisterMsg($WM_MOVE, 'WM_MOVE') и саму функцию WM_MOVE
и замени Код: AutoIt [Выделить]
$center_label = GUICtrlCreateLabel('', 0, 0, 800, 600, -1,$GUI_WS_EX_PARENTDRAG)на Код: AutoIt [Выделить]
$center_label = GUICtrlCreateLabel('', 0, 0, 800, 600)
#ce ----------------------------------------------------------------------------

#cs ----------------------------------------------------------------------------
Func WM_MOVE($hWnd, $iMsg, $wParam, $lParam) ; функция перемещает окна друг за другом, что бы они всегда находились вместе
    WinMove($hGUI, '', BitAND($lParam, 0xFFFF), BitShift($lParam, 16))
    WinMove($hForm, '', BitAND($lParam, 0xFFFF), BitShift($lParam, 16))
    Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_MOVE
#ce ----------------------------------------------------------------------------
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
369
Вот переделал - можно задавать прозрачность границ и размер рамки, а так же параметр, указывающий на то как будет расположена рамка - вокруг точки или будет начинаться с этой точки.
Код:
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#include <Constants.au3>

$thickness = 25 ; Толщина границы
$w_size = 911 ; Ширина рамки
$h_size = 738 ; Высота рамки
$x_coord = 197 ; Горизонтальная координата верхнего левого угла рамки
$y_coord = 147 ; Вертикальная координата верхнего левого угла рамки
$inside = 0 ; Рамка будет вокруг заданной точки, если 0, то рамка будет начинаться из этой точки
$color = 0x00FF00 ; Цвет рамки
$trans = 127 ; Прозрачность рамки 1 - 255
$time = 5000 ; Время через которое рамка исчезнет в миллисекундах

Dim $hGUI, $hForm

Opt('GUICloseOnESC', 0)

_createBorder($thickness, $w_size, $h_size, $x_coord, $y_coord, $inside, $color, $trans, $time) ; в скобках можно перечислить все параметры

Func _createBorder($thickness = 10, $w_size = 300, $h_size = 300, $x_coord = 0, $y_coord = 0, $inside = 1, $color = 0xFF0000, $trans = 255, $time = 2000) ; если параметры не указаны - будут применены эти "дефолтные" значения
	$hTitle = 'Рамка'
	$timer = TimerInit() ; запускаем таймер
	If $inside = 1 Then
		$step = $thickness
	Else
		$step = 0
	EndIf
	$hForm = GUICreate($hTitle, $w_size + 2*$step, $h_size + 2*$step, $x_coord - $step, $y_coord - $step, $WS_POPUP, $WS_EX_TOPMOST) ; GUI-родитель как фон для рамки - чтобы отрабатывал клик внутри нее
	$center_label = GUICtrlCreateLabel('', 0, 0, $w_size + 2*$step, $h_size + 2*$step) ; элемент на котором срабатывает клик
	WinSetTrans($hForm, '', 1) ; задаем максимальную прозрачность главного GUI

	$hGUI_left = GUICreate($hTitle, $thickness, $h_size + 2*$step - $thickness, $x_coord - $step, $y_coord - $step, $WS_POPUP, $WS_EX_TOPMOST, $hForm)
	$hGUI_top = GUICreate($hTitle, $w_size + 2*$step - $thickness, $thickness, $x_coord + $thickness - $step, $y_coord - $step, $WS_POPUP, $WS_EX_TOPMOST, $hForm)
	$hGUI_right = GUICreate($hTitle, $thickness, $h_size + 2*$step - $thickness, $x_coord + $w_size - $thickness + $step, $y_coord + $thickness - $step, $WS_POPUP, $WS_EX_TOPMOST, $hForm)
	$hGUI_bottom = GUICreate($hTitle, $w_size + 2*$step - $thickness, $thickness, $x_coord - $step, $y_coord + $h_size - $thickness + $step, $WS_POPUP, $WS_EX_TOPMOST, $hForm)
	GUISetBkColor($color, $hGUI_left) ; задаем цвет рамки
	GUISetBkColor($color, $hGUI_top)
	GUISetBkColor($color, $hGUI_right)
	GUISetBkColor($color, $hGUI_bottom)

	WinSetTrans($hGUI_left, '', $trans) ; задаем прозрачность рамки
	WinSetTrans($hGUI_top, '', $trans)
	WinSetTrans($hGUI_right, '', $trans)
	WinSetTrans($hGUI_bottom, '', $trans)
	GUISetState(@SW_SHOW, $hForm) ; показ окон
	GUISetState(@SW_SHOW, $hGUI_left)
	GUISetState(@SW_SHOW, $hGUI_top)
	GUISetState(@SW_SHOW, $hGUI_right)
	GUISetState(@SW_SHOW, $hGUI_bottom)
	While TimerDiff($timer) < $time ; цикл будет крутиться пока время на таймере меньше заданного в $time, по истечении его рамка исчезнет
		$msg = GUIGetMsg()
		Select
			Case $msg = $GUI_EVENT_PRIMARYDOWN ; клик по одному из пяти GUI вызовет выход из функции
				GUIDelete($hForm)
				GUIDelete($hGUI_left)
				GUIDelete($hGUI_top)
				GUIDelete($hGUI_right)
				GUIDelete($hGUI_bottom)
				Return 1
		EndSelect
		Sleep(25)
	WEnd
	GUIDelete($hForm)
	GUIDelete($hGUI_left)
	GUIDelete($hGUI_top)
	GUIDelete($hGUI_right)
	GUIDelete($hGUI_bottom)
EndFunc
 

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Можно и так...

Код:
#Include <GDIPlus.au3>
run('C:\WINDOWS\system32\notepad.exe')
WinWait('[class:Notepad]')
$hwnd=WinGetHandle('[class:Notepad]')

_Area(10,10,200,100,$hwnd)

func _Area($iLeft, $iTop, $iRght, $iBottom,$par)
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($par)
$hPen = _GDIPlus_PenCreate(0x5500ff00, 3);0x55-Прозрачность, 3 толщина

Local 	$aPoints[5][2]
	$aPoints[0][0] = 4
    $aPoints[1][0] = $iLeft
    $aPoints[1][1] = $iTop
    $aPoints[2][0] = $iRght
    $aPoints[2][1] = $iTop
    $aPoints[3][0] = $iRght
    $aPoints[3][1] = $iBottom
    $aPoints[4][0] = $iLeft
    $aPoints[4][1] = $iBottom

_GDIPlus_GraphicsDrawPolygon ($hGraphic, $aPoints,$hPen)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_PenDispose($hPen)
_GDIPlus_Shutdown()
sleep(2500)
_WinAPI_RedrawWindow ($par)
EndFunc
 
Автор
A

akoulev

Новичок
Сообщения
166
Репутация
2
r35p3ct сказал(а):
Спасибо! Поиграл Твоим кодом, вот в таком ключе:
Код:
#Include <GDIPlus.au3>
run('C:\WINDOWS\system32\notepad.exe')
WinWait('[class:Notepad]')
$hwnd=WinGetHandle('[class:Notepad]')

$Text=  "222222222222222222222222222222222222"  & @CR & "33333333333333333333333333333333333" _
& @CR & "4444444444444444444444444444444444"  & @CR & "555555555555555555555555555555555" _ 
& @CR & "66666666666666666666666666666666" & @CR & "7777777777777777777777777777777" _ 
& @CR & "888888888888888888888888888888" & @CR & "99999999999999999999999999999" _ 
& @CR & "0000000000000000000000000000" & @CR 
Send ($Text)
_Area(10,10,200,100,$hwnd); Вызов функции "_Area()"- без кавычек
;Send ("{Enter}")
Send ($Text)
Send ("{F10}"); F10
Send ("{Enter}")
Send ("{Up}")
Send ("{Enter}")
Send ("Н")

func _Area($iLeft, $iTop, $iRght, $iBottom,$par)
_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($par)
$hPen = _GDIPlus_PenCreate(0x5500ff00, 3); 0x55-Прозрачность, 3 толщина

Local   $aPoints[5][2]
    $aPoints[0][0] = 4
    $aPoints[1][0] = $iLeft
    $aPoints[1][1] = $iTop
    $aPoints[2][0] = $iRght
    $aPoints[2][1] = $iTop
    $aPoints[3][0] = $iRght
    $aPoints[3][1] = $iBottom
    $aPoints[4][0] = $iLeft
    $aPoints[4][1] = $iBottom

_GDIPlus_GraphicsDrawPolygon ($hGraphic, $aPoints,$hPen)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_PenDispose($hPen)
_GDIPlus_Shutdown()
Send ($Text)
sleep(3333)
_WinAPI_RedrawWindow ($par)
EndFunc
Как нетрудно заметить, у этого кода большие проблемы:
1) C исчезновением прямоугольника по клику: этого просто нет.
2) Если печатать текст не из скрипта, а вручную - сперва исчезает одна (верхняя) сторона прямоугольника; а после Enter-а - досрочно исчезает весь прямоугольник.
Но, в любом разе - ещё раз спасибо!


Добавлено:
Сообщение автоматически объединено:

Redline сказал(а):
Вот переделал - ...
Спасибо! Тему не закрываю только потому, что хочу опубликовать тот код, что уже непосредственно войдёт в мой "боевой" скрипт: вот только сейчас "прикручу" переход от прямоугольника, задаваемого верхней левой и нижней правой вершинами - к прямоугольнику, задаваемому стартовой точкой+шириной+высотой. Ну, и ещё пара мелких идеек, из серии "автоматизирования автоматизации". :smile: .
 
Верх