Ja ich hab immer noch meine Mathe & XY Achsen Probleme
Ich komme absolute nicht mehr weiter, ich hab vor 3 Jahren schon mal ein THread gemacht, da ging
es um die Zentrierung (das hab ich soweit hingekriegt) seit 2 Wochen schreib ich an meinem Tool wieder weiter, und seit ca 5 Tagen (Zeitgefühl verloren) hänge ich wieder an dem Problem (Ich bin fertig mit meinem Tool, da ist es um so frutierender 5 Tage fest zu hängen) weil ich damals aufgegeben hab.
Jetzt bin ich wieder kurz vorm aufgeben, aber davor dachte ich mir, bastel ich mal ein simples kleines Tool
das das Problem aufzeigt, und hoffe drauf das es eine Lösung gibt, und mir geholfen wird.
Achtung was bei kleinen Images noch mit dem Fokus funzt, kann bei großen schon wieder ganz anders sein !
Es ist wie verhext ich finde keine Formel die es schafft, das
der Fokus richtig bleibt.
Beispiel wie beknackt das mit dem Fokus ist: Mit dem Testbild und 800x800, per MOV L Taste die X Position
auf 190 bringen, jetzt sind beide Linien übereinander, kaum zoomt mann driftet es in eine Richtung ab.
Erst bei ~300% Zoom Stabilisiert sich die Abdriftung. Bei MOV R ist es wieder anders, und ....... ach schaut einfach, es
ist nur noch frustierend.
Doppelklick auf's image um es zu resizen.
3 Testfiles hab ich weiter unten verlinkt.
Code: Alles auswählen
UseJPEGImageDecoder()
UsePNGImageDecoder()
;/ WIN
Enumeration
#MainWin
EndEnumeration
;/ GADGET
Enumeration
#XS
#bla
#stepLeft
#stepRight
#stepUP
#stepDOWN
#CleanLine
#CenterB
#showline
#ZoomIN
#ResetZoom
#ActPosMouse
#ActPosScroll
EndEnumeration
;/IMAGE
Enumeration
#testimg
#Zoom
EndEnumeration
#BAR = 0
#BorderKon = 380
Global Global_Last_ZoomPP = 100
Global Global_Last_XPOS, Global_Last_YPOS
Global Global_CenterX, Global_CenterY
Procedure.S CalcImageSize(ProtTmpPic.i,MaximumW,MaximumH)
;Debug ""
;Debug "-->COMMAND=CalcImageSize()"
IMG_W = ImageWidth(ProtTmpPic) : IMG_H = ImageHeight(ProtTmpPic)
;Debug "ProtTMPPicID="+ProtTmpPic
;Debug "IMG_W @ ProtTmpPic="+IMG_W+" | IMG_H @ ProtTmpPic="+IMG_H
If IMG_W > IMG_H
;Debug "BILD -> BREITER ALS HÖHER"
ASPECT.f=IMG_W/IMG_H
; Debug "ASPECT RATIO" : Debug ASPECT
;
New_H=MaximumW/ASPECT
;
; Debug "MAXIMUM WIDTH"
; Debug MaximumW
;
; Debug "NEW HEIGHT"
; Debug New_H
;
If New_H > MaximumH
Differenz=New_H-MaximumH
New_H=New_H-Differenz
New_W=MaximumW-Differenz
; Debug "NEUE HÖHE IST HÖHER ALS DER RAHMEN"
; Debug "DIFFERENZ="+Str(Differenz)
;
; Debug "NEUE MASSE NACH DER DIFFERENZ BERECHNUNG"
; Debug "W"+Str(New_W)+"xH"+Str(New_H)
Else
New_W=MaximumW
EndIf
Debug "--RETURN FROM CalcImageSize()"
ProcedureReturn Str(New_W)+":"+Str(New_H)
ElseIf IMG_W < IMG_H
;Debug "BILD -> HÖHER ALS BREITER"
;Debug "MAXIMUM HEIGHT"
;Debug MaximumH
;
ASPECT.f=IMG_H/IMG_W
;Debug "ASPECT RATIO" : Debug ASPECT
New_W=MaximumH/ASPECT
;Debug "MAXIMUM HEIGHT"
;Debug MaximumH
;
;Debug "NEW WIDTH"
;Debug New_W
If New_W > MaximumW
Differenz=New_W-MaximumW
New_W=New_W-Differenz
New_H=MaximumH-Differenz
;Debug "NEUE BREITE IST BREITER ALS DER RAHMEN"
;Debug "DIFFERENZ="+Str(Differenz)
;
;Debug "NEUE MASSE NACH DER DIFFERENZ BERECHNUNG"
;Debug "W"+Str(New_W)+"xH"+Str(New_H)
Else
New_H=MaximumH
;Debug "JOA="+New_H
EndIf
Debug "--RETURN FROM CalcImageSize()"
ProcedureReturn Str(New_W)+":"+Str(New_H)
Else
;Debug "BILD -> HAT SELBE HÖEHE UND BREITE"
If MaximumW > MaximumH
;Debug "RAHMEN BREITER ALS HOCH"
Debug "--RETURN FROM CalcImageSize()"
ProcedureReturn Str(MaximumH)+":"+Str(MaximumH)
ElseIf MaximumW < MaximumH
;Debug "RAHMEN HÖHER ALS BREIT"
Debug "--RETURN FROM CalcImageSize()"
ProcedureReturn Str(MaximumW)+":"+Str(MaximumW)
Else
; Debug "RAHMEN BREITE = HÖHE"
Debug "--RETURN FROM CalcImageSize()"
ProcedureReturn Str(MaximumW)+":"+Str(MaximumH)
EndIf
EndIf
EndProcedure
Procedure SetScrollSIZES()
If IsImage(#Zoom)
IMG_TO_USE = #Zoom
Else
IMG_TO_USE = #testimg
EndIf
PicW = ImageWidth(IMG_TO_USE) : PicH = ImageHeight(IMG_TO_USE)
SetGadgetAttribute(#XS,#PB_ScrollArea_InnerWidth,PicW + #BorderKon * 2)
SetGadgetAttribute(#XS,#PB_ScrollArea_InnerHeight,PicH + #BorderKon * 2)
MaxRealX = GetGadgetAttribute(#XS,#PB_ScrollArea_InnerWidth)
MaxRealX = MaxRealX - (#BorderKon * 2) - 19 ;/ WARUM 19 ?
StatusBarText(#BAR,1,"Center Pos = "+Str(MaxRealX / 2))
StatusBarText(#BAR,2,"Max RealX = "+MaxRealX)
EndProcedure
Procedure.i GetCenterX(NormIMG,AutoGetPicData = #False)
Shared BreiteGadget, BreiteScrollTeil, MaxRealX
Debug "GET CENTER X()"
MaxRealX = GetGadgetAttribute(#XS,#PB_ScrollArea_InnerWidth)
MaxRealX = MaxRealX - (#BorderKon * 2) - 19 ;/ WARUM 19 ?
StatusBarText(#BAR,1,"Center Pos = "+Str(MaxRealX / 2))
StatusBarText(#BAR,2,"Max RealX = "+MaxRealX)
If AutoGetPicData
If IsImage(#Zoom)
PicW=ImageWidth(#Zoom)
Else
PicW=ImageWidth(#testimg)
EndIf
XX = (PicW - BreiteGadget) + BreiteScrollTeil
XX = (XX / 2 ) + #BorderKon
Else
If NormIMG
PicW=ImageWidth(#testimg)
XX = (PicW - BreiteGadget) + BreiteScrollTeil
XX = (XX / 2 ) + #BorderKon
Else
If IsImage(#Zoom)
PicW=ImageWidth(#Zoom)
XX = (PicW - BreiteGadget) + BreiteScrollTeil
XX = (XX / 2 ) + #BorderKon
Else
ProcedureReturn -1
EndIf
EndIf
EndIf
ProcedureReturn XX
EndProcedure
Procedure.i GetCenterY(NormIMG,AutoGetPicData = #False)
Shared HoeheGadget, BreiteScrollTeil
Debug "GET CENTER Y()"
If AutoGetPicData
If IsImage(#Zoom)
PicH=ImageHeight(#Zoom)
Else
PicH=ImageHeight(#testimg)
EndIf
YYY = (PicH - HoeheGadget) + BreiteScrollTeil
YYY = (YYY / 2) + #BorderKon
Else
If NormIMG
PicH=ImageHeight(#testimg)
YYY = (PicH - HoeheGadget) + BreiteScrollTeil
YYY = (YYY / 2) + #BorderKon
Else
If IsImage(#Zoom)
PicH=ImageHeight(#Zoom)
YYY = (PicH - HoeheGadget) + BreiteScrollTeil
YYY = (YYY / 2) + #BorderKon
Else
ProcedureReturn -1
EndIf
EndIf
EndIf
ProcedureReturn YYY
EndProcedure
Procedure CenterBar()
Shared BreiteGadget, HoeheGadget, BreiteScrollTeil, MaxRealX
MaxRealX = GetGadgetAttribute(#XS,#PB_ScrollArea_InnerWidth)
MaxRealX = MaxRealX - (#BorderKon * 2) - 19 ;/ WARUM 19 ?
StatusBarText(#BAR,1,"Center Pos = "+Str(MaxRealX / 2))
StatusBarText(#BAR,2,"Max RealX = "+MaxRealX)
If Global_Last_ZoomPP = 100
PicW=ImageWidth(#testimg) : PicH=ImageHeight(#testimg)
XX = (PicW - BreiteGadget) + BreiteScrollTeil
YYY = (PicH - HoeheGadget) + BreiteScrollTeil
SetGadgetAttribute(#XS,#PB_ScrollArea_X,(XX / 2) + #BorderKon)
SetGadgetAttribute(#XS,#PB_ScrollArea_Y,(YYY / 2) + #BorderKon)
Else
PicW=ImageWidth(#Zoom) : PicH=ImageHeight(#Zoom)
XX = (PicW - BreiteGadget) + BreiteScrollTeil
YYY = (PicH - HoeheGadget) + BreiteScrollTeil
SetGadgetAttribute(#XS,#PB_ScrollArea_X,(XX / 2) + #BorderKon)
SetGadgetAttribute(#XS,#PB_ScrollArea_Y,(YYY / 2) + #BorderKon)
EndIf
Global_CenterX = GetCenterX(0,#True)
Global_CenterY = GetCenterY(0,#True)
Debug "Global_CenterX="+Global_CenterX
Debug "Global_CenterY="+Global_CenterY
SetGadgetText(#ActPosScroll,Str(GetGadgetAttribute(#XS,#PB_ScrollArea_X)))
EndProcedure
Procedure ZoomIN(VisibleScrollW,VisibleScrollH,BreiteScrollTeil)
Debug ""
Debug "ZoomIN()"
Shared JStep
Level = Global_Last_ZoomPP
If Level = 100
W_OLD = ImageWidth(#testimg) : H_OLD = ImageHeight(#testimg)
IMG_TO_USE = #testimg
Else
W_OLD = ImageWidth(#Zoom) : H_OLD = ImageHeight(#Zoom)
IMG_TO_USE = #Zoom
EndIf
If Global_CenterX = Global_Last_XPOS And Global_CenterY = Global_Last_XPOS
Centered = #True
Debug "--- CENTERED ---"
EndIf
Global_Last_ZoomPP + 20
Level = Global_Last_ZoomPP
tmp_size$ = CalcImageSize(IMG_TO_USE, VisibleScrollW - BreiteScrollTeil, VisibleScrollH - BreiteScrollTeil)
IMG_W = Val(StringField(tmp_size$,1,":")) : IMG_H = Val(StringField(tmp_size$,2,":"))
one_w.f = IMG_W / 100 : one_h.f = IMG_H / 100
one_w.f * Level : one_h.f * Level
one_w.f=Round(one_w,#PB_Round_Down) : one_h.f=Round(one_h,#PB_Round_Down)
CopyImage(#testimg,#Zoom)
ResizeImage(#Zoom,one_w,one_h)
If Level > 100
StatusBarText(#BAR,5,"Zommed Size = "+Str(one_w)+"x"+Str(one_h))
EndIf
diff_w = one_w - W_OLD
diff_h = one_h - H_OLD
Debug "DIFF="+diff_w
Debug "one_w="+one_w
Debug "W_OLD="+W_OLD
SetGadgetState(#bla,ImageID(#Zoom))
SetScrollSIZES()
If Level = 100
CenterBar()
Global_Last_XPOS = Global_CenterX
Global_Last_YPOS = Global_CenterY
Else
If Centered = #True
CenterBar()
Global_Last_XPOS = Global_CenterX
Global_Last_YPOS = Global_CenterY
Else
;/ ICH DREHE NOCH DURCH ! ES ERGIBT KEINEN SINN ! ICH SITZE SEIT EINER WOCHE AN DEM PROBLEM DES ABDRIFTENS NACH DEM ZOOM
;/ ICH HABE GEFÜHLTE 5 MILLIONEN MÖGLICHKEITEN UND FORMELN PROBIERT, GERSTEN BIN ICH CA 12 STUNDEN DRAN GESESSEN UND ES HAT NICHTS GEBRACHT
;/ WAS BEI IMAGESIZES DIE z.B 1000x600 HABEN GEHT, GEHT BEI z.B 2560x1920
;/ NICHT MEHR ! ZENTRIEREN -> REINZOOMEN -> UM 2 TICKS NACH LINKS VERSCHIEBEN, WIEDER ZOOMEN, UND DER FOKUS DRIFTET
;/ IN DIE EINE ODER ANDERE RICHTUNG AB, UND WENN MANN DANN ETWAS HAT, DAS NOCH 2 TICKS NACH LINKS GEHT, GEHT
;/ ES WEITER AUSSEN NICHT MEHR ! VERDAMMT ES MUSS IRGENDWIE GEHEN ! DIESER URALTE BESCHEUERTE VallenJPEGGER VON 2004 !
;/ KANN DAS DOCH AUCH. DA WO DER FOKUS IST, DA BLEIBT ER AUCH. DIESE VERDAMMTE SCROLL AREA GADGET DRIFTET AB
;/ KANN DIE DIFFERENZ BERECHNEN, VOM BILD, VON DER BAR, JEDE ÄNDEUNG HAB ICH PROBIERT, GEDREHT, GEWENDET WIE BLÖD, GEHT NICHT !
Debug ""
Debug "Global_CenterX (OLD STATE Before ScrollW Change)="+Global_CenterX
If Global_Last_XPOS < Global_CenterX
Debug "LEFT from X Axis"
If Global_CenterX - Global_Last_XPOS <= JStep
Debug "---------DUMB CASE 1"
SetGadgetAttribute(#XS,#PB_ScrollArea_X,Global_Last_XPOS + (diff_w / 2) - (BreiteScrollTeil / 4))
Else
SetGadgetAttribute(#XS,#PB_ScrollArea_X,Global_Last_XPOS + (diff_w / 2) - BreiteScrollTeil)
EndIf
ElseIf Global_Last_XPOS > Global_CenterX
Debug "RIGHT from X Axis"
If Global_Last_XPOS + diff_w <= GetCenterX(0,#True)
Debug "SHIT 1 X" : Debug "SHIT 1 X" : Debug "SHIT 1 X"
SetGadgetAttribute(#XS,#PB_ScrollArea_X,Global_Last_XPOS + diff_w + (BreiteScrollTeil * 2))
shitX = 1
Else
If Global_Last_XPOS + diff_w - (BreiteScrollTeil * 3) <= GetCenterX(0,#True)
Debug "SHIT 2 X" : Debug "SHIT 2 X" : Debug "SHIT 2 X"
SetGadgetAttribute(#XS,#PB_ScrollArea_X,Global_Last_XPOS + diff_w + (BreiteScrollTeil * 3))
shitX = 2
EndIf
EndIf
If shitX = 0
If Global_Last_XPOS - Global_CenterX <= JStep
Debug "---------DUMB CASE 2"
dumbX = (BreiteScrollTeil * 2) - 2
Debug "dumbX="+dumbX
SetGadgetAttribute(#XS,#PB_ScrollArea_X,Global_Last_XPOS + diff_w - dumbX)
Else
SetGadgetAttribute(#XS,#PB_ScrollArea_X,Global_Last_XPOS + diff_w - (BreiteScrollTeil * 3))
EndIf
EndIf
Else
SetGadgetAttribute(#XS,#PB_ScrollArea_X,GetCenterX(0,#True))
EndIf
If Global_Last_YPOS < Global_CenterY
Debug "TOP from Y Axis"
If Global_CenterY - Global_Last_YPOS <= JStep
Debug "---------DUMB CASE 3"
SetGadgetAttribute(#XS,#PB_ScrollArea_Y,Global_Last_YPOS + (diff_h / 2) - (BreiteScrollTeil / 4))
Else
SetGadgetAttribute(#XS,#PB_ScrollArea_Y,Global_Last_YPOS + (diff_h / 2) - BreiteScrollTeil)
EndIf
ElseIf Global_Last_YPOS > Global_CenterY
Debug "BOTTOM from Y Axis"
If Global_Last_YPOS + diff_h <= GetCenterY(0,#True)
Debug "--SHIT 1 Y" : Debug "--SHIT 1 Y" : Debug "--SHIT 1 Y"
SetGadgetAttribute(#XS,#PB_ScrollArea_Y,Global_Last_YPOS + diff_h + (BreiteScrollTeil * 2))
shit = 1
Else
If Global_Last_YPOS + diff_h - (BreiteScrollTeil * 3) <= GetCenterY(0,#True)
Debug "--SHIT 2 Y" : Debug "--SHIT 2 Y" : Debug "--SHIT 2 Y"
SetGadgetAttribute(#XS,#PB_ScrollArea_Y,Global_Last_YPOS + diff_h + (BreiteScrollTeil * 3))
shit = 2
EndIf
EndIf
If shitY = 0
If Global_Last_YPOS - Global_CenterY <= JStep
Debug "---------DUMB CASE 4"
dumbY = (BreiteScrollTeil * 2) - 2
SetGadgetAttribute(#XS,#PB_ScrollArea_Y,Global_Last_YPOS + (diff_h) - dumbY)
Else
SetGadgetAttribute(#XS,#PB_ScrollArea_Y,Global_Last_YPOS + (diff_h) - BreiteScrollTeil * 3)
EndIf
EndIf
Else
Debug "SAME Y"
SetGadgetAttribute(#XS,#PB_ScrollArea_Y,GetCenterY(0,#True))
EndIf
Global_CenterX = GetCenterX(#False)
Global_CenterY = GetCenterY(#False)
Global_Last_XPOS = GetGadgetAttribute(#XS,#PB_ScrollArea_X)
Global_Last_YPOS = GetGadgetAttribute(#XS,#PB_ScrollArea_Y)
SetGadgetText(#ActPosScroll,Str(GetGadgetAttribute(#XS,#PB_ScrollArea_X)))
EndIf
EndIf
Debug "IMG W SIZE AFTER ZOOM="+one_w
Debug "IMG H SIZE AFTER ZOOM="+one_h
StatusBarText(#BAR,6,"Inner W = "+GetGadgetAttribute(#XS,#PB_ScrollArea_InnerWidth))
StatusBarText(#BAR,7,"Zoom = "+Str(Level)+"%")
SetGadgetText(#ActPosScroll,Str(GetGadgetAttribute(#XS,#PB_ScrollArea_X)))
EndProcedure
Procedure ResetZoom()
Shared MaxRealX
If IsImage(#Zoom)
FreeImage(#Zoom)
EndIf
SetScrollSIZES()
Global_CenterX = GetCenterX(0,#True)
Global_CenterY = GetCenterY(0,#True)
Global_Last_ZoomPP = 100
MaxRealX = GetGadgetAttribute(#XS,#PB_ScrollArea_InnerWidth)
MaxRealX = MaxRealX - (#BorderKon * 2) - 19 ;/ WARUM 19 ?
StatusBarText(#BAR,1,"Center Pos = "+Str(MaxRealX / 2))
StatusBarText(#BAR,2,"Max RealX = "+MaxRealX)
Debug "SCOLL INNER W="+GetGadgetAttribute(#XS,#PB_ScrollArea_InnerWidth)
StatusBarText(#BAR,6,"Inner W = "+GetGadgetAttribute(#XS,#PB_ScrollArea_InnerWidth))
StatusBarText(#BAR,7,"Zoom = 100%")
SetGadgetText(#ActPosScroll,Str(GetGadgetAttribute(#XS,#PB_ScrollArea_X)))
SetGadgetState(#bla,ImageID(#testimg))
EndProcedure
Procedure MakeLine()
WarumAcht = 8 ;/ WARUM ZUM TEUFEL 8 ?
StartDrawing(WindowOutput(#MainWin))
Line((WindowWidth(#MainWin) / 2) - WarumAcht, 0 , 1 ,WindowHeight(#MainWin),#magenta)
StopDrawing()
EndProcedure
Procedure ChangeFRes()
If IsImage(#testimg)
PicW = ImageWidth(#testimg) : PicH = ImageHeight(#testimg)
tmp_str1$ = InputRequester("Change Res from #testimg","and Reset Zoom and Center",Str(PicW)+"x"+Str(PicH))
If tmp_str1$
tmp_str1$ = LCase(tmp_str1$)
tmp_str1$ = RemoveString(tmp_str1$," ")
If CountString(tmp_str1$,"x") = 1
PicW = Val(StringField(tmp_str1$,1,"x"))
PicH = Val(StringField(tmp_str1$,2,"x"))
If PicW > 10 And PicH > 10
res_sizeW = PicW ;/ Warum müssen es ausgerechnett 4 weniger als die InnerWidth sein damit kein Scroll Balken da ist ?
;/ Und warum ist dann die Mittel Linie die sich aus WindowWidth / 2 ergibt verschoben ?
res_sizeH = PicH
Shared file$, BreiteInnen, HoeheInnen
If LoadImage(500,file$)
CopyImage(500,#testimg) : FreeImage(500)
ResizeImage(#testimg,res_sizeW,res_sizeH)
StatusBarText(#BAR,0,Str(PicW)+"x"+Str(PicH))
OpenGadgetList(#XS)
ImageGadget(#bla,#BorderKon,#BorderKon,0,0,ImageID(#testimg))
ResizeGadget(#bla,#PB_Ignore,#PB_Ignore,PicW,PicH)
CloseGadgetList()
BreiteInnen = PicW : HoeheInnen = PicH
ResetZoom() : CenterBar()
Debug "load OK"
Else
ProcedureReturn
EndIf
Else
ProcedureReturn
EndIf
Else
ProcedureReturn
EndIf
EndIf
Else
ProcedureReturn
EndIf
EndProcedure
OpenWindow(#MainWin,0,0,820,860,"New Prog",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
SmartWindowRefresh(#MainWin,1)
CreateStatusBar(#BAR,WindowID(#MainWin))
AddStatusBarField(65)
AddStatusBarField(100)
AddStatusBarField(95)
AddStatusBarField(100)
AddStatusBarField(90)
AddStatusBarField(140)
AddStatusBarField(90)
AddStatusBarField(80)
ButtonGadget(#stepLeft,0,5,60,20,"MOV L")
ButtonGadget(#stepRight,70,5,60,20,"MOV R")
ButtonGadget(#stepUP,160,5,60,20,"MOV U")
ButtonGadget(#stepDOWN,230,5,60,20,"MOV D")
ButtonGadget(#CenterB,310,5,70,20,"Center")
ButtonGadget(#CleanLine,400,5,60,20,"CleanLine")
ButtonGadget(#showline,465,5,60,20,"Show Line")
ButtonGadget(#ZoomIN,545,5,50,20,"ZoomIN")
ButtonGadget(#ResetZoom,600,5,70,20,"Reset ZOOM")
StringGadget(#ActPosMouse,675,5,80,20,"",#PB_String_ReadOnly)
StringGadget(#ActPosScroll,760,5,50,20,"",#PB_String_ReadOnly)
JStep = 10
BreiteScrollTeil = 20 ;/ Der hässliche Scroll Balken rechts, selbst wenn nicht sichtbar muss der kalkuliert werden.
BreiteGadget = 800
HoeheGadget = BreiteGadget
ScrollAreaGadget(#XS,10,30, BreiteGadget, HoeheGadget, 100 , 100, JStep,#PB_ScrollArea_Center)
SetActiveGadget(#XS)
If file$ = ""
MessageRequester("INFO","Set a File")
End
EndIf
If LoadImage(#testimg,file$)
res_sizeW = 800 ; 796 und da wäre kein Scrollbalken obwohl Breite Gadget = 800
;/ Falls Bildgröße gleich BreiteGadget und HoeheGadget, warum müssen es 4 oder 5 Pixel, weniger als die InnerWidth sein damit
;/ kein Scroll Balken da ist ?
;/ Und warum ist dann die Mittel Linie die sich aus WindowWidth / 2 ergibt verschoben ? ausser mann macht bei MakeLine() - 9
res_sizeH = 800
ResizeImage(#testimg,res_sizeW,res_sizeH)
PicW = ImageWidth(#testimg)
PicH = ImageHeight(#testimg)
StatusBarText(#BAR,0,Str(PicW)+"x"+Str(PicH))
ImageGadget(#bla,#BorderKon,#BorderKon,0,0,ImageID(#testimg))
ResizeGadget(#bla,#PB_Ignore,#PB_Ignore,PicW,PicH)
BreiteInnen = PicW
HoeheInnen = PicH
EndIf
If PicW % 2 = 1
Debug "UNGERADE"
Krum = 1
Else
Debug "GERADE"
Krum = 0
EndIf
CloseGadgetList()
SetScrollSIZES()
CenterBar()
Global_Last_XPOS = Global_CenterX
Global_Last_YPOS = Global_CenterY
SetGadgetText(#ActPosScroll,Str(GetGadgetAttribute(#XS,#PB_ScrollArea_X)))
MaxRealX = GetGadgetAttribute(#XS,#PB_ScrollArea_InnerWidth)
MaxRealX = MaxRealX - (#BorderKon * 2) - 19 ;/ WARUM 19 ?
Debug "Echte Maximale X Position="+MaxRealX
StatusBarText(#BAR,1,"Center Pos = "+Str(MaxRealX / 2))
StatusBarText(#BAR,2,"Max RealX = "+MaxRealX)
StatusBarText(#BAR,3,"Window Mid = "+Str((WindowWidth(#MainWin) / 2) + 8)) ;/ WARUM 8 ?
StatusBarText(#BAR,4,"ScrollStep = "+Str(JStep))
StatusBarText(#BAR,5,"Zommed Size = ")
StatusBarText(#BAR,6,"Inner W = "+GetGadgetAttribute(#XS,#PB_ScrollArea_InnerWidth))
StatusBarText(#BAR,7,"Zoom = 100%")
AddWindowTimer(#MainWin,30,500)
Repeat
Event = WaitWindowEvent()
If Event = #WM_MOUSEMOVE
mx = WindowMouseX(#MainWin) : my = WindowMouseY(#MainWin)
SetGadgetText(#ActPosMouse,"X="+Str(mx)+" | Y="+Str(my))
EndIf
If Event = #PB_Event_Gadget
EventGadget = EventGadget()
If EventGadget = #stepLeft
Debug "#StepLeft EVENT"
SetGadgetAttribute(#XS,#PB_ScrollArea_X,GetGadgetAttribute(#XS,#PB_ScrollArea_X) - JStep)
SetGadgetText(#ActPosScroll,Str(GetGadgetAttribute(#XS,#PB_ScrollArea_X)))
MAKE = #True
Global_Last_XPOS = GetGadgetAttribute(#XS,#PB_ScrollArea_X)
Global_Last_YPOS = GetGadgetAttribute(#XS,#PB_ScrollArea_Y)
Global_CenterX = GetCenterX(0,#True)
Global_CenterY = GetCenterY(0,#True)
Debug "Global_Last_XPOS="+Global_Last_XPOS
Debug "Global_Last_YPOS="+Global_Last_YPOS
Debug "Global_CenterX="+Global_CenterX
Debug "Global_CenterY="+Global_CenterY
Debug ""
EndIf
If EventGadget = #stepRight
SetGadgetAttribute(#XS,#PB_ScrollArea_X,GetGadgetAttribute(#XS,#PB_ScrollArea_X) + JStep)
SetGadgetText(#ActPosScroll,Str(GetGadgetAttribute(#XS,#PB_ScrollArea_X)))
MAKE = #True
Global_Last_XPOS = GetGadgetAttribute(#XS,#PB_ScrollArea_X)
Global_Last_YPOS = GetGadgetAttribute(#XS,#PB_ScrollArea_Y)
Global_CenterX = GetCenterX(0,#True)
Global_CenterY = GetCenterY(0,#True)
EndIf
If EventGadget = #stepUP
Debug "#StepLeft EVENT"
SetGadgetAttribute(#XS,#PB_ScrollArea_Y,GetGadgetAttribute(#XS,#PB_ScrollArea_Y) - JStep)
;SetGadgetText(#ActPosScroll,Str(GetGadgetAttribute(#XS,#PB_ScrollArea_Y)))
MAKE = #True
Global_Last_XPOS = GetGadgetAttribute(#XS,#PB_ScrollArea_X)
Global_Last_YPOS = GetGadgetAttribute(#XS,#PB_ScrollArea_Y)
Global_CenterX = GetCenterX(0,#True)
Global_CenterY = GetCenterY(0,#True)
Debug "Global_Last_XPOS="+Global_Last_XPOS
Debug "Global_Last_YPOS="+Global_Last_YPOS
Debug "Global_CenterX="+Global_CenterX
Debug "Global_CenterY="+Global_CenterY
Debug ""
EndIf
If EventGadget = #stepDOWN
SetGadgetAttribute(#XS,#PB_ScrollArea_Y,GetGadgetAttribute(#XS,#PB_ScrollArea_Y) + JStep)
;SetGadgetText(#ActPosScroll,Str(GetGadgetAttribute(#XS,#PB_ScrollArea_X)))
MAKE = #True
Global_Last_XPOS = GetGadgetAttribute(#XS,#PB_ScrollArea_X)
Global_Last_YPOS = GetGadgetAttribute(#XS,#PB_ScrollArea_Y)
Global_CenterX = GetCenterX(0,#True)
Global_CenterY = GetCenterY(0,#True)
EndIf
If EventGadget = #CleanLine
SetWindowState(#MainWin,#PB_Window_Minimize)
SetWindowState(#MainWin,#PB_Window_Normal)
MessageRequester("Center Pos","MaxRealX / 2 = "+Str(MaxRealX / 2))
StatusBarText(#BAR,1,"Center Pos = "+Str(MaxRealX / 2))
EndIf
If EventGadget = #showline
MakeLine()
EndIf
If EventGadget = #XS
SetGadgetText(#ActPosScroll,Str(GetGadgetAttribute(#XS,#PB_ScrollArea_X)))
MakeLine()
EndIf
If EventGadget = #ZoomIN
ZoomIN(BreiteGadget,HoeheGadget,BreiteScrollTeil)
MAKE = #True
EndIf
If EventGadget = #ResetZoom
ResetZoom()
MAKE = #True
EndIf
If EventGadget = #bla And EventType() = #PB_EventType_LeftDoubleClick
ChangeFRes()
EndIf
If EventGadget = #CenterB
CenterBar()
Global_Last_XPOS = Global_CenterX
Global_Last_YPOS = Global_CenterY
MAKE = #True
EndIf
EndIf
If Event = #PB_Event_Timer And EventTimer() = 30
If MAKE = #True
MakeLine()
EndIf
MAKE = #False
EndIf
If Event = #PB_Event_CloseWindow
Break
EndIf
ForEver
Hier noch schnell der Code um das TestPic zu basteln.
Code: Alles auswählen
Procedure MakeTestPic(TestPicW,TestPicH)
w = TestPicW : h = TestPicH
If TestPicW < 100
w = 100
EndIf
If TestPicH < 100
h = 100
EndIf
CreateImage(5000,w,h)
StartDrawing(ImageOutput(5000))
DrawingMode(#PB_2DDrawing_Outlined)
Line(w/2,0,1,h,#White)
Line(0,h/2,w,1,#White)
Line(w/4,0,1,h,#yellow)
Line(0,h/4,w,1,#yellow)
Line((w/4) * 3,0,1,h,#yellow)
Line(0,h/4 * 3,w,1,#yellow)
Box((w/2) - 50,(h/2) - 45,100,100,#red)
StopDrawing()
SaveImage(5000,GetCurrentDirectory()+"tt.bmp")
EndProcedure