This is (less) rubbish (now), but I think it shows that the Canvas Gadget could be the solution. The code is stripped-out of the PB help example:
Code: Select all
Enumeration
#IMAGE_Content ; stores the previous CanvasGadget content while the mouse is down
#IMAGE_Color
#IMAGE_LoadSave
#ImageSave
#DynText
#Editor
#Canvas
#Color
#Refresh
#Shadow
#Ctr
#Lft
#Rgt
#Clear
#Load
#Save
#TextEditor
EndEnumeration
Global igCurrentColour.i, igStartX.i, igStartY.i, igEndX.i, igEndY.i
Global igLastStartX.i, igLastStartY.i, igLastEndX.i, igLastEndY.i
Global gsrcDC.l, igDeskX.i, igDeskY.i, igLastDeskX.i, igLastDeskY.i
Global sgImageOutFile.s = ""
Global igObjectExists.i = #False
;Editor Font
Global sgFontName.s = "Arial"
Global igFontSize.i = 16
Global igFontColour.i = RGB(0,0,0)
Global igFontStyle.i = (#PB_Font_Bold | #PB_Font_HighQuality + 2)
Global igFontID1.i = LoadFont(1, sgFontName, igFontSize, igFontStyle)
Global igShadow.i = #False
Global sgText.s = "Mary had a little lamb, it's fleece was white as snow. Everywhere that Mary went, the lamb was sure to go."
UsePNGImageDecoder()
UsePNGImageEncoder()
;CreateImage(#IMAGE_Content, 380, 380,32|#PB_Image_Transparent)
CreateImage(#IMAGE_Content, 380, 380, 24)
;Colour Selection Button
igCurrentColour = RGB(191,223,255)
CreateImage(#IMAGE_Color, 40, 15, 24)
If StartDrawing(ImageOutput(#IMAGE_Color))
Box(0, 0, 40, 15, igCurrentColour)
StopDrawing()
EndIf
Procedure SetAlignment(iJustify, iX, iY)
;--------------------------------------
Protected sText.s
sText = GetGadgetText(#TextEditor)
FreeGadget(#TextEditor)
EditorGadget(#TextEditor, igStartX + 25, igStartY + 25, (iX-igStartX) - 30, (iY-igStartY) - 30, iJustify)
SendMessage_(GadgetID(#TextEditor),#EM_SETTARGETDEVICE,#Null,0) ;WordWrap on
SetGadgetColor(#TextEditor,#PB_Gadget_BackColor,igCurrentColour)
SetGadgetFont(#TextEditor,igFontID1)
SetGadgetText(#TextEditor, sText)
EndProcedure
Procedure.l CaptureRegion(iX.i, iY.i, iW.i, iH.i)
;------------------------------------------------
Shared gsrcDC
dm.DEVMODE
gsrcDC = CreateDC_("DISPLAY","","",dm)
trgDC.l = CreateCompatibleDC_(gsrcDC)
BMPHandle.l = CreateCompatibleBitmap_(gsrcDC,iW,iH)
SelectObject_(trgDC,BMPHandle)
BitBlt_(trgDC,0,0,iW,iH,gsrcDC,iX,iY,#SRCCOPY)
DeleteDC_(trgDC)
ReleaseDC_(BMPHandle,srcDC)
ProcedureReturn BMPHandle
EndProcedure
Procedure ImageSave()
;--------------------
Protected iX.i = (igLastDeskX - 5)
Protected iY.i = (igLastDeskY - 5)
Protected iW.i = (igLastEndX - igLastStartX) + 10
Protected iH.i = (igLastEndY - igLastStartY) + 10
If(igShadow = #True) : iW + 4 : iH + 4 : EndIf
ScreenCaptureAddress = CaptureRegion(iX,iY,iW,iH)
If ScreenCaptureAddress <> 0
;CreateImage(#ImageSave,iW,iH,32|#PB_Image_Transparent)
CreateImage(#ImageSave,iW,iH,24)
StartDrawing(ImageOutput(#ImageSave))
DrawImage(ScreenCaptureAddress,0,0)
StopDrawing()
SaveImage(#ImageSave,sgImageOutFile,#PB_ImagePlugin_PNG)
FreeImage(#ImageSave)
DeleteDC_(gsrcDC)
DeleteObject_(ScreenCaptureAddress)
Else
MessageRequester("Image Save Failed", "Cannot save file: " + sgImageOutFile)
EndIf
EndProcedure
Procedure DrawObject(x,y)
;------------------------
Shared igObjectExists, igCurrentColour, igStartX, igStartY, igLastStartX, igLastStartY, igLastEndX, igLastEndY, igDeskX, igDeskY
If StartDrawing(CanvasOutput(#Canvas))
DrawImage(ImageID(#IMAGE_Content), 0, 0)
;Shadow
If(igShadow = #True)
RoundBox(igStartX + 4, igStartY + 4, (x-igStartX), (y-igStartY), 12, 12, RGB(128,128,128))
EndIf
;Outline
RoundBox(igStartX, igStartY, x-igStartX, y-igStartY, 14, 14, RGB(0,0,0))
;Fill
RoundBox(igStartX + 2, igStartY + 2, (x-igStartX) - 4, (y-igStartY) - 4, 12, 12, igCurrentColour)
SetGadgetColor(#TextEditor,#PB_Gadget_BackColor,igCurrentColour)
SetGadgetFont(#TextEditor,igFontID1)
ResizeGadget(#TextEditor,igStartX + 25, igStartY + 25, (x-igStartX) - 30, (y-igStartY) - 30)
SetGadgetText(#TextEditor,sgText)
DrawingMode(#PB_2DDrawing_Default)
StopDrawing()
igLastStartX = igStartX
igLastStartY = igStartY
igLastDeskX = igDeskX
igLastDeskY = igDeskY
igLastEndX = x
igLastEndY = y
igObjectExists = #True
EndIf
EndProcedure
Procedure OpenWin()
;------------------
If OpenWindow(#DynText,0,0,460,400,"Dynamic Caption Box",#PB_Window_Invisible|#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
CanvasGadget(#Canvas, 10, 10, 380, 380, #PB_Canvas_ClipMouse)
ButtonImageGadget(#Color, 400, 10, 50, 25, ImageID(#IMAGE_Color))
ButtonGadget(#Refresh,400, 40, 50, 25, "Refresh")
ButtonGadget(#Shadow, 400, 80, 50, 25, "Shadow")
ButtonGadget(#Ctr, 400, 125, 50, 25, "Ctr Just")
ButtonGadget(#Lft, 400, 150, 50, 25, "Lft Just")
ButtonGadget(#Rgt, 400, 175, 50, 25, "Rgt Just")
ButtonGadget(#Clear, 400, 280, 50, 25, "Clear")
ButtonGadget(#Load, 400, 335, 50, 25, "Load")
ButtonGadget(#Save, 400, 365, 50, 25, "Save")
EditorGadget(#TextEditor,10,10,380,380,#ES_CENTER)
SendMessage_(GadgetID(#TextEditor),#EM_SETTARGETDEVICE,#Null,0) ;WordWrap on
SetGadgetAttribute(#Canvas,#PB_Canvas_Cursor,#PB_Cursor_Default)
HideWindow(#DynText,#False)
EndIf
EndProcedure
Procedure WaitForUser()
;----------------------
Shared igObjectExists
Repeat
iEvent = WaitWindowEvent()
If iEvent = #PB_Event_Gadget
iEventGadget = EventGadget()
Select iEventGadget
Case #Canvas
igEndX = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseX)
igEndY = GetGadgetAttribute(#Canvas, #PB_Canvas_MouseY)
Select EventType()
Case #PB_EventType_LeftButtonDown
;
; This stores the current content of the CanvasGadget in #IMAGE_Content,
; so it can be re-drawn while the mouse moves
;
If StartDrawing(ImageOutput(#IMAGE_Content))
DrawImage(GetGadgetAttribute(#Canvas, #PB_Canvas_Image), 0, 0)
StopDrawing()
EndIf
igDeskX = DesktopMouseX()
igDeskY = DesktopMouseY()
igStartX = igEndX
igStartY = igEndY
DrawObject(igEndX, igEndY)
Case #PB_EventType_LeftButtonUp
DrawObject(igEndX, igEndY)
Case #PB_EventType_MouseMove
If GetGadgetAttribute(#Canvas, #PB_Canvas_Buttons) & #PB_Canvas_LeftButton
DrawObject(igEndX, igEndY)
EndIf
EndSelect
Case #Color
igCurrentColour = ColorRequester(igCurrentColour)
If StartDrawing(ImageOutput(#IMAGE_Color))
Box(0, 0, 40, 15, igCurrentColour)
StopDrawing()
SetGadgetAttribute(#Color, #PB_Button_Image, ImageID(#IMAGE_Color))
EndIf
Case #Shadow
If(igShadow = #False)
igShadow = #True
Else
igShadow = #False
EndIf
If(igObjectExists = #True)
igStartX = igLastStartX
igStartY = igLastStartY
DrawObject(igLastEndX,igLastEndY)
EndIf
Case #Refresh
igStartX = igLastStartX
igStartY = igLastStartY
DrawObject(igLastEndX,igLastEndY)
Case #Ctr
igStartX = igLastStartX
igStartY = igLastStartY
SetAlignment(#ES_CENTER, igLastEndX, igLastEndY)
Case #Lft
igStartX = igLastStartX
igStartY = igLastStartY
SetAlignment(#ES_LEFT, igLastEndX, igLastEndY)
Case #Rgt
igStartX = igLastStartX
igStartY = igLastStartY
SetAlignment(#ES_RIGHT, igLastEndX, igLastEndY)
Case #Clear
If StartDrawing(CanvasOutput(#Canvas))
Box(0, 0, 380, 380, $FFFFFF)
StopDrawing()
EndIf
igObjectExists = #False
Case #Load
File$ = OpenFileRequester("Load Image...", "", "PNG Images|*.png|All Files|*.*", 0)
If File$
If LoadImage(#IMAGE_LoadSave, File$)
If StartDrawing(CanvasOutput(#Canvas))
Box(0, 0, 380, 380, $FFFFFF)
DrawImage(ImageID(#IMAGE_LoadSave), 0, 0)
StopDrawing()
EndIf
FreeImage(#IMAGE_LoadSave)
Else
MessageRequester("Image File", "Cannot load image: " + File$)
EndIf
EndIf
Case #Save
sgImageOutFile = SaveFileRequester("Save Image", sgImageOutFile, "PNG Images|*.png|All Files|*.*", 0)
If sgImageOutFile And (FileSize(sgImageOutFile) = -1 Or MessageRequester("File Exists", "Overwrite this file? " + sgImageOutFile, #PB_MessageRequester_YesNo) = #PB_MessageRequester_Yes)
ImageSave()
EndIf
EndSelect
EndIf
Until iEvent = #PB_Event_CloseWindow
EndProcedure
OpenWin()
WaitForUser()
End
Snag with the editor gadget is the scrollbars showing-up. Is there a way to suppress them?