Решил попробовать рисование на скриншоте линий, фигур, стрелок.
EnableExplicit
Declare CaptureActiveWindow()
; Загружаем кодеры
UseJPEGImageDecoder()
UseJPEG2000ImageDecoder()
UsePNGImageDecoder()
UsePNGImageEncoder()
#Image0 = 0
#Image1 = 1
#Image2 = 2
#Window0 = 0
#Menu0 = 0
Enumeration
	#mSave
	#mCapture
	#mToClipboard
EndEnumeration
Enumeration
	#Canvas0
	#Combo
	#ChB
	#btnColor
	#btnCapture
	#btnToClipboard
	#btnV
EndEnumeration
Define LineWidth = 2, imgH, imgW, cY, cX
Define bitPointDown = 0
Define bitPointUp = 0
Define hImage
Define hImage1
Define hImage2
Define hDC_tmp
Define hDC
Define hCanvas
Define obj
Define Mode = 0
Define LineH, LineW
Define File$
Define Color = $2A04FF, tmp
; Define *Buffer
Define point1.Point
Define point2.Point
point1\x = 0
point1\y = 0
; загружаем рисунок
; LoadImage(#Image0, "C:\PureBasic\Source\file.png")
CaptureActiveWindow()
GetClipboardImage(#Image0)
imgH = ImageHeight(#Image0)
imgW = ImageWidth(#Image0)
hImage = ImageID(#Image0)
If OpenWindow(#Window0, 0, 0, imgW, imgH+30, "Рисование", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	CanvasGadget(#Canvas0, 0, 30, imgW, imgH)
	hCanvas = GadgetID(#Canvas0)
	ComboBoxGadget(#Combo, 10, 3, 120, 21)
	AddGadgetItem(#Combo, -1, "Линия")
	AddGadgetItem(#Combo, -1, "Прямоугольник")
	AddGadgetItem(#Combo, -1, "Элипс")
	AddGadgetItem(#Combo, -1, "Обрезать")
	SetGadgetState(#Combo, 0)
	CheckBoxGadget(#ChB, 140, 4, 80, 21, "Заполнить")
	; 	ButtonGadget(#btnColor, 220, 2, 26, 26, "")
	CanvasGadget(#btnColor, 220, 2, 26, 26, #PB_Canvas_Buttons)
	If StartDrawing(CanvasOutput(#btnColor))
    Box(0, 0, 26, 26, Color)
    StopDrawing()
	EndIf
	ButtonGadget(#btnV, 250, 2, 24, 24, Chr($25BC)) ; "v"
	;--> Menu
	If CreatePopupMenu(#Menu0) ; Создаёт всплывающее меню
    MenuItem(#mSave, "Сохранить")
    MenuItem(#mCapture, "Из буфера")
    MenuItem(#mToClipboard, "В буфер")
    ;     MenuBar()
	EndIf
	SetGadgetAttribute(#Canvas0, #PB_Canvas_Image, hImage)
	; 	hImage1 = GetGadgetAttribute(#Canvas0, #PB_Canvas_Image)
	hDC = GetWindowDC_(hCanvas)
	Repeat
    Select WaitWindowEvent()
    	Case #PB_Event_Gadget
        Select EventGadget()
        	Case #Canvas0
            Select EventType()
            	Case #PB_EventType_LeftButtonDown
                cX = GetGadgetAttribute(#Canvas0, #PB_Canvas_MouseX)
                cY = GetGadgetAttribute(#Canvas0, #PB_Canvas_MouseY)
                bitPointDown = 1
                point1\x = cX
                point1\y = cY
                hDC_tmp = CreateCompatibleDC_(hDC)
                hImage = CreateCompatibleBitmap_(hDC, imgW, imgH)
                obj=SelectObject_(hDC_tmp,hImage)
                BitBlt_(hDC_tmp, 0, 0, imgW, imgH, hDC, 0, 0, #SRCCOPY)
            	Case #PB_EventType_LeftButtonUp
                bitPointDown = 0
;                 bitPointUp = 1
                If Mode = 3
                	imgW = cX - point1\x
                	imgH = cY - point1\y
                	If GrabImage(#Image0, #Image2, point1\x, point1\y, imgW, imgH)
                    hImage2 = StartDrawing(ImageOutput(#Image2))
                    BitBlt_(hDC, point1\x, point1\y, imgW, imgH, hImage2, 0, 0, #SRCCOPY)
;                     BitBlt_(hImage2, point1\x, point1\y, imgW, imgH, hDC, 0, 0, #SRCCOPY)
                	    StopDrawing()
                    hImage = ImageID(#Image2)
                    ResizeGadget(#Canvas0, #PB_Ignore, #PB_Ignore, imgW, imgH)
                    ResizeWindow(#Window0, #PB_Ignore, #PB_Ignore, imgW, imgH+30)
                    SetGadgetAttribute(#Canvas0, #PB_Canvas_Image, hImage)
;                     FreeImage(#Image2)
                    SetGadgetState(#Combo, 0)
                    Mode = 0
                    If CreateImage(#Image0, imgW, imgH)
                    	hImage2 = StartDrawing(ImageOutput(#Image0))
                    	BitBlt_(hImage2, 0, 0, imgW, imgH, hDC, 0, 0, #SRCCOPY)
                        StopDrawing()
                        FreeImage(#Image2)
                    EndIf
                	EndIf
                EndIf
                DeleteObject_(hImage)
                DeleteObject_(obj)
                DeleteDC_(hDC_tmp)
            	Case #PB_EventType_MouseMove
                If bitPointDown
                	cX = GetGadgetAttribute(#Canvas0, #PB_Canvas_MouseX)
                	cY = GetGadgetAttribute(#Canvas0, #PB_Canvas_MouseY)
                	;             	hImage2 = StartDrawing(CanvasOutput(#Canvas0))
                	StartDrawing(CanvasOutput(#Canvas0))
                	If GetGadgetState(#ChB) = #PB_Checkbox_Checked And Mode And Mode < 3
                    DrawingMode(#PB_2DDrawing_AlphaBlend)
                	Else
                    DrawingMode(#PB_2DDrawing_Outlined)
                	EndIf
                	DrawImage(hImage, 0, 0)
                	Select Mode
                    Case 0
                    	LineXY(point1\x, point1\y, cX, cY, Color)
                    Case 1
                    	Box(point1\x, point1\y, cX - point1\x, cY - point1\y, Color | $44000000)
                    Case 2
                    	Ellipse(point1\x, point1\y, Abs(cX - point1\x), cY - point1\y, Color | $44000000)
                    Case 3
                    	Box(point1\x, point1\y, cX - point1\x, cY - point1\y, Color | $44000000)
                	EndSelect
                	StopDrawing()
                EndIf
            EndSelect
        	Case #btnV
            DisplayPopupMenu(#Menu0, WindowID(#Window0))  ; покажем всплывающее Меню
        	Case #btnColor
            Select EventType()
            	Case #PB_EventType_LeftClick
                tmp = ColorRequester()
                If tmp > -1
                	Color = tmp
                	If StartDrawing(CanvasOutput(#btnColor))
                    Box(0, 0, 26, 26, Color)
                    StopDrawing()
                	EndIf
                EndIf
            EndSelect
        	Case #Combo
            Mode = GetGadgetState(#Combo)
        EndSelect
    	Case #PB_Event_Menu        ; кликнут элемент всплывающего Меню
        Select EventMenu()	   ; получим кликнутый элемент Меню...
        	Case #mSave
            File$ = SaveFileRequester("Сохранение", "скрин.png", "Изображение|*.png;*.jpg;*.gif", 0)
            If File$ And CreateImage(#Image2, imgW, imgH)
            	hImage2 = StartDrawing(ImageOutput(#Image2))
            	BitBlt_(hImage2, 0, 0, imgW, imgH, hDC, 0, 0, #SRCCOPY)
                StopDrawing()
                SetClipboardImage(#Image2)
            	SaveImage(#Image2, File$) ; Сохранение
                FreeImage(#Image2)
            EndIf
        	Case #mCapture
            If GetClipboardImage(#Image0) ; если в буфере действительно изображение, то
            	imgH = ImageHeight(#Image0)
            	imgW = ImageWidth(#Image0)
            	hImage = ImageID(#Image0)
            	ResizeGadget(#Canvas0, #PB_Ignore, #PB_Ignore, imgW, imgH)
            	ResizeWindow(#Window0, #PB_Ignore, #PB_Ignore, imgW, imgH+30)
            	SetGadgetAttribute(#Canvas0, #PB_Canvas_Image, hImage)
            Else
            	MessageRequester("", "В буфере нет изображения")
            EndIf
        	Case #mToClipboard
            If CreateImage(#Image2, imgW, imgH)
            	hImage2 = StartDrawing(ImageOutput(#Image2))
            	BitBlt_(hImage2, 0, 0, imgW, imgH, hDC, 0, 0, #SRCCOPY)
                StopDrawing()
                SetClipboardImage(#Image2)
                FreeImage(#Image2)
            EndIf
        EndSelect
    	Case #PB_Event_CloseWindow
        ReleaseDC_(WindowID(#Window0),hDC)
        FreeImage(#PB_All)
        CloseWindow(0)
        End
    EndSelect
	ForEver
EndIf
Procedure CaptureActiveWindow() ; функция из код-архива, но испорчена для нужного результата
	Protected Handle
	Protected hDC
	Protected RECT.RECT
	Protected hPrinterDC
	;   Handle = GetForegroundWindow_()
	Handle = GetDesktopWindow_() ; получим рабочий стол вместа окна, так как с компилятора ничего не получить
	hDC = GetWindowDC_(Handle)
	GetWindowRect_(Handle,@RECT.RECT)
	With RECT
    \right-\left - 400 ; добавил - 400, чтобы не на весь экран было окно
    \bottom-\top - 400 ; добавил - 400, чтобы не на весь экран было окно
    CreateImage(0,\right,\bottom)
    hPrinterDC = StartDrawing(ImageOutput(0))
    If hPrinterDC
    	BitBlt_(hPrinterDC,0,0,\right,\bottom,hDC,0,0,#SRCCOPY)
    	StopDrawing()
    EndIf
	EndWith
	ReleaseDC_(Handle,hDC)
	SetClipboardImage(0)
EndProcedure
Ниже была начальная попытка сделать на векторной графике, может ещё вернусь к ней.
EnableExplicit
; Загружаем кодеры
UseJPEGImageDecoder()
UseJPEG2000ImageDecoder()
UsePNGImageDecoder()
#Image0 = 0
#Window0 = 0
#Canvas0 = 0
Define LineWidth = 2, imgH, imgW, cY, cX
Define bitPointDown = 0
Define bitPointUp = 0
Define CVO
Define hImage
Define point1.Point
Define point2.Point
point1\x = 111
point1\y = 111
; загружаем рисунок
LoadImage(#Image0, "C:\PureBasic\Source\file.png")
imgH = ImageHeight(#Image0)
imgW = ImageWidth(#Image0)
hImage = ImageID(#Image0)
If OpenWindow(#Window0, 0, 0, imgW, imgH+30, "Рисование", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	CanvasGadget(#Canvas0, 0, 30, imgW, imgH)
	ButtonGadget (1, 10, 0, 200, 30, "кнопка")
	
	SetGadgetAttribute(#Canvas0, #PB_Canvas_Image, hImage)
	Repeat
    Select WaitWindowEvent()
    	Case #PB_Event_Gadget
        Select EventType()
        	Case #PB_EventType_LeftButtonDown:
            cX = GetGadgetAttribute(#Canvas0, #PB_Canvas_MouseX)
            cY = GetGadgetAttribute(#Canvas0, #PB_Canvas_MouseY)
            bitPointDown = 1
            point1\x = cX
            point1\y = cY
;             StartVectorDrawing(CanvasVectorOutput(#Canvas0, #PB_Unit_Pixel))
;             VectorSourceColor($FF2A04FF)
        	Case #PB_EventType_LeftButtonUp:
            cX = GetGadgetAttribute(#Canvas0, #PB_Canvas_MouseX)
            cY = GetGadgetAttribute(#Canvas0, #PB_Canvas_MouseY)
            bitPointDown = 0
            bitPointUp = 1
            ; bitPoint = 1
            point2\x = cX
            point2\y = cY
            	StartVectorDrawing(CanvasVectorOutput(#Canvas0, #PB_Unit_Pixel))
            MovePathCursor(point1\x, point1\y)
            AddPathLine(cX, cY)
            StrokePath(LineWidth)
            	StopVectorDrawing()
            
        	Case #PB_EventType_MouseMove:
            If bitPointDown
            	cX = GetGadgetAttribute(#Canvas0, #PB_Canvas_MouseX)
            	cY = GetGadgetAttribute(#Canvas0, #PB_Canvas_MouseY)
            	StartVectorDrawing(CanvasVectorOutput(#Canvas0, #PB_Unit_Pixel))
            	BeginVectorLayer(55)
            	MovePathCursor(point1\x, point1\y)
            	AddPathLine(cX, cY)
            	StrokePath(LineWidth)
            	EndVectorLayer()
            	StopVectorDrawing()
;             	DrawVectorImage(hImage)
            EndIf
        EndSelect
        
        Select EventGadget()
        	Case 1
            MessageRequester("", "")
        EndSelect
    	Case #PB_Event_CloseWindow
        SaveImage(#Image0, "C:\PureBasic\Source\file1.png") ; Сохранение
        FreeImage(#Image0)
        CloseWindow(0)
        End
    EndSelect
	ForEver
EndIf
Отредактировано AZJIO (01.09.2020 04:43:42)