Что нового

Рисуем точку в окне.

Arei

Скриптер
Сообщения
938
Репутация
115
Подскажите как с помощью _GDIPlus и WinAPIEx как можно нарисовать точку в нужных мне координатах моего скрипта. Заранее спасибо.
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Все примере есть в справке по UDF. Например:

Код:
#include <GuiConstantsEx.au3>
#include <GDIPlus.au3>

Opt('MustDeclareVars', 1)

_Main()

Func _Main()
	Local $hGUI, $hGraphic, $hPen

	; Create GUI
	$hGUI = GUICreate("GDI+", 400, 300)
	GUISetState()
	
	; Draw line
	_GDIPlus_Startup ()
	$hGraphic = _GDIPlus_GraphicsCreateFromHWND ($hGUI)
	$hPen = _GDIPlus_PenCreate ()
	_GDIPlus_GraphicsDrawLine ($hGraphic, 10, 150, 11, 150, $hPen)

	; Loop until user exits
	Do
	Until GUIGetMsg() = $GUI_EVENT_CLOSE

	; Clean up resources
	_GDIPlus_PenDispose ($hPen)
	_GDIPlus_GraphicsDispose ($hGraphic)
	_GDIPlus_Shutdown ()

EndFunc   ;==>_Main
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Это отличный пример, но вот только одно но скажите как мне эту точку рисовать по движению мышки в окне.
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Т.е. за мышкой по ее траектории?

1. Определить координаты мышки.
2. Определить координаты и размер окна.
3. Проверить - не выходит ли мышка за окно.
4. Если мышка в окне, то расчитать ее координаты относительно окна.
5. В расчитанных координатах нарисовать точку.
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Если честно мне нудно для того;Я написал с "помощью"и не только скрипт.Он получает видео с вебкамеры и отслеживает где изменился цвет пикселя, мне нужно когда он изменился то менять его цвет например на зелёный.
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Arei [?]
Если честно мне нудно для того;Я написал с "помощью"и не только скрипт.Он получает видео с вебкамеры и отслеживает где изменился цвет пикселя, мне нужно когда он изменился то менять его цвет например на зелёный.
Тяжеловато понимать смысл написанного.

