Решил попробовать рисование на скриншоте линий, фигур, стрелок.
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)