User talk:BrianO

From Rosetta Code
;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

--Demivec 21:44, 27 August 2012 (UTC)