Ну если есть картинка, и есть данные о изменившемся пиксиле.
То в чем проблема?
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
нет работать надо с видео.Вот в чём проблема.
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Встроиться в чужой видео поток? По мойму, это оооооооочень и очень проблематично.
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
т.е чужой?Он работает в моём скрипте.
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Имею ввиду, что рисовать хоть что то внутри видео потока, это не так просто.
А слоем сверху, это гараздо реальней. например над видео дочерное прозрачное окно и в нем рисовать.
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Мне главное что бы рисовать и что бы смотрелось как будто там, но способ поверх это отлично, только как его сделать я незнаю
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Пытаюсь добавить видео, но выдаёт ошибку.
Код:
$WM_CAP_START = 0x400
$WM_CAP_UNICODE_START = $WM_CAP_START +100
$WM_CAP_PAL_SAVEA = $WM_CAP_START + 81
$WM_CAP_PAL_SAVEW = $WM_CAP_UNICODE_START + 81
$WM_CAP_UNICODE_END = $WM_CAP_PAL_SAVEW
$WM_CAP_ABORT = $WM_CAP_START + 69
$WM_CAP_DLG_VIDEOCOMPRESSION = $WM_CAP_START + 46
$WM_CAP_DLG_VIDEODISPLAY = $WM_CAP_START + 43
$WM_CAP_DLG_VIDEOFORMAT = $WM_CAP_START + 41
$WM_CAP_DLG_VIDEOSOURCE = $WM_CAP_START + 42
$WM_CAP_DRIVER_CONNECT = $WM_CAP_START + 10
$WM_CAP_DRIVER_DISCONNECT = $WM_CAP_START + 11
$WM_CAP_DRIVER_GET_CAPS = $WM_CAP_START + 14
$WM_CAP_DRIVER_GET_NAMEA = $WM_CAP_START + 12
$WM_CAP_DRIVER_GET_NAMEW = $WM_CAP_UNICODE_START + 12
$WM_CAP_DRIVER_GET_VERSIONA = $WM_CAP_START + 13
$WM_CAP_DRIVER_GET_VERSIONW = $WM_CAP_UNICODE_START + 13
$WM_CAP_EDIT_COPY = $WM_CAP_START + 30
$WM_CAP_END = $WM_CAP_UNICODE_END
$WM_CAP_FILE_ALLOCATE = $WM_CAP_START + 22
$WM_CAP_FILE_GET_CAPTURE_FILEA = $WM_CAP_START + 21
$WM_CAP_FILE_GET_CAPTURE_FILEW = $WM_CAP_UNICODE_START + 21
$WM_CAP_FILE_SAVEASA = $WM_CAP_START + 23
$WM_CAP_FILE_SAVEASW = $WM_CAP_UNICODE_START + 23
$WM_CAP_FILE_SAVEDIBA = $WM_CAP_START + 25
$WM_CAP_FILE_SAVEDIBW = $WM_CAP_UNICODE_START + 25
$WM_CAP_FILE_SET_CAPTURE_FILEA = $WM_CAP_START + 20
$WM_CAP_FILE_SET_CAPTURE_FILEW = $WM_CAP_UNICODE_START + 20
$WM_CAP_FILE_SET_INFOCHUNK = $WM_CAP_START + 24
$WM_CAP_GET_AUDIOFORMAT = $WM_CAP_START + 36
$WM_CAP_GET_CAPSTREAMPTR = $WM_CAP_START + 1
$WM_CAP_GET_MCI_DEVICEA = $WM_CAP_START + 67
$WM_CAP_GET_MCI_DEVICEW = $WM_CAP_UNICODE_START + 67
$WM_CAP_GET_SEQUENCE_SETUP = $WM_CAP_START + 65
$WM_CAP_GET_STATUS = $WM_CAP_START + 54
$WM_CAP_GET_USER_DATA = $WM_CAP_START + 8
$WM_CAP_GET_VIDEOFORMAT = $WM_CAP_START + 44
$WM_CAP_GRAB_FRAME = $WM_CAP_START + 60
$WM_CAP_GRAB_FRAME_NOSTOP = $WM_CAP_START + 61
$WM_CAP_PAL_AUTOCREATE = $WM_CAP_START + 83
$WM_CAP_PAL_MANUALCREATE = $WM_CAP_START + 84
$WM_CAP_PAL_OPENA = $WM_CAP_START + 80
$WM_CAP_PAL_OPENW = $WM_CAP_UNICODE_START + 80
$WM_CAP_PAL_PASTE = $WM_CAP_START + 82
$WM_CAP_SEQUENCE = $WM_CAP_START + 62
$WM_CAP_SEQUENCE_NOFILE = $WM_CAP_START + 63
$WM_CAP_SET_AUDIOFORMAT = $WM_CAP_START + 35
$WM_CAP_SET_CALLBACK_CAPCONTROL = $WM_CAP_START + 85
$WM_CAP_SET_CALLBACK_ERRORA = $WM_CAP_START + 2
$WM_CAP_SET_CALLBACK_ERRORW = $WM_CAP_UNICODE_START + 2
$WM_CAP_SET_CALLBACK_FRAME = $WM_CAP_START + 5
$WM_CAP_SET_CALLBACK_STATUSA = $WM_CAP_START + 3
$WM_CAP_SET_CALLBACK_STATUSW = $WM_CAP_UNICODE_START + 3
$WM_CAP_SET_CALLBACK_VIDEOSTREAM = $WM_CAP_START + 6
$WM_CAP_SET_CALLBACK_WAVESTREAM = $WM_CAP_START + 7
$WM_CAP_SET_CALLBACK_YIELD = $WM_CAP_START + 4
$WM_CAP_SET_MCI_DEVICEA = $WM_CAP_START + 66
$WM_CAP_SET_MCI_DEVICEW = $WM_CAP_UNICODE_START + 66
$WM_CAP_SET_OVERLAY = $WM_CAP_START + 51
$WM_CAP_SET_PREVIEW = $WM_CAP_START + 50
$WM_CAP_SET_PREVIEWRATE = $WM_CAP_START + 52
$WM_CAP_SET_SCALE = $WM_CAP_START + 53
$WM_CAP_SET_SCROLL = $WM_CAP_START + 55
$WM_CAP_SET_SEQUENCE_SETUP = $WM_CAP_START + 64
$WM_CAP_SET_USER_DATA = $WM_CAP_START + 9
$WM_CAP_SET_VIDEOFORMAT = $WM_CAP_START + 45
$WM_CAP_SINGLE_FRAME = $WM_CAP_START + 72
$WM_CAP_SINGLE_FRAME_CLOSE = $WM_CAP_START + 71
$WM_CAP_SINGLE_FRAME_OPEN = $WM_CAP_START + 70
$WM_CAP_STOP = $WM_CAP_START + 68


