Vector graphics can be used for different resolutions at the same aspect ration.
They'll still be distorted when stretched to another aspect ratio.
I don't know if there is any lib for svg and the likes, but simple vector graphics ae manageable with the drawing functions of pb.
This code opens 3 windows. 1024x768, 800x600 and 400x200
1024 and 800 are both 4:3 thus it looks nicely zoomed.
400x200 is 2:1 and everything is stretched in width.
So you still got this problem with vector graphics but any resolution with the same aspect ratio can easily be created.
Again that's on the fly, so that you can actually work with ExamineScreenModes() if you use fullscreen.
Sorry, this code is not anywhere near perfect coding style. It's just been made up from the scratch right now, so nothing you would add to your project. Just a basic example

Close any window to quit.
EDIT: Vectors are as you may recall from math class just normal lines stretched or compressed by a factor.
You just carry on as normal and then switch the factor.
I used 800 as the factor in X-direction and 600 as the factor in Y-direction, meaning every x-position and width are multiplied by 800 and any y-position and height is multiplied by 600 (ok. not really. They're multiplied by 1*800/800 and 1*600/600)
Then you determine how great the new factor for the new resolution is and you've got your zoom.
So starting with a point 100,100 the base vector is x = 1*100, y = 1*100 (actually: 800/800*100 etc...)
The actual point with a resolution 1024x768 is: x = 1024/800*100, y = 768/600*100 => x = 128, y = 128
Code:
;very very basic vector example
;base = 800x600
Enumeration 1
#Vector_Type_LineXY
#Vector_Type_Box
#Vector_Type_Circle
EndEnumeration
Structure struct_vectorElement
type.i
param1.i
param2.i
param3.i
param4.i
color.i
EndStructure
Global NewList vectorElement.struct_vectorElement()
Procedure DrawVector_LineXY(x1.i, y1.i, x2.i, y2.i, color.i)
AddElement(vectorElement())
vectorElement()\type = #Vector_Type_LineXY
vectorElement()\param1 = x1
vectorElement()\param2 = y1
vectorElement()\param3 = x2
vectorElement()\param4 = y2
vectorElement()\color = color
EndProcedure
Procedure DrawVector_Box(x.i, y.i, width.i, height.i, color.i)
AddElement(vectorElement())
vectorElement()\type = #Vector_Type_Box
vectorElement()\param1 = x
vectorElement()\param2 = y
vectorElement()\param3 = width
vectorElement()\param4 = height
vectorElement()\color = color
EndProcedure
Procedure PrintVectorCanvas(width.i, height.i, image.i)
factorX.f = width / 800
factorY.f = height / 600
StartDrawing(ImageOutput(image))
ResetList(vectorElement())
ForEach vectorElement()
Select vectorElement()\type
Case #Vector_Type_LineXY
LineXY( vectorElement()\param1* factorX, vectorElement()\param2* factorY, vectorElement()\param3* factorX, vectorElement()\param4* factorY, vectorElement()\color)
Case #Vector_Type_Box
Box(vectorElement()\param1* factorX, vectorElement()\param2* factorY, vectorElement()\param3* factorX, vectorElement()\param4* factorY, vectorElement()\color)
EndSelect
Next
StopDrawing()
EndProcedure
Procedure FlushVectorCanvas()
ClearList(vectorElement())
EndProcedure
DrawVector_LineXY(0,0,100,100,$0000FF)
DrawVEctor_Box(100,100,50,80,$FF0000)
OpenWindow(0,10,10,1024,768,"")
image = CreateImage(#PB_Any,1024,768)
PrintVectorCanvas(1024,768, image)
ImageGadget(0,0,0,1024,768,ImageID(image))
OpenWindow(1,10,10,800,600,"")
image = CreateImage(#PB_Any,800,600)
PrintVectorCanvas(800, 600, image)
ImageGadget(1,0,0,800,600,ImageID(image))
OpenWindow(2,10,10,400,200,"")
image = CreateImage(#PB_Any,400,200)
PrintVectorCanvas(400, 200, image)
ImageGadget(2,0,0,400,200,ImageID(image))
Repeat
Until WaitWindowEvent(20) = #PB_Event_CloseWindow