Canvas-style gadget?
-
syntax error
- User

- Posts: 93
- Joined: Tue Jan 13, 2004 5:11 am
- Location: Midlands , UK
Canvas-style gadget?
I'm considering re-writing a tool (Image Packer - See link in sig) written in BlitzPlus. In that language there is a CreateCanvas() function.
I'm giving PB Demo a test but struggling to find a suitable gadget ro display images and to be able to detect a Left/Right mouse click. Think MSPAINT.
Is there something similar in PB?
Frame3DGadget/ContainerGadget do not detect mouse clicks.
I'm giving PB Demo a test but struggling to find a suitable gadget ro display images and to be able to detect a Left/Right mouse click. Think MSPAINT.
Is there something similar in PB?
Frame3DGadget/ContainerGadget do not detect mouse clicks.
Not sure if it's totally what you are looking for but check out the code provided here by einander:
viewtopic.php?t=8860&highlight=grid
viewtopic.php?t=8860&highlight=grid
This is how I did the left click in an imagegadget (I've probably lifted this, so credit goes to whoever!)
Unfortunately this code can't be run in the demo, due to the 2 API commands.
I have recreated a image list box like this, within a scroll area. First I check that the co-ords are in the scrollgadget, then which image they're in.
Code: Select all
OpenWindow(0, 0,0, 640,480, #PB_Window_SystemMenu | #PB_Window_WindowCentered | #PB_Window_MaximizeGadget |#PB_Window_MinimizeGadget, " ")
CreateGadgetList(WindowID(0))
CreateImage(0, 100,100) ; this is the main image gadget
UseImage(0)
StartDrawing(ImageOutput())
FillArea(0,0, RGB(255,0,0), RGB(255,0,0))
StopDrawing()
ImageGadget(1, 200,200,100,100, UseImage(0))
Procedure.l CheckPos(GadgetImageNo.l)
blInScroll.l = #False
;The following API commands are not available in Demo
GetCursorPos_(mouse.POINT)
ScreenToClient_(GadgetID(GadgetImageNo), mouse)
If mouse\x >= 0 And mouse\y >=0
If mouse\x < GadgetWidth(GadgetImageNo) And mouse\y < GadgetHeight(GadgetImageNo)
blInScroll = #True
EndIf
EndIf
ProcedureReturn blInScroll
EndProcedure
Repeat
event = WaitWindowEvent()
Select event
Case #WM_LBUTTONDOWN
If CheckPos(1) ; Check if click is in image 1
MessageRequester("", "Left Click in Image")
Else
MessageRequester("","Left Click NOT in Image")
EndIf
EndSelect
Until event = #PB_Event_CloseWindow
End
I have recreated a image list box like this, within a scroll area. First I check that the co-ords are in the scrollgadget, then which image they're in.
here a little sample of paint like program (with a brush) using the OwnGadget() user library (which can be found here: viewtopic.php?t=10477). Once the drawing is done, don't forget to save your wonderful painting
BTW: I will probably add a native CanvasGadget() as it seems a bit difficult to do it else.
BTW: I will probably add a native CanvasGadget() as it seems a bit difficult to do it else.
Code: Select all
;
; Little 'paint' like program, based on the OwnGadget() library.
;
; By AlphaSND - 2004
;
#ImageWidth = 320
#ImageHeight = 200
#GadgetX = 10
#GadgetY = 40
Global EraseMode
Procedure paint(gadget)
;notice that startdrawing()/stopdrawing() is not requied....
DrawImage(UseImage(0), 0, 0)
EndProcedure
Procedure mouse(gadget,button,x,y)
Static ButtonPushed
UseImage(1)
HalfImageWidth = ImageWidth()/2
HalfImageHeight = ImageHeight()/2
If x < HalfImageWidth : x = HalfImageWidth : EndIf
If y < HalfImageHeight : y = HalfImageHeight : EndIf
If x > #ImageWidth-HalfImageWidth : x = #ImageWidth-HalfImageWidth : EndIf
If y > #ImageHeight-HalfImageHeight : y = #ImageHeight-HalfImageHeight : EndIf
UseImage(0)
If button = 1 And (ButtonPushed = #False Or EraseMode = #True) And StartDrawing(ImageOutput())
UseImage(1)
DrawImage(ImageID(), x-ImageWidth()/2, y-ImageHeight()/2)
StopDrawing()
InvalidateRect_(gadget, 0, 0)
ButtonPushed = #True
Else
If StartDrawing(WindowOutput())
DrawImage(UseImage(0), #GadgetX, #GadgetY) ; just redraw the background before displaying our 'overlay' picture
BrushX = x+#GadgetX-HalfImageWidth
BrushY = y+#GadgetY-HalfImageHeight
DrawImage(UseImage(1), BrushX, BrushY)
StopDrawing()
EndIf
EndIf
If button = 0
ButtonPushed = #False
EndIf
EndProcedure
CreateImage(0, #ImageWidth, #ImageHeight)
CreateImage(1, 1, 1)
StartDrawing(ImageOutput())
Plot(0, 0, RGB(255, 0, 0))
StopDrawing()
CreateOwnGadgetType("MyOwnCanvas", -1, "")
OpenWindow(0,0,0,340,270,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget|#PB_Window_ScreenCentered,"")
CreateGadgetList(WindowID())
;Create a gadget of the previous created type...
;
Canvas = OwnGadget("MyOwnCanvas", #GadgetX, #GadgetY, #ImageWidth, #ImageHeight)
PaintCallback(Canvas, @paint())
MouseCallback(Canvas, @mouse())
ButtonGadget( 0, 10, 10, 60, 25, "Red Plot")
ButtonGadget( 1, 80, 10, 60, 25, "Green Box")
ButtonGadget( 2, 150, 10, 60, 25, "Eraser")
CreateMenu(0, WindowID())
MenuTitle("File")
MenuItem(0, "Save As..."+#Tab$+"Ctrl+S")
MenuBar()
MenuItem(1, "Quit")
UsePNGImageEncoder()
Repeat
event=WaitWindowEvent()
If Event = #PB_Event_Menu
Select EventMenuID()
Case 0
File$ = SaveFileRequester("","","PNG Files|*.png", 0)
If File$
If LCase(GetExtensionPart(File$)) <> "png"
File$+".png"
EndIf
SaveImage(0, File$, #PB_ImagePlugin_PNG)
EndIf
Case 1
Event = #PB_Event_CloseWindow ; Quit
EndSelect
ElseIf Event = #PB_Event_Gadget
Select EventGadgetID()
Case 0
CreateImage(1, 1, 1)
StartDrawing(ImageOutput())
Plot(0, 0, RGB(255, 0, 0))
StopDrawing()
EraseMode = #False
Case 1
CreateImage(1, 6, 6)
StartDrawing(ImageOutput())
Box(0, 0, 6, 6, RGB(0, 255, 0))
StopDrawing()
EraseMode = #False
Case 2
CreateImage(1, 50, 50)
EraseMode = #True
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
-
syntax error
- User

- Posts: 93
- Joined: Tue Jan 13, 2004 5:11 am
- Location: Midlands , UK
Thanks for the help guys. Unfortunately, very little works in the demo due to no WinAPI support.
OpenWindowedScreen() asked me to InitSprite first.
ImageGadget() is as near as I can get. Although this means I have ensure a 'left/right mousedown' is within the gadget region first.
EDIT
After some playing around I have this example.
For some reason I can't get the brush image (a green circle) to show up in the canvas image.
Any ideas??
OpenWindowedScreen() asked me to InitSprite first.
ImageGadget() is as near as I can get. Although this means I have ensure a 'left/right mousedown' is within the gadget region first.
Yes please Fred. In particular it needs to detect the mouse clicks/mouse down and be able to display a large image which is automatically cropped.I will probably add a native CanvasGadget() as it seems a bit difficult to do it else.
EDIT
After some playing around I have this example.
For some reason I can't get the brush image (a green circle) to show up in the canvas image.
Any ideas??
Code: Select all
; canvas test
#canW=244
#canH=212
canvas=CreateImage(#pb_any,#canW,#canH)
brush=CreateImage(#pb_any,64,64)
UseImage(brush)
StartDrawing(ImageOutput())
Circle(32,32,30,RGB(100,255,80))
StopDrawing()
; gui
win=OpenWindow(#pb_any, 200,200,#canW+46, #canH+66, #PB_Window_SystemMenu | #PB_Window_TitleBar , "Test window")
If CreateGadgetList(WindowID(win))
igad=ImageGadget(#pb_any, 20, 20, 190, 150, UseImage(canvas),#PB_Image_Border)
EndIf
sb=CreateStatusBar(#pb_any,WindowID(win))
StatusBarText(sb, 0, "left-click in canvas ...")
quit=0
Repeat
ev=WaitWindowEvent()
Select ev
Case 513 ; mousedown
x=WindowMouseX()-20-6 : y=WindowMouseY()-20-24
StatusBarText(sb, 0, "Coords: "+Str(x)+","+Str(y))
UseImage(canvas)
StartDrawing(ImageOutput())
; Box(0,0,#canW,#canH,0) ; CLS
DrawImage(brush,x-32,y-32)
StopDrawing()
SetGadgetState(igad,UseImage(canvas))
Case #PB_EventCloseWindow : quit=1
EndSelect
Until quit=1
Endmaybe this will help.
Code: Select all
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0
MessageRequester("Error", "Can't open DirectX 7 Or later", 0)
End
EndIf
InitSound()
fps.f=85
gfps.f=85
rfps.f=1
rfpss.f=85
infoon=0
mousplace=0
hWnd=OpenWindow(0,0,0,800,600,#PB_Window_SystemMenu|#PB_Window_WindowCentered|#PB_Window_MinimizeGadget,"Dabidu")
If hWnd=0
MessageRequester("Error","Can't open window.",0)
EndIf
X=OpenWindowedScreen(hWnd,0,0,640,480,0,0,0)
SetFrameRate(60)
If X=0
MessageRequester("Error","Can't open screen.",0)
EndIf
CreateSprite(0,16,16)
StartDrawing(SpriteOutput(0))
DrawingMode(4)
FrontColor(0,255,0)
Box(0,0,16,16)
DrawingMode(0)
FrontColor(0,0,0)
Box(0,5,16,6)
Box(5,0,6,16)
DrawingMode(4)
FrontColor(0,255,0)
Box(7,7,2,2)
StopDrawing()
fpss=ElapsedMilliseconds()
Repeat
FlipBuffers()
ClearScreen(0,0,0)
;========================================================================================
; FPS
;========================================================================================
conta=conta+1
If ElapsedMilliseconds()=>fpss+1000
fpss=ElapsedMilliseconds()
fps=conta
rfps=gfps/fps
rfpss=fps*rfps
conta=0
EndIf
;=========================================================================================
If WindowMouseX()<4 Or WindowMouseX()>641 Or WindowMouseY()<23 Or WindowMouseY()>500
ReleaseMouse(1)
mousplace=0
Else
ReleaseMouse(0)
If mousplace=0
mousplace=1
MouseLocate(WindowMouseX(),WindowMouseY())
EndIf
EndIf
ExamineMouse()
mx=MouseX()-8
my=MouseY()-8
If mousplace
DisplayTransparentSprite(0,mx,my)
EndIf
If MouseButton(1)
lmbtim=ElapsedMilliseconds()
EndIf
If MouseButton(2)
rmbtim=ElapsedMilliseconds()
EndIf
;=========================================================================================
;=========================================================================================
; PRINT TEXT
;=========================================================================================
pepeID=ScreenOutput()
StartDrawing(pepeID)
If infoon=1
FrontColor(255,255,255)
DrawingMode(1)
Locate(20,20)
DrawText("FPS: "+StrF(fps))
FrontColor(255,0,0)
Locate(20,40)
DrawText("Correction: "+StrF(rfps))
Locate(20,60)
DrawText("Simulated FPS: "+StrF(rfpss))
EndIf
FrontColor(255,255,0)
DrawingMode(1)
If ElapsedMilliseconds()<lmbtim+1000
Locate(mx-25,my-15)
DrawText("LMB")
EndIf
If ElapsedMilliseconds()<rmbtim+1000
Locate(mx+15,my-15)
DrawText("RMB")
EndIf
StopDrawing()
;=========================================================================================
;=========================================================================================
;### Check for windows events
Eve= WindowEvent()
Select Eve
Case #PB_Event_CloseWindow
End
EndSelect
;=========================================================================================
; KEYBOARD INPUT
;=========================================================================================
ExamineKeyboard()
If KeyboardReleased(#PB_Key_F1)
Select infoon
Case 0
infoon=1
Case 1
infoon=0
EndSelect
EndIf
;=========================================================================================
;=========================================================================================
Until KeyboardPushed(#PB_Key_Escape)
End -
Edwin Knoppert
- Addict

- Posts: 1073
- Joined: Fri Apr 25, 2003 11:13 pm
- Location: Netherlands
- Contact:
-
syntax error
- User

- Posts: 93
- Joined: Tue Jan 13, 2004 5:11 am
- Location: Midlands , UK
@MadMax,
How system-friendly is that code example?
I see InitSprite()
Whats the difference between sprites/images?
I need masking support for sure.
My current method is this example ...
Anyone know the #CONST for 'window lost/gained focus'?
Is there an AutoSuspend call to put a PB app to sleep?
How system-friendly is that code example?
I see InitSprite()
Whats the difference between sprites/images?
I need masking support for sure.
My current method is this example ...
Code: Select all
; canvas test
#canW=420
#canH=380
Global canvas,mouseincanvas,x,y,igad,clscolor
Declare DrawBrush(can,xpos,ypos)
Declare ClsCanvas(can,r,g,b)
canvas=CreateImage(#pb_any,#canW,#canH)
brush=CreateImage(#pb_any,32,32)
UseImage(brush)
StartDrawing(ImageOutput())
Circle(16,16,14,RGB(100,255,80))
StopDrawing()
; gui
win=OpenWindow(#pb_any, 200,200,#canW+46, #canH+66, #PB_Window_SystemMenu | #PB_Window_TitleBar , "Canvas")
If CreateGadgetList(WindowID(win))
igad=ImageGadget(#pb_any, 20, 20, 190, 150, UseImage(canvas),#PB_Image_Border)
EndIf
sb=CreateStatusBar(#pb_any,WindowID(win))
StatusBarText(sb, 0, "left-click in canvas ...")
quit=0
clscolor=0
Repeat
ev=WaitWindowEvent()
;;; Debug ev
; update stausbar with mouse coords
x=WindowMouseX()-20-5 : y=WindowMouseY()-20-24
If (x>=0 And x<#canW) And (y>=0 And y<#canH)
mouseincanvas=1
StatusBarText(sb, 0, "Coords: "+Str(x)+","+Str(y))
Else
mouseincanvas=0
StatusBarText(sb, 0, "Coords: xxx,xxx")
EndIf
Select ev
Case 513 ; LMB pressed
If mouseincanvas
drawmode=1 : DrawBrush(canvas,x,y)
EndIf
Case 514
drawmode=0 ; LMB released
Case 512 ; mouse moving
If drawmode=1
DrawBrush(canvas,x,y)
EndIf
Case 516 ; RMB
ClsCanvas(canvas,Random(255),Random(255),Random(255))
Case #PB_EventCloseWindow : quit=1
EndSelect
Until quit=1
End
Procedure DrawBrush(can,xpos,ypos)
If mouseincanvas=1
UseImage(can)
StartDrawing(ImageOutput())
Circle(xpos,ypos,12,RGB(100,255,80))
StopDrawing()
SetGadgetState(igad,UseImage(can))
EndIf
EndProcedure
Procedure ClsCanvas(can,r,g,b)
Static bkgcolor
bkgcolor=RGB(r,g,b)
UseImage(can)
StartDrawing(ImageOutput())
Box(0,0,#canW,#canH,bkgcolor) ; CLS
StopDrawing()
SetGadgetState(igad,UseImage(can))
EndProcedureIs there an AutoSuspend call to put a PB app to sleep?

