Что нового

Область для рисования

neobi

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

Описание:
Нужен скрипт который позволяет создавать область для рисования по типу паинта только в окне программы Autoit. Зарание спасибо за хоть какойто ответ.

Примечания:

Возможна даже полное соответсвие с Paint тоесть чтобы были прямоугольники и линиии как инструменты для рисования (карандаши и всё остальное необезательно)
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Можно встроить Paint в GUI окно и работать с ним. Вот пример:
Код:
#include <array.au3>
#include <WindowsConstants.au3>
#include <GuiConstantsEx.au3>
#include <WinAPIEx.au3>

Opt('WinTitleMatchMode',2)

$hForm = GUICreate('Test',600, 500,100,100,$WS_OVERLAPPEDWINDOW ,$WS_EX_CLIENTEDGE + $WS_EX_COMPOSITED)
GUISetBkColor(0xc0c0c0)
$ButTest1=GUICtrlCreateButton('Open AutoIt Path', 2, 2, 100, 25)
GUISetState(@SW_HIDE, $hForm)

$sFile= @SystemDir & '\mspaint.exe'
$h_Help=RunFile($sFile, "[CLASS:MSPaintApp]",  @SW_SHOW)
$h_Active=$h_Help
GUIRegisterMsg($WM_SIZE, "WM__SIZE")

While 1
	_WinAPI_UpdateWindow($hForm)
	_WinAPI_UpdateWindow($h_Active)
	ControlHide($h_Active, '', '[CLASS:msctls_statusbar32]')
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            ProcessClose('mspaint.exe')
            Exit
        Case $ButTest1
			$Dir = StringRegExpReplace(@AutoItExe, '(^.*)\\(?:.*)$', '\1')
			ShellExecute($Dir)
    EndSwitch
WEnd

Func RunFile($sRoot, $sTitle, $State=@SW_HIDE)
    ShellExecute($sRoot)
    WinWait ( $sTitle,'',1)
	GUISetState(@SW_SHOW, $hForm)
    $hRet=WinGetHandle ( $sTitle)
    _WinSetStyle($hRet,  $WS_POPUP, $WS_EX_TOPMOST + $WS_EX_COMPOSITED)
    _WinAPI_SetParent($hRet, $hForm)
    $aPos=WinGetPos($hForm)
    WinMove($hRet, '',0,30,$aPos[2]-10,$aPos[3]-63 )
    If $State=@SW_HIDE Then
        WinSetState($hRet, '', $State )
    ElseIf  $State=@SW_SHOW Then
        $h_Active=$hRet
        ConsoleWrite ("$h_Active = " & $h_Active & @LF)
    EndIf
    Return $hRet
EndFunc

Func _WinSetStyle($hWnd, $nStyle = -1, $nExStyle = 0)
    Local Const $GWL_STYLE = -16, $GWL_EXSTYLE = -20
    Local Const $SWP_NOMOVE = 0x2, $SWP_NOSIZE = 0x1, $SWP_SHOWWINDOW = 0x40, $SWP_NOZORDER = 0x4
    Local $iFlags = BitOR($SWP_SHOWWINDOW, $SWP_NOSIZE, $SWP_NOZORDER)

    If $nStyle = -1 Then
        $nStyle = BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU)
    EndIf
    $Pos = WinGetpos($hWnd)
    $x = $Pos[0]
    $y = $Pos[1]

    DllCall("User32.dll", "int", "SetWindowLong", "hwnd", $hWnd, "int", $GWL_STYLE, "int", $nStyle)
    DllCall("User32.dll", "int", "SetWindowLong", "hwnd", $hWnd, "int", $GWL_EXSTYLE, "int", $nExStyle)
    DllCall("User32.dll", "int", "SetWindowPos", "hwnd", $hWnd, "hwnd", 0, "int", $x + 1, "int", $y + 1 , "int", 0, "int", 0, "int", $iFlags)
EndFunc

Func WM__SIZE($hWnd, $Msg, $wParam, $lParam)
    Local $iW = BitAND($lParam, 0xFFFF)
    Local $iH = BitShift($lParam, 16)
    Switch $hWnd
        Case $hForm
            WinMove($h_Active, '',0,30,$iW,$iH-28)
			_WinAPI_UpdateWindow($h_Active)
    EndSwitch
    Return $GUI_RUNDEFMSG
EndFunc ;==>WM__SIZE
 
Автор
N

neobi

Новичок
Сообщения
25
Репутация
1
Как вариант можно использовать но токо видать у меня проблемы с прорисовкой когда начинаю чтолибо рисовать то всё моргает сереет и при закрытии ОШИБКА по обращению в памать от ПАинта. А можно чтото типа облати в которой можно просто рисовать имено средствами Autoit

Zaramot спасибо за оперативность
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
при закрытии ОШИБКА по обращению в памать от ПАинта
Исправил...

Вот ;)
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Misc.au3>
#include <ScreenCapture.au3>

Global $API_PREFIX = "API"
Global $Mode = 0, $Color = 0xff0000

