Что нового

[Окна, Диалоги] _WinAPI_CreatePen и _WinAPI_DrawLine пропадает результат

wehr

Новичок
Сообщения
7
Репутация
0
Вообще столкнулся с проблемой. Нужно в окне клиента нарисовать линии красного цвета. Линии рисуются, но живут они не более 1 секунды. Задержку sleep, после рисования _WinAPI_DrawLine ставить бесполезно, линии все равно пропадают.Вопрос, как сделать так, чтобы линии после рисования _WinAPI_DrawLine жили подольше.




Код:
func grafic($x,$y,$object)
   local $s=0,$d=0
local $bluhWnd = WinWaitActive("Blue", "", 5)
local $hDC = _WinAPI_GetWindowDC($bluhWnd) ; DC всего экрана (рабочего стола)
Local $pos = WinGetPos($bluhWnd) ; Возвращает размер окна (Не размер клиентской области, которая указывается в GUICreate)
Local  $width = $pos[2]
Local  $height = $pos[3]
local $rgn = _WinAPI_CreateRectRgn(0, 0, $width, $height)
_WinAPI_SetWindowRgn($hDC, $rgn)
Local  $object2 = _GDIPlus_BitmapCreateFromHBITMAP ($object)
Local $objectX = _GDIPlus_ImageGetWidth ($object2)
local $objectY = _GDIPlus_ImageGetHeight ($object2)
local $hPen = _WinAPI_CreatePen($PS_SOLID, 1, 0xFFFF0000)
local $obj_orig = _WinAPI_SelectObject($hDC, $hPen)
;MsgBox(0, "X и Y равны:", $objectX)
If $objectX = 1 Then
$d = Ceiling($objectY/2)
$s=1
EndIf
If $objectY = 1 Then
$s = Ceiling($objectX/2)
$d=1
EndIf
Select
case $s=1
 _WinAPI_DrawLine($hDC, $x, $y+$d, $x, $y-$d)
 case $d=1
	_WinAPI_DrawLine($hDC, $x+$s, $y, $x-$s, $y )
 EndSelect
 Sleep(2000)
 ;_WinAPI_RedrawWindow(_WinAPI_GetDesktopWindow(), 0, 0, $RDW_INVALIDATE + $RDW_ALLCHILDREN)
 _WinAPI_SelectObject($hDC, $obj_orig)
    _WinAPI_DeleteObject($hPen)
    _WinAPI_ReleaseDC(0, $hDC)

  EndFunc
 

InnI

AutoIT Гуру
Сообщения
4,950
Репутация
1,445
wehr [?]
Линии рисуются, но живут они не более 1 секунды
Это происходит потому, что чужое окно ничего не знает о ваших линиях и обновляет свой DC только известной ему информацией. Поэтому нужно рисовать постоянно - либо в бесконечном цикле, либо по таймеру.

Как вариант, можно на чужое окно наложить собственное прозрачное окно и на нём рисовать. Но, в этом случае, нужно будет отслеживать положение, размеры и состояние чужого окна и синхронизировать со своим. И ещё данный подход может не работать в полноэкранных режимах 3D.
 
Верх