#region Include
#include <GUIConstants.au3>
#include <GDIPlus.au3>
#include <WindowsConstants.au3>
#include <GUIConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <StructureConstants.au3>
#include <GUIScrollBars.au3>
#include <ScrollBarConstants.au3>
#include <ScreenCapture.au3>
#endregion

#region Opt
    Opt('GUIOnEventMode',       1)
    Opt('MustDeclareVars',      1)
	
#endregion

#region Pro
    OnAutoItExitRegister('_ProExit_Action')
    HotKeySet('{ESC}', '_ProExit')
#endregion

#region Global
    Global  $hWinMain, $hWinChild
#endregion

#region Главное окно (в нем будет рисунок)
    $hWinMain   = GUICreate('Main win', 380, 180, -1, -1, $WS_OVERLAPPEDWINDOW)
        GUISetOnEvent($GUI_EVENT_CLOSE, '_ProExit')
#endregion

#region Видео окно
  

 
$avi = DllOpen("avicap32.dll")
$user = DllOpen("user32.dll")
$Main = GUICreate("Camera",250,230, 1689,778)

GUISetState()

$cap1 = DllCall($avi, "int", "capCreateCaptureWindow", "str", "cap", "int", BitOR($WS_CHILD,$WS_VISIBLE), "int", 15, "int", 10, "int", 200, "int", 200, "hwnd", $Main, "int", 1)

DllCall($user, "int", "SendMessage", "hWnd", $cap1[0], "int", $WM_CAP_DRIVER_CONNECT, "int", 0, "int", 0)
DllCall($user, "int", "SendMessage", "hWnd", $cap1[0], "int", $WM_CAP_SET_SCALE, "int", 1, "int", 1)
DllCall($user, "int", "SendMessage", "hWnd", $cap1[0], "int", $WM_CAP_SET_OVERLAY, "int", 1, "int", 1)
DllCall($user, "int", "SendMessage", "hWnd", $cap1[0], "int", $WM_CAP_SET_PREVIEW, "int", 1, "int", 1)
DllCall($user, "int", "SendMessage", "hWnd", $cap1[0], "int", $WM_CAP_SET_PREVIEWRATE, "int", 1, "int", 1)
GUISetState(@SW_SHOW)
While 1
	$msg = GUIGetMsg()
    If $msg = $GUI_EVENT_CLOSE Then
      DllClose($user)
        Exit
    EndIf
    
  
Wend

#endregion

#region Start
    GUISetState(@SW_SHOW, $hWinMain)
    GUISetState(@SW_SHOW, $hWinChild)
#endregion

#region Рисование
    _DrawPoint($hWinMain, 40, 40, 2,    '00d119')
    _DrawPoint($hWinMain, 58, 64, 8,    'ff0000', 85)
    _DrawPoint($hWinMain, 97, 84, 16,   'fffc00', 70)
#endregion

#region Sleep...
While 1
    Sleep(10)
WEnd

Func _ProExit()
    Exit
EndFunc

Func _ProExit_Action()
;~ Код, который должен выполняться каждый раз при закрытии скрипта. Даже, если скрипт закрыт не через функцию _ProExit.
EndFunc
#endregion

;~ $hWin    - окно в котором рисовать
;~ $iX      - коррдината Х
;~ $iY      - коррдината Y
;~ $iWidth  - толщина точки
;~ $sRGB    - цвет в формате RRGGGBB
;~ $sAlpha  - прозрачность в процентах от 0 до 100
Func _DrawPoint($hWin, $iX, $iY, $iWidth=2, $sRGB='000000', $sAlpha='97')
    Local $hGraphic, $hPen

    ; Draw a polygon
    _GDIPlus_Startup()
    $hGraphic   = _GDIPlus_GraphicsCreateFromHWND($hWin)
    $hPen       = _GDIPlus_PenCreate('0x' & Hex((255*$sAlpha)/100, 2) & $sRGB, $iWidth)

    _GDIPlus_GraphicsDrawLine ($hGraphic, $iX, $iY, $iX+$iWidth, $iY, $hPen)

    ; Clean up resources
    _GDIPlus_PenDispose($hPen)
    _GDIPlus_GraphicsDispose($hGraphic)
    _GDIPlus_Shutdown()