$Form1 = GUICreate("Paint", 642, 450, -1, -1, $WS_TILEDWINDOW, $WS_EX_COMPOSITED)
$Pic1 = GUICtrlCreatePic("", -1, -2, 569, 453, $WS_BORDER)
GUICtrlSetState(-1, $GUI_DISABLE)
$Line = GUICtrlCreateButton("Линия", 576, 40, 59, 25)
$Dot = GUICtrlCreateButton("Точка", 576, 72, 59, 25)
$ColorB = GUICtrlCreateButton("Цвет", 576, 104, 59, 25)
$ColorLB = GUICtrlCreateLabel("", 576, 136, 60, 28)
GUICtrlSetBkColor(-1, $Color)
$Save = GUICtrlCreateButton("Сохранить", 576, 216, 59, 25)
$Graphic = GUICtrlCreateGraphic(0, 0, 569, 453)
GUICtrlSetGraphic($Graphic,$GUI_GR_COLOR, $Color)
GUICtrlSetBkColor(-1, 0xFFFFFF)
GUICtrlSetGraphic($Graphic, $GUI_GR_PENSIZE, 2)
GUISetState()

While 1
	$WP	= WinGetPos($Form1)
	ControlMove($Form1, '', $Line, $WP[2] - 75, 8)
	ControlMove($Form1, '', $Dot, $WP[2] - 75, 40)
	ControlMove($Form1, '', $ColorB, $WP[2] - 75, 72)
	ControlMove($Form1, '', $ColorLB, $WP[2] - 75, 104, 59, 25)
	ControlMove($Form1, '', $Save, $WP[2] - 75, 150)
	ControlMove($Form1, '', $Pic1, -1, -1, $WP[2] - 80, $WP[3] + 1)
	ControlMove($Form1, '', $Graphic, -1, -1, $WP[2] - 80, $WP[3] + 1)
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit
		Case $ColorB
			$NewColor = _ChooseColor (2, $Color, 2, $Form1)
			If Not @error Then
				$Color = $NewColor
				GUICtrlSetBkColor($ColorLB, $Color)
				GUICtrlSetGraphic($Graphic, $GUI_GR_COLOR, $Color)
			EndIf
		Case $Dot
			$Mode = 0
		Case $Line
			$Mode = 1
		Case $Save
			$SaveFile = FileSaveDialog('Save Image', '', 'JPEG Image Format(*.jpg)')
			_ScreenCapture_SetJPGQuality(100)
			_ScreenCapture_Capture($SaveFile & '.jpg', $WP[0] + 3, $WP[1] + 27, $WP[2] + 111, $WP[3] + 140, False)
	EndSwitch

	$Mouse = GUIGetCursorInfo()

    If $Mouse[2] = 1 AND $Mouse[4] = $Graphic Then
        If $Mode = 1 Then
            GUICtrlSetGraphic($Graphic,$GUI_GR_MOVE,$Mouse[0],$Mouse[1])
            While $Mouse[2] = 1
                $Mouse = GUIGetCursorInfo()
            WEnd
            GUICtrlSetGraphic($Graphic,$GUI_GR_LINE,$Mouse[0],$Mouse[1])
        ElseIf $Mode = 0 Then
            GUICtrlSetGraphic($Graphic,$GUI_GR_DOT,$Mouse[0],$Mouse[1])
        EndIf
        GUICtrlSetGraphic($Graphic,$GUI_GR_REFRESH)
    EndIf
WEnd

Func API_Drawline($x1,$y1,$x2,$y2) ;<=======
    GUICtrlSetGraphic($Graphic,$GUI_GR_MOVE,$x1,$y1)
    GUICtrlSetGraphic($Graphic,$GUI_GR_LINE,$x2,$y2)
    GUICtrlSetGraphic($Graphic,$GUI_GR_REFRESH)
    Return "Succesful operation"
EndFunc

Func API_Drawdot($x,$y) ;<=======
    GUICtrlSetGraphic($Graphic,$GUI_GR_DOT,$x,$y)
    GUICtrlSetGraphic($Graphic,$GUI_GR_REFRESH)
    Return "Succesful operation"
EndFunc

Func API() ;<=======
    $sIn = ConsoleRead(-1,True)
    If $sIn Then
        $sIn = ConsoleRead()
        $sSplit = StringSplit($sIn,"(,)",0)
        If $sSplit[0] >= 1 Then
            Local $sArray[$sSplit[0]-1]
            $sArray[0] = "CallArgArray"
            For $x = 2 to $sSplit[0]-1
                If StringLeft($sSplit[$x],1) == '"' AND StringRight($sSplit[$x],1) == '"' Then
                    $sSplit[$x] = String(StringTrimLeft(StringTrimRight($sSplit[$x],1),1))
                EndIf
                $sArray[$x-1] = $sSplit[$x]
            Next
            $sReturnData = Call($API_PREFIX&"_"&$sSplit[1],$sArray)
            ConsoleWrite($sReturnData)
        EndIf
    EndIf
EndFunc
 
Автор
N

neobi

Новичок
Сообщения
25
Репутация
1
О вот это уже Замечательно Спасибки. Квадратики я уже сам добавлю спасибо, И ещё вопросик можно ли потом будет узнать координаты этих элементов ?
 
Верх