Что нового

Нарисовать прямоугольник в окне программы и заштриховать\закрасить его.

SurikenTSD

Новичок
Сообщения
67
Репутация
1
Версия AutoIt: 3.

Описание: Есть окно программы. При запуске скрипта на расстоянии 410 пикселей по оси X (относительно координат клиентской области окна) необходимо провести вертикальную линию (красного цвета) из точки 0 по оси y и до самого низа окна программы. Полученный прямоугольник с координатами 0,0 - 410,[максимальная координата по оси y]:
Вариант 1: закрасить красным полупрозрачным фоном.
Вариант 2: заштриховать красными линиями по диагонали с шагом в 20 пикселей.
Сам даже близко не подозреваю, какими методами можно этого добиться..
Заранее благодарю за помощь.

Примечания:
 

InnI

AutoIT Гуру
Сообщения
4 505
Репутация
1 225
Я не художник, а только учусь :-[
Вот на примере калькулятора по варианту 1.
Код:
#include <GDIPlus.au3>

$X = 100 ; у вас 410

$pid = Run("calc.exe") ; это ваша программа
$hWnd = WinWait("[class:CalcFrame]") ; здесь ваше окно
$aSize = WinGetClientSize($hWnd)

_GDIPlus_Startup()
$hGraphic = _GDIPlus_GraphicsCreateFromHWND($hWnd)
$hPen = _GDIPlus_PenCreate(0xFFFF0000, 2)
_GDIPlus_GraphicsDrawLine($hGraphic, $X, 0, $X, $aSize[1], $hPen)
$hBrush = _GDIPlus_BrushCreateSolid(0x64FF0000)
_GDIPlus_GraphicsFillRect($hGraphic, 0, 0, $X, $aSize[1], $hBrush)

Do
  Sleep(300)
Until ProcessExists($pid) = 0 ; выход при завершении программы

_GDIPlus_PenDispose($hPen)
_GDIPlus_BrushDispose($hBrush)
_GDIPlus_GraphicsDispose($hGraphic)
_GDIPlus_ShutDown()
 
Автор
S

SurikenTSD

Новичок
Сообщения
67
Репутация
1
То ничего не закрашивает, то вот такое чучелко выдает (после нескольких перезапусков скрипта):



:smile:) Но все равно спасибо, на основе этого скрипта попробую завтра поразбираться, а сейчас спать пора.
 

DarWiM

Продвинутый
Сообщения
527
Репутация
90
А как сделать то же самое, но поверх объектов окна, дабы при обновлении элементов цвета не терялись?
 

InnI

AutoIT Гуру
Сообщения
4 505
Репутация
1 225
Вариант со штриховкой.
Код:
#include <APIConstants.au3>
#include <WinAPIEx.au3>
HotKeySet("{ESC}", "Quit")

$X = 100
$Exit = False

If Not WinExists("[class:CalcFrame]") Then Run("calc.exe")
$hWnd = WinWait("[class:CalcFrame]")

$hDC = _WinAPI_GetDC($hWnd)
_WinAPI_SetBkMode($hDC, $TRANSPARENT)
$hBrush = _WinAPI_CreateBrushIndirect($BS_HATCHED, 0xFF0000, $HS_DIAGCROSS)
$hOldBrush = _WinAPI_SelectObject($hDC, $hBrush)
$hPen = _WinAPI_CreatePen($PS_NULL, 1, 0x0000FF)
$hOldPen = _WinAPI_SelectObject($hDC, $hPen)
_WinAPI_DeleteObject($hPen)

Do
  If Not WinExists($hWnd) Then Exit
  $aSize = WinGetClientSize($hWnd)
  $hPen = _WinAPI_CreatePen($PS_NULL, 1, 0x0000FF)
  $h_Pen = _WinAPI_SelectObject($hDC, $hPen)
  _WinAPI_DeleteObject($h_Pen)
  $tRECT = _WinAPI_CreateRect(0, 0, $X, $aSize[1])
  _WinAPI_Rectangle($hDC, $tRECT)
  $hPen = _WinAPI_CreatePen($PS_SOLID, 2, 0x0000FF)
  $h_Pen = _WinAPI_SelectObject($hDC, $hPen)
  _WinAPI_DeleteObject($h_Pen)
  _WinAPI_MoveTo($hDC, $X, 0)
  _WinAPI_LineTo($hDC, $X, $aSize[1])
  Sleep(10)
Until $Exit

$hBrush = _WinAPI_SelectObject($hDC, $hOldBrush)
_WinAPI_DeleteObject($hBrush)
$h_Pen = _WinAPI_SelectObject($hDC, $hOldPen)
_WinAPI_DeleteObject($h_Pen)
_WinAPI_ReleaseDC($hWnd, $hDC)
_WinAPI_InvalidateRect($hWnd)

Func Quit()
  $Exit = True
EndFunc
 
Автор
S

SurikenTSD

Новичок
Сообщения
67
Репутация
1
Нигде не могу найти, где прочитать о _WinAPI_CreateBrushIndirect и про ее синтаксис, может кто подскажет? А то не разобравшись не охота вставлять в свой скрипт этот кусок кода - медвежья услуга, не больше получается.
 