EndFunc
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
А вот про видео это уже другая тема. В этой был разбор про "рисование точки в окне".
Советую начать новую тему по "Как вставить видео с свой GUI"...и т.п.
 

IIuOHeR

Новичок
Сообщения
1
Репутация
0
А можете подсказать какой функцией удалить уже нарисованную точку.?? (Или как научить нарисованную точку перемещаться)
 

`p r o x y

«Улыбайтесь, господа!»
Команда форума
Глобальный модератор
Сообщения
596
Репутация
157
Как с помощью GDI+ не знаю.
Можно попробовать GUICtrlCreateGraphic. Там создаются GUI объекты, которые и двигать можно.
 

urrya

Новичок
Сообщения
159
Репутация
1
`p r o x y
Здравствуйте.
Пример Ваш, рисует отрезок, но не точку!
В Autoit вообще возможно нарисовать именно один пиксель?
Я конечно могу наложить один отрезок с цветом фона на нарисованный в 2 пикселя отрезок, но это не то что требуется. К примеру у меня есть 200 разноцветных пикселей, как мне эти пиксели нарисовать по своим координатам?
Уважаемые знатоки Autoit, покажите пожалуйста хороший пример рисования ТОЛЬКО ОДНОГО пикселя по заданным координатам.
:scratch:

P.s. Как то в одной теме тут на форуме, уважаемый гуру, писал что с помощью языка программирования, Autoit, можно сделать 99% всего что можно сделать на ЭВМ.
;)
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
urrya [?]
В Autoit вообще возможно нарисовать именно один пиксель?
Можно. Также не возбраняется почитывать справку по Autoit ;)
Код:
#include <GUIConstantsEx.au3>
#include <GDIPlus.au3>

$hGUI = GUICreate("Form1", 400, 300)
GUISetBkColor(0xFFFFFF)
GUISetState(@SW_SHOW)

_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hGUI)
_GDIPlus_GraphicsFillRect($hGraphic, 10, 10, 1, 1)
_GDIPlus_GraphicsFillRect($hGraphic, 200, 50, 1, 1)
_GDIPlus_GraphicsFillRect($hGraphic, 100, 100, 1, 1)
_GDIPlus_GraphicsFillRect($hGraphic, 100, 200, 1, 1)
_GDIPlus_GraphicsFillRect($hGraphic, 150, 10, 1, 1)
_GDIPlus_GraphicsFillRect($hGraphic, 100, 80, 1, 1)
_GDIPlus_GraphicsFillRect($hGraphic, 190, 140, 10, 10)

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_Shutdown()
 

madmasles

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

Global $hGui, $nLbl

$hGui = GUICreate('Test', 200, 200)
GUISetBkColor(0xFFFFFF)
$nLbl = GUICtrlCreateLabel('', Random(10, 190, 1), Random(10, 190, 1), 5, 5); 1 x 1 у меня не видно
GUICtrlSetBkColor(-1, 0x000000)
GUISetState()
HotKeySet('0', '_RandomMove');0 - click

Do
Until GUIGetMsg() = $GUI_EVENT_CLOSE

Func _RandomMove()
	ControlMove($hGui, '', $nLbl, Random(10, 190, 1), Random(10, 190, 1))
EndFunc   ;==>_RandomMove
 

urrya

Новичок
Сообщения
159
Репутация
1
Garrett

Огромное спасибо!
Справку читаю, вероятно просто не очень внимательно.
P.s. Хотя даже великий Гугл не дал ответа на эту тему.
;)
Но где же разноцветность (задать цвет КАЖДОМУ пикселю)?


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

madmasles
Прошу прощения, в Вашем примере очень всё нравится, но как нарисовать ОДИН пиксель?
:smile:



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

madmasles

есть две строки пикселей по 100 px на каждую,
есть ли возможность их отображения ?
к тому же это надо делать поочерёдно ещё.
:smile:
 
Верх