User talk:BrianO: Difference between revisions
(Blanked the page) |
(Updated code utility) |
||
Line 1: | Line 1: | ||
<lang purebasic>;There are no hard feelings. |
|||
;Thank you for your code sample, it seems like it will be useful |
|||
;I modified your sample and provide you with the updated code if it might benefit you. |
|||
;The changes address a few simple things that I found helpful: |
|||
; It allows negative selections, i.e. making a click and then moving left or up from the click to outline the selection. |
|||
; It removes the toggling of buttons when they served no apparent purpose (namely the 'new' button but also resetting the 'snapit' button). |
|||
; Uses the CanvasGadget for it's more robust event handling (instead of an image gadget). |
|||
; Addresses one small issue when the 'snapit' button is displayed. If a click was made on the image a new selection was started. That is now prevented by requiring the |
|||
; 'snapit' button to be toggled off so that the desktop image is displayed to allow captures to take place. |
|||
; |
|||
;All other changes are simply formatting (no offense intended) and many occur simply by virtue of the IDE (jaPBe) that I use. |
|||
Enumeration |
|||
#ButtonMakeScreenShot |
|||
#ButtonMakeNewScreenShot |
|||
#CanvasScreenShot |
|||
#ImageFullScreenShot = 0 |
|||
#ImageHalfScreenShot |
|||
#ImageTempScreenShot |
|||
#ImageSelectedArea |
|||
EndEnumeration |
|||
Procedure.i MakeDesktopScreenshot(ImageNr, x, y, width, height) |
|||
hImage = CreateImage(ImageNr, width, height) |
|||
hDC = StartDrawing(ImageOutput(ImageNr)) |
|||
DeskDC = GetDC_(GetDesktopWindow_()) |
|||
BitBlt_(hDC, 0, 0, width, height, DeskDC, x, y, #SRCCOPY) |
|||
StopDrawing() |
|||
ReleaseDC_(GetDesktopWindow_(), DeskDC) |
|||
ProcedureReturn hImage |
|||
EndProcedure |
|||
Procedure.s formatTitle(x, y, zoom) |
|||
ProcedureReturn Str(x * zoom) + "|" + Str(y * 2) + "|" |
|||
EndProcedure |
|||
Procedure filterCallback(x, y, sourceColor, targetColor) |
|||
If (x % 16 < 8 And y % 16 < 8) Or (x % 16 > 7 And y % 16 > 7) |
|||
ProcedureReturn RGBA(192, 192, 192, 255) |
|||
Else |
|||
ProcedureReturn RGBA(255, 255, 255, 255) |
|||
EndIf |
|||
EndProcedure |
|||
Style = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered |
|||
LoadFont(0, "tahoma", 9, #PB_Font_HighQuality | #PB_Font_Bold) |
|||
SetGadgetFont(#PB_Default, FontID(0)) |
|||
ExamineDesktops(): dtw = DesktopWidth(0): dth = DesktopHeight(0) |
|||
w = dtw / 2: h = dth / 2 |
|||
MakeDesktopScreenshot(#ImageFullScreenShot, 0, 0, dtw, dth) |
|||
CopyImage(#ImageFullScreenShot, #ImageHalfScreenShot) |
|||
ResizeImage(#ImageHalfScreenShot, w, h) |
|||
OpenWindow(0, 0, 0, w, h + 20, "", Style): StickyWindow(0, 1) |
|||
ButtonGadget(#ButtonMakeNewScreenShot, w - 200, h, 100, 20, "New") |
|||
ButtonGadget(#ButtonMakeScreenShot, w - 100, h, 100, 20,"SnipIt", #PB_Button_Toggle) |
|||
CanvasGadget(#CanvasScreenShot, 0, 0, w, h) |
|||
SetGadgetAttribute(#CanvasScreenShot, #PB_Canvas_Image, ImageID(#ImageHalfScreenShot)) |
|||
StopSelecting=#True |
|||
Repeat |
|||
msg = WaitWindowEvent() |
|||
gid = EventGadget() |
|||
etp = EventType() |
|||
Select msg |
|||
Case #PB_Event_CloseWindow |
|||
End |
|||
Case #PB_Event_Gadget |
|||
Select gid |
|||
Case #ButtonMakeNewScreenShot |
|||
HideWindow(0, 1) |
|||
sleep_(200) |
|||
MakeDesktopScreenshot(#ImageFullScreenShot, 0, 0, dtw, dth) |
|||
CopyImage(#ImageFullScreenShot, #ImageHalfScreenShot) |
|||
ResizeImage(#ImageHalfScreenShot, w, h) |
|||
SetGadgetAttribute(#CanvasScreenShot, #PB_Canvas_Image, ImageID(#ImageHalfScreenShot)) |
|||
HideWindow(0, 0) |
|||
SetGadgetState(#ButtonMakeScreenShot, 0) |
|||
Case #ButtonMakeScreenShot |
|||
Select GetGadgetState(#ButtonMakeScreenShot) |
|||
Case 0 |
|||
SetGadgetAttribute(#CanvasScreenShot, #PB_Canvas_Image, ImageID(#ImageHalfScreenShot)) |
|||
Case 1 |
|||
SetWindowTitle(0, formatTitle(x1, y1, 2) + formatTitle(sw, sh, zoom) + " - " + formatTitle(x1, y1, 2) + formatTitle(sw, sh, zoom)) |
|||
GrabImage(#ImageFullScreenShot, #ImageSelectedArea, x1 * 2 - 2, y1 * 2 - 2, sw * 2, sh * 2) |
|||
SetClipboardImage(#ImageSelectedArea) |
|||
CreateImage(#ImageTempScreenShot, w, h) |
|||
StartDrawing(ImageOutput(#ImageTempScreenShot)) |
|||
DrawingMode(#PB_2DDrawing_CustomFilter) |
|||
CustomFilterCallback(@filterCallback()) |
|||
Box(0, 0, w, h, RGB(212, 208, 200)) |
|||
DrawingMode(#PB_2DDrawing_Default) |
|||
DrawImage(ImageID(#ImageSelectedArea), 0, 0) |
|||
StopDrawing() |
|||
SetGadgetAttribute(#CanvasScreenShot, #PB_Canvas_Image, ImageID(#ImageTempScreenShot)) |
|||
EndSelect |
|||
Case #CanvasScreenShot |
|||
Select etp |
|||
Case #PB_EventType_LeftButtonUp |
|||
StopSelecting = #True |
|||
Case #PB_EventType_MouseMove |
|||
If Not StopSelecting |
|||
xi = GetGadgetAttribute(#CanvasScreenShot, #PB_Canvas_MouseX) |
|||
yi = GetGadgetAttribute(#CanvasScreenShot, #PB_Canvas_MouseY) |
|||
If xi < 0: xi = 0: EndIf |
|||
If xi > w: xi = w: EndIf |
|||
If yi < 0: yi = 0: EndIf |
|||
If yi > h: yi = h: EndIf |
|||
x1 = xi: x2 = x0 |
|||
If x2 < x1 |
|||
Swap x2, x1 |
|||
EndIf |
|||
y1 = yi: y2 = y0 |
|||
If y2 < y1 |
|||
Swap y2, y1 |
|||
EndIf |
|||
sw = x2 - x1 |
|||
sh = y2 - y1 |
|||
SetWindowTitle(0, formatTitle(x1, y1, 2) + formatTitle(sw, sh, zoom)) |
|||
SetGadgetState(#CanvasScreenShot, ImageID(#ImageHalfScreenShot)) |
|||
CopyImage(#ImageHalfScreenShot, #ImageTempScreenShot) |
|||
StartDrawing(ImageOutput(#ImageTempScreenShot)) |
|||
DrawingMode(#PB_2DDrawing_XOr | #PB_2DDrawing_Outlined) |
|||
Box(x1, y1, sw, sh, $FFFFFF) |
|||
StopDrawing() |
|||
SetGadgetAttribute(#CanvasScreenShot, #PB_Canvas_Image, ImageID(#ImageTempScreenShot)) |
|||
EndIf |
|||
Case #PB_EventType_LeftButtonDown |
|||
If StopSelecting = #True And GetGadgetState(#ButtonMakeScreenShot) = 0 |
|||
x0 = GetGadgetAttribute(#CanvasScreenShot, #PB_Canvas_MouseX) |
|||
y0 = GetGadgetAttribute(#CanvasScreenShot, #PB_Canvas_MouseY) |
|||
SetWindowTitle(0, formatTitle(x0, y0, 2)) |
|||
StopSelecting = #False |
|||
EndIf |
|||
EndSelect |
|||
EndSelect |
|||
EndSelect |
|||
ForEver</lang> |
Revision as of 21:41, 27 August 2012
<lang purebasic>;There are no hard feelings.
- Thank you for your code sample, it seems like it will be useful
- I modified your sample and provide you with the updated code if it might benefit you.
- The changes address a few simple things that I found helpful
- It allows negative selections, i.e. making a click and then moving left or up from the click to outline the selection.
- It removes the toggling of buttons when they served no apparent purpose (namely the 'new' button but also resetting the 'snapit' button).
- Uses the CanvasGadget for it's more robust event handling (instead of an image gadget).
- Addresses one small issue when the 'snapit' button is displayed. If a click was made on the image a new selection was started. That is now prevented by requiring the
- 'snapit' button to be toggled off so that the desktop image is displayed to allow captures to take place.
- All other changes are simply formatting (no offense intended) and many occur simply by virtue of the IDE (jaPBe) that I use.
Enumeration
#ButtonMakeScreenShot #ButtonMakeNewScreenShot #CanvasScreenShot #ImageFullScreenShot = 0 #ImageHalfScreenShot #ImageTempScreenShot #ImageSelectedArea
EndEnumeration
Procedure.i MakeDesktopScreenshot(ImageNr, x, y, width, height)
hImage = CreateImage(ImageNr, width, height) hDC = StartDrawing(ImageOutput(ImageNr)) DeskDC = GetDC_(GetDesktopWindow_()) BitBlt_(hDC, 0, 0, width, height, DeskDC, x, y, #SRCCOPY) StopDrawing() ReleaseDC_(GetDesktopWindow_(), DeskDC) ProcedureReturn hImage
EndProcedure
Procedure.s formatTitle(x, y, zoom)
ProcedureReturn Str(x * zoom) + "|" + Str(y * 2) + "|"
EndProcedure
Procedure filterCallback(x, y, sourceColor, targetColor)
If (x % 16 < 8 And y % 16 < 8) Or (x % 16 > 7 And y % 16 > 7) ProcedureReturn RGBA(192, 192, 192, 255) Else ProcedureReturn RGBA(255, 255, 255, 255) EndIf
EndProcedure
Style = #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_ScreenCentered
LoadFont(0, "tahoma", 9, #PB_Font_HighQuality | #PB_Font_Bold) SetGadgetFont(#PB_Default, FontID(0))
ExamineDesktops(): dtw = DesktopWidth(0): dth = DesktopHeight(0) w = dtw / 2: h = dth / 2
MakeDesktopScreenshot(#ImageFullScreenShot, 0, 0, dtw, dth) CopyImage(#ImageFullScreenShot, #ImageHalfScreenShot) ResizeImage(#ImageHalfScreenShot, w, h)
OpenWindow(0, 0, 0, w, h + 20, "", Style): StickyWindow(0, 1) ButtonGadget(#ButtonMakeNewScreenShot, w - 200, h, 100, 20, "New") ButtonGadget(#ButtonMakeScreenShot, w - 100, h, 100, 20,"SnipIt", #PB_Button_Toggle) CanvasGadget(#CanvasScreenShot, 0, 0, w, h) SetGadgetAttribute(#CanvasScreenShot, #PB_Canvas_Image, ImageID(#ImageHalfScreenShot))
StopSelecting=#True Repeat
msg = WaitWindowEvent() gid = EventGadget() etp = EventType() Select msg Case #PB_Event_CloseWindow End Case #PB_Event_Gadget Select gid Case #ButtonMakeNewScreenShot HideWindow(0, 1) sleep_(200) MakeDesktopScreenshot(#ImageFullScreenShot, 0, 0, dtw, dth) CopyImage(#ImageFullScreenShot, #ImageHalfScreenShot) ResizeImage(#ImageHalfScreenShot, w, h) SetGadgetAttribute(#CanvasScreenShot, #PB_Canvas_Image, ImageID(#ImageHalfScreenShot)) HideWindow(0, 0) SetGadgetState(#ButtonMakeScreenShot, 0) Case #ButtonMakeScreenShot Select GetGadgetState(#ButtonMakeScreenShot) Case 0 SetGadgetAttribute(#CanvasScreenShot, #PB_Canvas_Image, ImageID(#ImageHalfScreenShot)) Case 1 SetWindowTitle(0, formatTitle(x1, y1, 2) + formatTitle(sw, sh, zoom) + " - " + formatTitle(x1, y1, 2) + formatTitle(sw, sh, zoom)) GrabImage(#ImageFullScreenShot, #ImageSelectedArea, x1 * 2 - 2, y1 * 2 - 2, sw * 2, sh * 2) SetClipboardImage(#ImageSelectedArea) CreateImage(#ImageTempScreenShot, w, h) StartDrawing(ImageOutput(#ImageTempScreenShot)) DrawingMode(#PB_2DDrawing_CustomFilter) CustomFilterCallback(@filterCallback()) Box(0, 0, w, h, RGB(212, 208, 200)) DrawingMode(#PB_2DDrawing_Default) DrawImage(ImageID(#ImageSelectedArea), 0, 0) StopDrawing() SetGadgetAttribute(#CanvasScreenShot, #PB_Canvas_Image, ImageID(#ImageTempScreenShot)) EndSelect Case #CanvasScreenShot Select etp Case #PB_EventType_LeftButtonUp StopSelecting = #True Case #PB_EventType_MouseMove If Not StopSelecting xi = GetGadgetAttribute(#CanvasScreenShot, #PB_Canvas_MouseX) yi = GetGadgetAttribute(#CanvasScreenShot, #PB_Canvas_MouseY) If xi < 0: xi = 0: EndIf If xi > w: xi = w: EndIf If yi < 0: yi = 0: EndIf If yi > h: yi = h: EndIf x1 = xi: x2 = x0 If x2 < x1 Swap x2, x1 EndIf y1 = yi: y2 = y0 If y2 < y1 Swap y2, y1 EndIf sw = x2 - x1 sh = y2 - y1 SetWindowTitle(0, formatTitle(x1, y1, 2) + formatTitle(sw, sh, zoom)) SetGadgetState(#CanvasScreenShot, ImageID(#ImageHalfScreenShot)) CopyImage(#ImageHalfScreenShot, #ImageTempScreenShot) StartDrawing(ImageOutput(#ImageTempScreenShot)) DrawingMode(#PB_2DDrawing_XOr | #PB_2DDrawing_Outlined) Box(x1, y1, sw, sh, $FFFFFF) StopDrawing() SetGadgetAttribute(#CanvasScreenShot, #PB_Canvas_Image, ImageID(#ImageTempScreenShot)) EndIf Case #PB_EventType_LeftButtonDown If StopSelecting = #True And GetGadgetState(#ButtonMakeScreenShot) = 0 x0 = GetGadgetAttribute(#CanvasScreenShot, #PB_Canvas_MouseX) y0 = GetGadgetAttribute(#CanvasScreenShot, #PB_Canvas_MouseY) SetWindowTitle(0, formatTitle(x0, y0, 2)) StopSelecting = #False EndIf EndSelect EndSelect EndSelect
ForEver</lang>