InnI

AutoIT Гуру
Сообщения
4 505
Репутация
1 225
SurikenTSD [?]
где прочитать о _WinAPI_CreateBrushIndirect и про ее синтаксис
Во-первых, в самой справке по WinAPIEx (WinAPIEx.chm).
Во-вторых, в этой справке дана ссылка на поиск по сайту MSDN (один из результатов http://msdn.microsoft.com/en-us/library/windows/desktop/dd183487(v=vs.85).aspx)
В-третьих, не забываем про глобальные поисковые системы.
OffTopic:
не разобравшись не охота вставлять в свой скрипт этот кусок кода
Это, конечно, похвально. Но главное - вовремя остановиться. Иначе можно и до машинных кодов дойти :smile:
 
Автор
S

SurikenTSD

Новичок
Сообщения
67
Репутация
1
Да я в поиск вводил название самой функции...) Спасибо. И еще вопросец, эта закраска нужна мне для браузера. чтобы полностью его покрасить (ну, ту определенную зону).
Но в соответствии вышепредоставленным кодом получается только вкладки красить и панель управления... (



Ниже эта бяка почему-то не опускается.
Попробовал так же на portable firefox - то же самое.
 

InnI

AutoIT Гуру
Сообщения
4 505
Репутация
1 225
Тогда так
Код:
#include <APIConstants.au3>
#include <WinAPIEx.au3>
HotKeySet("{ESC}", "Quit")

$X = 100
$Exit = False

If Not WinExists("[class:CalcFrame]") Then Run("calc.exe")
$hWnd = WinWait("[class:CalcFrame]")

$hBrush = _WinAPI_CreateBrushIndirect($BS_HATCHED, 0xFF0000, $HS_DIAGCROSS)
$hPenB = _WinAPI_CreatePen($PS_NULL, 1, 0x0000FF)
$hPenL = _WinAPI_CreatePen($PS_SOLID, 2, 0x0000FF)

Do
  If Not WinExists($hWnd) Then Exit
  $aSize = WinGetPos($hWnd)
  $tRECT = _WinAPI_CreateRect(0, 0, $X, $aSize[3])
  $hDC = _WinAPI_GetWindowDC($hWnd)
  _WinAPI_SetBkMode($hDC, $TRANSPARENT)
  $h_Brush = _WinAPI_SelectObject($hDC, $hBrush)
  $h_Pen = _WinAPI_SelectObject($hDC, $hPenB)
  _WinAPI_Rectangle($hDC, $tRECT)
  _WinAPI_SelectObject($hDC, $hPenL)
  _WinAPI_MoveTo($hDC, $X, 0)
  _WinAPI_LineTo($hDC, $X, $aSize[3])
  _WinAPI_SelectObject($hDC, $h_Brush)
  _WinAPI_SelectObject($hDC, $h_Pen)
  _WinAPI_ReleaseDC($hWnd, $hDC)
  Sleep(10)
Until $Exit

_WinAPI_DeleteObject($hBrush)
_WinAPI_DeleteObject($hPenB)
_WinAPI_DeleteObject($hPenL)
_WinAPI_InvalidateRect(0)

Func Quit()
  $Exit = True
EndFunc
 
Автор
S

SurikenTSD

Новичок
Сообщения
67
Репутация
1
Спасибо..)
Но теперь новый минус.. :( Очень сильно мерцает в том месте, где заканчиваются вкладки и закладки у браузера. Похлеще джедайского меча в момент соприкосновения с другим джедайским мечом...
 
Автор
S

SurikenTSD

Новичок
Сообщения
67
Репутация
1
Если увеличить задержку - не мерцает уже, а мигает (исчезает, появляется).
Обратил внимание, что только в окне с флеш игрой такое, в остальных вкладках все идеально.
Спасибо большое за помощь.
 

InnI

AutoIT Гуру
Сообщения
4 505
Репутация
1 225
SurikenTSD [?]
какими методами можно этого добиться
Вот ещё вариант - наложить своё окно поверх чужого.
Код:
#include <WindowsConstants.au3>
#include <WinAPI.au3>

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

$X = 100
$Exit = False

If Not WinExists("[class:CalcFrame]") Then Run("calc.exe")
$hWnd = WinWait("[class:CalcFrame]")
WinActivate($hWnd)
$aPos = WinGetPos($hWnd)

$hGUI = GUICreate('', $X, $aPos[3], $aPos[0], $aPos[1], $WS_POPUP, $WS_EX_LAYERED)
GUISetBkColor(0xFF0000)
GUISetState()
_WinAPI_SetLayeredWindowAttributes($hGUI, 0, 92, $LWA_ALPHA)

Do
  If Not WinExists($hWnd) Then Exit
  $aPos = WinGetPos($hWnd)
  WinMove($hGUI, "", $aPos[0], $aPos[1], $X, $aPos[3])
  $iState = WinGetState($hWnd)
  If BitAND($iState, 8) Then
    WinSetOnTop($hGUI, "", 1)
  Else
    WinSetOnTop($hGUI, "", 0)
  EndIf
Until $Exit

Func Quit()
  $Exit = True
EndFunc
 
Верх