ich habe mich in den letzten Tagen mal wieder an PB gewagt und die Anfänge eines Layout Programms...
Da ich mich immer noch als Anfänger einstufe, würde ich euch bitten, den Code mal zu überfliegen, ob ihr daran grundsätzlich etwas ändern würdet.
Das nachträgliche Umstrukturieren bleibt zwar nie aus, aber vielleicht kann ich es so etwas eindämmen.
- Lieber Bindevent oder EventLoop?
- Ist Vectordrawing verlässlich in der Darstellung auch im Druck?
Nebenbei: Mir ist aufgefallen, dass beim Drucken von Text mit Alpha bei manchen Textgrößen eine sehr grobe Rasterung entsteht. Habt ihr eine Erklärung?
Bisher kann das Programm noch nicht viel:
- Grafik laden und in Form von ein paar Objekten darstellen
- Auswahl einzelner Objekte mit Möglichkeit zum Verschieben
- Zoomen mit Strg+Mausrad
Viele Grüße,
Phil
Code: Alles auswählen
; ------------------------------------------------------------
;
; Layout Software - Canvas Vector Test
;
; (c) Phil
;
; ------------------------------------------------------------
;
EnableExplicit
;- Constants
#testImage = 7
#Handle_Radius=3.0
Enumeration Mode
#Mode_None
#Mode_Move
EndEnumeration
;- Gadgets
#G_Canvas=5
;- Structures
Structure Object
name.s
image.i
text.s
x.f
y.f
w.f
h.f
flag_selected.b
EndStructure
;- Global
Global Event.i
Global EventGadget.i
Global EventType.i
Global gMouseX.f
Global gMouseY.f
Global gRelativeSelObjMouseX.f
Global gRelativeSelObjMouseY.f
Global gScaleKoords.f = 1.0
Global gMode.i
Global NewList objList.Object()
Global NewList mouseOverList.i()
Global gUpMouseOverObj.i
Global gSelectedObject.i = 3
Global gFlgMouseOverHandle.i
Global gFlgMouseOverSelObj.i
;- Procedures
Procedure CreateObject()
AddElement(objList())
With objList()
\name = "test"
\image = #testImage
\x = Random(100,10)
\y = Random(100,10)
\w = Random(100,10)
\h = Random(100,10)
EndWith
EndProcedure
Procedure RedrawObjects()
Protected x.f, y.f
x = gMouseX
y = gMouseY
;Make list of all Objects with MouseOver by silently drawing the frames.
ForEach objList()
With objList()
AddPathBox(\x, \y,\w ,\h)
If IsInsidePath(x, y, #PB_Coordinate_User)
VectorSourceColor(RGBA(255, 255, 0, 255))
AddElement(mouseOverList())
mouseOverList()=ListIndex(objList())
Else
VectorSourceColor(RGBA(0, 255, 0, 255))
EndIf
ResetPath()
; StrokePath(0.4)
EndWith
Next
;select upmost object and draw all objects.
If LastElement(mouseOverList())
Protected upObj.i= mouseOverList()+1
ResetList(mouseOverList())
Else
upObj=0
gUpMouseOverObj=0
EndIf
Protected curObjNr.i
ForEach objList()
curObjNr = ListIndex(objList())+1
With objList()
;If Mode_Move, set new position of selObj
If curObjNr=gSelectedObject
Select gMode
Case #Mode_Move
\x=x-gRelativeSelObjMouseX
\y=y-gRelativeSelObjMouseY
;Make it eventually snap to a grid??
\x=Round(\x,#PB_Round_Nearest)
\y=Round(\y,#PB_Round_Nearest)
EndSelect
EndIf
;Draw Image and PathBox
MovePathCursor(\x,\y)
DrawVectorImage(ImageID(\image),255,\w,\h)
AddPathBox(\x, \y,\w ,\h)
;Check selObj for MouseOver
If curObjNr=gSelectedObject
If IsInsidePath(x, y, #PB_Coordinate_User)
gFlgMouseOverSelObj=#True
Else
gFlgMouseOverSelObj=#False
EndIf
EndIf
If IsInsidePath(x, y, #PB_Coordinate_User)
If curObjNr=upObj ; Wenn das Object das oberste ist, durchgeben und färben
gUpMouseOverObj=upObj
VectorSourceColor(RGBA(255, 50, 0, 255))
Else
VectorSourceColor(RGBA(255, 255, 0, 255))
EndIf
Else
VectorSourceColor(RGBA(0, 255, 0, 255))
EndIf
StrokePath(ConvertCoordinateX(0.4,0,#PB_Coordinate_Output,#PB_Coordinate_User))
EndWith
Next
ClearList(mouseOverList())
EndProcedure
Procedure RedrawSelection()
Protected hR.f
Protected x.f, y.f
x = gMouseX
y = gMouseY
hR = ConvertCoordinateX(#Handle_Radius,0,#PB_Coordinate_Output,#PB_Coordinate_User)
gFlgMouseOverHandle.i=#False
If gSelectedObject
SelectElement(objList(),gSelectedObject-1)
With objList()
;Draw Box around Object.
AddPathBox(\x,\y,\w,\h)
VectorSourceColor(RGBA(50,50,255,100))
DashPath(ConvertCoordinateX(0.6,0,#PB_Coordinate_Output,#PB_Coordinate_User),2.0)
;Draw HandleCircles round selectedObject and check for MouseOver.
AddPathCircle(\x,\y,hR)
If Not gFlgMouseOverHandle And IsInsidePath(x, y, #PB_Coordinate_User) : gFlgMouseOverHandle=1 : EndIf
AddPathCircle(\x+\w,\y,hR)
If Not gFlgMouseOverHandle And IsInsidePath(x, y, #PB_Coordinate_User) : gFlgMouseOverHandle=2 : EndIf
AddPathCircle(\x,\y+\h,hR)
If Not gFlgMouseOverHandle And IsInsidePath(x, y, #PB_Coordinate_User) : gFlgMouseOverHandle=3 : EndIf
AddPathCircle(\x+\w,\y+\h,hR)
If Not gFlgMouseOverHandle And IsInsidePath(x, y, #PB_Coordinate_User) : gFlgMouseOverHandle=4 : EndIf
AddPathCircle(\x+\w/2,\y+\h/2,hR)
If Not gFlgMouseOverHandle And IsInsidePath(x, y, #PB_Coordinate_User) : gFlgMouseOverHandle=5 : EndIf
VectorSourceColor(RGBA(50,50,255,150))
FillPath()
EndWith
EndIf
EndProcedure
Procedure RedrawAll(x.f,y.f)
If StartVectorDrawing(CanvasVectorOutput(#G_Canvas,#PB_Unit_Millimeter))
Protected i.i, imgWidth.f, imgHeight.f
ScaleCoordinates(gScaleKoords,gScaleKoords)
; imgWidth = ConvertCoordinateX(ImageWidth(#testImage),0,#PB_Coordinate_Device,#PB_Coordinate_Output)
; imgHeight = ConvertCoordinateY(0,ImageHeight(#testImage),#PB_Coordinate_Device,#PB_Coordinate_Output)
; gMouseX = ConvertCoordinateX(x,y,#PB_Coordinate_Device,#PB_Coordinate_Output)
; gMouseY = ConvertCoordinateY(x,y,#PB_Coordinate_Device,#PB_Coordinate_Output)
gMouseX = ConvertCoordinateX(x,y,#PB_Coordinate_Device,#PB_Coordinate_User)
gMouseY = ConvertCoordinateY(x,y,#PB_Coordinate_Device,#PB_Coordinate_User)
;Clear whole Canvas and draw sheet of Paper.
VectorSourceColor(RGBA(100,100,100, 255))
FillVectorOutput()
VectorSourceColor(RGBA(50,50,50, 255))
AddPathBox(10.5,10.5,145,210)
FillPath()
VectorSourceColor(RGBA(240,240,240, 255))
AddPathBox(10,10,145,210)
FillPath()
;Draw objects and check for mouseover.
RedrawObjects()
RedrawSelection()
; ;Testdraw für Coordinaten.
; AddPathBox(gMouseX, gMouseY, 10,20)
; VectorSourceColor(RGBA(Random(255), Random(255), Random(255), 255))
; FillPath()
StopVectorDrawing()
EndIf
EndProcedure
Procedure SetRelMousePos()
Protected selObj.i
SelectElement(objList(),gSelectedObject-1)
gRelativeSelObjMouseX = gMouseX- objList()\x
gRelativeSelObjMouseY = gMouseY- objList()\y
; Debug gRelativeSelObjMouseX
EndProcedure
If OpenWindow(0, 0, 0, 900, 900, "VectorDrawing", #PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_MaximizeGadget)
CanvasGadget(#G_Canvas, 0, 0, 900, 900)
UsePNGImageDecoder()
Define file.s
file = OpenFileRequester("Wähle Bilddatei (.png) aus.",GetCurrentDirectory(),"png-Image|*.png",0)
If Not LoadImage(#testImage, file):MessageRequester("Fehler", "Ohne Bild kein Programm! ;-)"):End:EndIf
ResizeImage(#testImage,250,400)
gMode = #Mode_None
Define i.i
For i=0 To 8
CreateObject()
Next
;Initial drawing
RedrawAll(0,0)
;- Event-Loop
Repeat
Event = WaitWindowEvent()
If Event=#PB_Event_Gadget
Global Gadget = EventGadget()
Global EventType = EventType()
Select Gadget
Case #G_Canvas ;Canvas Gadget Event
Select EventType
Case #PB_EventType_MouseMove
;Refresh Canvas on every move. and check for MouseOver!
RedrawAll(GetGadgetAttribute(#G_Canvas,#PB_Canvas_MouseX),GetGadgetAttribute(#G_Canvas,#PB_Canvas_MouseY))
;If Handle MouseOver, show hand symbol.
If gFlgMouseOverHandle
SetGadgetAttribute(#G_Canvas,#PB_Canvas_Cursor,#PB_Cursor_Hand)
Else
SetGadgetAttribute(#G_Canvas,#PB_Canvas_Cursor,#PB_Cursor_Default)
EndIf
Case #PB_EventType_LeftButtonDown
;Only change selected Object if LeftClick was not on selObj or Handle!
If Not (gFlgMouseOverHandle Or gFlgMouseOverSelObj)
gSelectedObject=gUpMouseOverObj
EndIf
;If clicked on selObj, start move and register rel pos of Cursor.
If gFlgMouseOverSelObj
gMode = #Mode_Move
SetRelMousePos()
EndIf
If GetGadgetAttribute(#G_Canvas,#PB_Canvas_Buttons)=#PB_MouseButton_Left
EndIf
Case #PB_EventType_LeftButtonUp
gMode = #Mode_None
Case #PB_EventType_MouseWheel
Define delta.i
delta =GetGadgetAttribute(#G_Canvas,#PB_Canvas_WheelDelta)
If GetGadgetAttribute(#G_Canvas,#PB_Canvas_Modifiers) = #PB_Canvas_Control
gScaleKoords*(1.0+delta*0.1)
If gScaleKoords<0.4: gScaleKoords=0.4:EndIf
If gScaleKoords>3.0: gScaleKoords=3.0:EndIf
RedrawAll(GetGadgetAttribute(#G_Canvas,#PB_Canvas_MouseX),GetGadgetAttribute(#G_Canvas,#PB_Canvas_MouseY))
EndIf
EndSelect
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
EndIf