ScrollAreaGadget Fokus driftet ab nach Zoom

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
GlassJoe
Beiträge: 108
Registriert: 11.06.2017 20:25
Computerausstattung: 2 x AMD Phenom II x4 945,2x Dell Latitude X300, Dell Latitude D410, Hp Compaq NC4400

ScrollAreaGadget Fokus driftet ab nach Zoom

Beitrag von GlassJoe »

Hallo :)

Ja ich hab immer noch meine Mathe & XY Achsen Probleme :lol:
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 :bluescreen: :bluescreen: :bluescreen: 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 die Links zu den Testfiles
Bild

Bild

Bild

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
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Benutzeravatar
GlassJoe
Beiträge: 108
Registriert: 11.06.2017 20:25
Computerausstattung: 2 x AMD Phenom II x4 945,2x Dell Latitude X300, Dell Latitude D410, Hp Compaq NC4400

Re: ScrollAreaGadget Fokus driftet ab nach Zoom

Beitrag von GlassJoe »

Ok ich bin irgendwie weiter gekommen (20% Zoom Schritte zu benutzen war keine gute Idee, mit 50 ist
es weniger verwirrend)

Also das sind meine Erkenntnisse und Notizen.

260 ist meine Zahl, und ich weiss nicht wie ich drauf komme.

-------------------------------
WICHTIG ! Hier hab ich nach jedem Zoom >MANUELL< an die richtige Stelle gesetzt, dann wieder zoom gemacht !

100 auf 150%
Danach (XPos von ScrollGD) 240 (und davor auch) und müssen auf 500 (XPos von ScrollGD)

150 auf 200%
danach 500 und müssen auf 780

200 auf 250%
danach 760 <---- MIST ! 760 / 260 sind 2,9230769230769230769230769230769

egal ? Wenn ungerade zahl, dann aufrunden b.z.w repeat bis Zahl durch nächsten Multi (3 teilbar. 3 ist auch ungerade hmm)

250 auf 300%
danach 1020 und müssen auf 1280

300 auf 350%
danach 1280 und müssen auf 1540
------------

WICHTIG ! Hier hab ich NICHT nach jedem Zoom an die richtige stelle gesetzt, ich hab gar nichts
gesetzt, KEIN SetGadgetAttribute(#XSBig,#PB_ScrollArea_X) benutzt, einfach nur Zoom, ablesen, Zoom, ablesen

Jetzt von 100 auf 150%

Landen bei 240 (Nach ZOOM) und waren bei 240 (vor ZOOM), müssen auf 500. Was 260 Unterschied sind <--- 260 ist also der Teiler/Multi

Jetzt wieder zurück auf 240, dann wieder Zoom von 150 auf 200%
wir landen wieder bei 240, und müssen auf 760. Was 520 Unterschied sind (520 / 260 = 2)

Jetzt wieder zurück auf 240, dann wieder Zoom von 200 auf 250%
wir landen wieder bei 240, und müssen auf 1020. Was 780 Unterschied sind. (780 / 260 = 3)

Jetzt wieder zurück auf 240, dann wieder Zoom von 250 auf 300% (
wir landen wieder bei 240, und müssen auf 1280. Was 1040 Unterschied sind. (1040 / 260 = 4)

Jetzt wieder zurück auf 240, dann wieder Zoom von 300 auf 350% (1300 / 260 = 5)
wir landen wieder bei 240, und müssen auf 1540. Was 1300 Unterschied sind.

(1540 - 240) / 260
(1800 - 240) / 260

Wir landen immer bei 240, also ist die 240 die zahl die wir jedes mal erst abziehen, bevor wir
das rechnen anfangen.

-------------------------------

Preisfrage !! wie komme ich Mathematisch auf 260 also Teiler/Multi ?

Ich arbeite im Vollbild. 1280x1024 (mehr gibt mein 5:4 19" nicht her)
Window ohne Rahmen, mit einem Scroll Area Gadget in Vollbild Size (aussen, nicht innerwidth) drin.
Testbild hat 2560x1920.

Links und rechts wird je die Hälfte der Bildgröße als freie fläche eingefügt.

Sieht so aus.

tmp_rand = ImageBreite / 2
#BarKon = 21 (Die Breite von dem bescheuerten Scroll Teil sind 10-10,5. Da ich gleichen abstand links
und rechts vom Bild will, mach ich gleich 2 x 10,5 = 21
Selbst wenn nicht so ein scroll Dings sichtbar ist, muss mann den Mist einkalkulieren.

WTF = 5 ;/ Weiss nicht wieso, aber muss auch hin. Wenn nicht landet das Bild nach
neu setzen von ImageGadget immer 4-5 Pixel zu weit rechts (vom Linken Rand gesehen) und ist nicht
perfekt zentriert.

ImageGadget(#BigGadget,tmp_rand + (#BarKon / 2) - WTF, tmp_rand + (#BarKon / 2) - WTF,1,1,ImageID(#Big))

Das tmp_rand auch rechts vom Image ist, erreiche ich an anderer Stelle durch

SetGadgetAttribute(#XSBig,#PB_ScrollArea_InnerWidth,PicW + (tmp_rand * 2))

Testsystem: Win 2003......immer noch :p

EDIT: Korrektur ich benutze eine #BarKon von 11, statt 21, die ich an gegebener Stelle immer Teile oder mal nehme.

EDIT2: Ok ich glaub ich weiss jetzt wie ich auf den Teiler/Multi komme.

Debug "--------PIC_w_diff="+Str(PicW - old_w)
Debug "--------barW_diff="+Str(new_bar_w - old_bar_w)
Debug "--------bar_Xdiff="+Str(Global_CenterX - Global_Last_CenterX)

Ergebnisse:
--------PIC_w_diff=630
--------barW_diff=630
--------bar_Xdiff=110

630 - 110 = 520 / 2 = 260

Wenn ich eine andere Stelle vom Bild nehme, wo der Teiler 190 sein sollte, komme ich auf.

--------PIC_w_diff=630
--------barW_diff=630
--------bar_Xdiff=250

630 - 250 = 380 / 2 = 190

:)

Jetzt muss ich das alles nur richtig umsetzen.
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Benutzeravatar
juergenkulow
Beiträge: 188
Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten

Re: ScrollAreaGadget Fokus driftet ab nach Zoom

Beitrag von juergenkulow »

Hallo GlassJoe,
100 = ScrollBereichBreite und 100= ScrollBereichHöhe beim Aufruf von ScrollAreaGadget verstehe ich nicht:

Code: Alles auswählen

; Neuaufbau zoom
UseJPEGImageDecoder()
UsePNGImageDecoder()
Declare MakeLine() 

Enumeration : #MainWin : EndEnumeration
Enumeration : #testImg : #Zoom : EndEnumeration
;/ GADGET
Enumeration :  #XS :  #bla :  #stepLeft :  #stepRight :  #stepUP  : #stepDOWN :  #CleanLine :  #CenterB
  #showline :  #ZoomIN :  #ResetZoom :  #ActPosMouse :  #ActPosScroll : EndEnumeration
#BAR = 0

#Bildbreite=800
#Bildhoehe=800
#KopfBar=30
#FussBar=30

If OpenWindow(0, 0, 0, #Bildbreite, ; 800 
              #Bildhoehe+#KopfBar+#FussBar, ; 860, 
              "ImageGadget", #PB_Window_SystemMenu | #PB_Window_BorderLess)
  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)
  
  AddWindowTimer(#MainWin,30,500)
  
  File$=OpenFileRequester("Datei","tt.bmp","Alle *.* |*.*",0)
  LoadImage(#testImg,file$)
  ScrollAreaGadget(#PB_Any, 0, 30, #Bildbreite, #Bildhoehe,ImageWidth(#testImg),ImageHeight(#testImg)) 
  ImageGadget(2,  0, 30, #Bildbreite, #Bildhoehe, ImageID(#testImg))
  Repeat 
    Event = WaitWindowEvent() 
    SetGadgetText(#ActPosMouse,Str(WindowMouseX(#MainWin))+"|"+Str(WindowMouseY(#MainWin)))
    If Event = #PB_Event_Gadget
     
      EventGadget = EventGadget()
    ElseIf  Event = #PB_Event_Timer And EventTimer() = 30 ; 2x pro Sekunde eine Linie
      MakeLine()
    EndIf
  Until Event = #PB_Event_CloseWindow
EndIf

Procedure MakeLine()
  StartDrawing(WindowOutput(#MainWin))
  Line((WindowWidth(#MainWin) / 2)+1 , 0 , 1 ,WindowHeight(#MainWin),#Magenta)
  ; Wenn ein Scrollbalken rechts hinzu kommt stimmt die x Position von Line nicht mehr. 
  StopDrawing() 
EndProcedure
Bitte stelle Deine Fragen, denn den Erkenntnisapparat einschalten entscheidet über das einzig bekannte Leben im Universum.

Jürgen Kulow Wersten :D_üsseldorf NRW D Europa Erde Sonnensystem Lokale_Flocke Lokale_Blase Orion-Arm
Milchstraße Lokale_Gruppe Virgo-Superhaufen Laniakea Sichtbares_Universum
Benutzeravatar
GlassJoe
Beiträge: 108
Registriert: 11.06.2017 20:25
Computerausstattung: 2 x AMD Phenom II x4 945,2x Dell Latitude X300, Dell Latitude D410, Hp Compaq NC4400

Re: ScrollAreaGadget Fokus driftet ab nach Zoom

Beitrag von GlassJoe »

juergenkulow hat geschrieben:Hallo GlassJoe,
100 = ScrollBereichBreite und 100= ScrollBereichHöhe beim Aufruf von ScrollAreaGadget verstehe ich nicht:
Weil sich das per extra prozedure nachträglich anpasst, nachdem ein Bild geladen ist.

Code: Alles auswählen

  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
Ich hab mittlerweile die Lösung gefunden, ich kann zu einer beliebigen position scrollen, und so weit
rein und raus zoomen wie ich will, ohne das der Fokus abweicht :) sogar auf 100% auf 300% direkt ging nach 3 Std
herumprobieren. (Hab ne Map mit Multiplikatoren erstellt. Also z.B von 150% auf 300% wurde der Multi auf 4 geändert, springt mann linear von z.B 400% auf 450% wird die 1 benutzt.) genommen

Leider geht es nicht wenn ich nach dem Zoomen, wieder an eine andere Stelle gehe, und wieder zoome :bluescreen: :bluescreen:

Probier seit paar Stunden herum mit Block Positionen (active scroll position geteilt durch 10. Weil bei mir der Scrollstep 10 ist)
die sich nach jedem cursor left/right event oder click auf MOVL/MOVR errechnen, und versuche damit
ein Ergebniss zu erzielen, aber leider ohne Erfolg. Ich hab jeden Zahlen Wert der sich ändert und ändern wird als Debug Ausgabe vor mir

Bild

Bild

aber bin zu doof um es hinzukriegen :freak:
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Demivec
Beiträge: 49
Registriert: 22.02.2008 20:49
Wohnort: Utah, USA

Re: ScrollAreaGadget Fokus driftet ab nach Zoom

Beitrag von Demivec »

Möchten Sie nur die absoluten Koordinaten eines Versatzpunkts im Fenster eines Bildes finden, das auf nicht ganzzahlige Ebenen gezoomt und in einem ImageGadget in einem ScrollAreaGadget auch mithilfe von Bildlaufleisten angezeigt wird?
Bild
Benutzeravatar
GlassJoe
Beiträge: 108
Registriert: 11.06.2017 20:25
Computerausstattung: 2 x AMD Phenom II x4 945,2x Dell Latitude X300, Dell Latitude D410, Hp Compaq NC4400

Re: ScrollAreaGadget Fokus driftet ab nach Zoom

Beitrag von GlassJoe »

Was ich möchte ist, daß ich bei 100% (also Original Größe) an einen Punkt (Sagen wir mal A) scrolle und zoome, und danach beim selben optischen punkt lande, und wenn ich weiter scrolle an Punkt B und wieder zoome, will ich auch optisch an dem selben Punkt wie B landen.

Erst hab ich die aktuelle Position vor dem ersten Zoom genommen, und den größen Unterschied zwischen dem Scrollarea Gaget der ensteht wenn von 100 auf 150% gezoomt wird.

Hab herum gerechnett und hab damit hab ich eine Zahl gehabt wie z.B 324 (nennen wir sie mal Global_Stupid_KonX)
die ich von 100 bis 600% Zoom ohne Probleme verwenden konnte. Auf 200% hab ich halt dann mal 3 gemacht, auf 250 mal 4 usw

Damit kann ich (nicht beim Testcode oben, sondern in meinem Tool das mann in meinem 3. Post sieht) bei 100% Zoom, an einer beliebigen Stelle Zoomen und lande danach genau an der selben Stelle (Pinke Mittel Linie) im Bild, auch von 150 auf 200% geht das usw dabei ist es auch völlig egal ob Flieskomma Zahl oder nicht.

Was geht, ist position Scrollen & Zoomen, und was danach nicht geht, ist an eine andere Position und wieder zoomen.
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Benutzeravatar
GlassJoe
Beiträge: 108
Registriert: 11.06.2017 20:25
Computerausstattung: 2 x AMD Phenom II x4 945,2x Dell Latitude X300, Dell Latitude D410, Hp Compaq NC4400

Re: ScrollAreaGadget Fokus driftet ab nach Zoom

Beitrag von GlassJoe »

Ok ich hab schlussendlich einen sehr gut funzenden Zoom Code (schnell und präzise, im Gegensatz zum ScrollAreaGadget) mittels Sprites und dem ScrollBarGadget hingekriegt, ganz ohne Hilfe :P

Hat ja nur Monate gedauert !

Hier der Code.

Ich hoffe ich konnte jedem anderen Noob auch helfen.

Code: Alles auswählen

  If InitSprite() = 0
    MessageRequester("Error", "Can't open screen & sprite environment!", 0)
    End
  EndIf
  
  UseJPEGImageDecoder() 
  UsePNGImageDecoder()
  UseGIFImageDecoder()
  UseTIFFImageDecoder()
  
  Enumeration ;/ GADGETS
    #XBar
    #YBar
    #Z_IN
    #Z_OUT
    #MidX
    #MidY
    #CenterAll
    #ResetZoom
  EndEnumeration
  
  Enumeration ;/ WIN
    #MainWin
  EndEnumeration
  
  Enumeration ;/ Images
    #OrigPic
    #ResPic 
  EndEnumeration
  
  Procedure.S CalcImageSize(ProtTmpPic.i,MaximumW,MaximumH,JustCalcNoIMGInput = #False, IMG_XW = 0, IMG_XH = 0)
    
    Debug ""
    Debug "-->COMMAND=CalcImageSize()"
    
    If JustCalcNoIMGInput
      IMG_W = IMG_XW : IMG_H = IMG_XH
      Debug "USE W & H INPUT"
    Else
      IMG_W = ImageWidth(ProtTmpPic) : IMG_H = ImageHeight(ProtTmpPic)  
    EndIf 
    
    Debug "ProtTMPPic="+ProtTmpPic
    
    Debug "IMG_W @ ProtTmpPic="+IMG_W+" | IMG_H @ ProtTmpPic="+IMG_H
    Debug "Max Border W="+MaximumW+" | Max Border H="+MaximumH
    
    
    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 MouseFollow(egal)
    
    Shared MouseFollow
    
    Debug ""
    Debug "-->COMMAND=MouseFollow()"
    
    src_mx = WindowMouseX(#MainWin) : src_my = WindowMouseY(#MainWin)  
    src_x = GetGadgetState(#XBar) : src_y = GetGadgetState(#YBar)
    
    Debug "src_x (VOR MouseMove)="+src_x
    Debug "src_y (VOR MouseMove)="+src_y   
    
    Repeat
      
      mx = WindowMouseX(#MainWin) : my = WindowMouseY(#MainWin)
      
      If mx <> -1 And my <> -1
        
        If src_mx <> mx Or src_my <> my 
          
          If mx > src_mx
            diff_x = mx - src_mx 
            SetGadgetState(#XBar,src_x - diff_x) 
          ElseIf mx < src_mx
            diff_x = src_mx - mx 
            SetGadgetState(#XBar,src_x + diff_x) 
            ;Else ; Nicht benutzen sonst gibt es ein kurzes Flimmern
            
          EndIf
          
          If my > src_my 
            diff_y = my - src_my 
            SetGadgetState(#YBar,src_y - diff_y)  
          ElseIf my < src_my 
            diff_y = src_my - my 
            SetGadgetState(#YBar,src_y + diff_y) 
            ;Else ; Nicht benutzen sonst gibt es ein kurzes Flimmern
            
          EndIf  
          
        EndIf
        
      Else
        MouseFollow = 0
        Break
      EndIf  
      
      Delay(5) ; 10 Ist selbst auf dem alten Dell 1,2GHZ Optimal
      
    Until MouseFollow = 0  
    
    Debug "EXIT MOUSE FOLLOW"   
    
  EndProcedure
  
  Procedure AntiBullShit(XP,YP)
    
    Shared CenterX, CenterY, IMG_W, IMG_H, BorderW, BorderH
    
    ; Wir übermalen den Bullshit der am ""Rand"" entsteht
    
    If XP < CenterX 
      diff_x = CenterX - XP
      Box(0, 0 , diff_x, BorderH,0)   
    ElseIf XP > CenterX
      diff_x = XP - CenterX 
      Box(IMG_W - diff_x ,0, diff_x, BorderH,0) 
    EndIf 
    
    If YP < CenterY  
      diff_y = CenterY - YP
      Box(0,0, BorderW, diff_y,0) 
    ElseIf YP > CenterY  
      diff_y = YP - CenterY  
      Box(0, IMG_H - diff_y ,BorderW, diff_y,0) 
    EndIf 
    
  EndProcedure
  
  Procedure BindScrollDatas()
    
    Debug "" 
    Debug "BAR SCROLL EVENT" 
    Debug ""
    
    ;Müssen direkt hier ausführen ! Geht nicht anders, da das BindGadgetEvent die Event Schleife blockiert
    
    Shared one_w.f, one_h.f, Level, BorderL, BorderU, BarWHalf, BarHHalf, PicStartX, PicStartY, MouseFollow, CenterX ,CenterY
    
    MouseFollow = 0  
    
    tmp_x = GetGadgetState(#XBar) : tmp_y = GetGadgetState(#YBar)  
    
    If Level <> 100
      ZoomSprite(0,one_w,one_h)
    EndIf 
    StartDrawing(SpriteOutput(0))  
      DrawImage(ImageID(#ResPic),BarWHalf - tmp_x, BarHHalf - tmp_y)
      AntiBullShit(tmp_x,tmp_y) 
    StopDrawing()  
    
    DisplaySprite(0, -BorderL +PicStartX, -BorderU +PicStartY)  
    FlipBuffers()  
    
  EndProcedure
  
  Procedure.w MouseWheelDelta() 
    Protected x.w 
    x.w = ((EventwParam()>>16)&$FFFF) 
    Debug -(x / 120)
    
    ProcedureReturn -(x / 120) 
  EndProcedure 
  
  Procedure Zoom(Mode)
    
    Shared Level, one_w, one_h, IMG_W, IMG_H, PosX, PosY, PicStartX, PicStartY, AbschlagX, AbschlagY, BarWHalf, BarHHalf, BorderL, BorderU
    Shared BorderWQuarter, BorderHQuarter, BarW, BarH
    
    If Mode = 1 ;/ Zoom IN
      
      ;[
      
      Level + 50
      
      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)
      
      CreateSprite(0,IMG_W,IMG_H)
      ZoomSprite(0,one_w,one_h)
      PosX = GetGadgetState(#XBar)  : PosY = GetGadgetState(#YBar) 
      
      ; HIER ABschlag ! Nicht AUFschlag
      
      If PicStartX > 0
        AbschlagX = (PicStartX / 2)
      Else
        AbschlagX = 0
      EndIf
      If PicStartY > 0
        AbschlagY = (PicStartY / 2)
      Else
        AbschlagY = 0
      EndIf
      
      StartDrawing(SpriteOutput(0))
        DrawImage(ImageID(#ResPic),BarWHalf - PosX, BarHHalf - PosY)
      StopDrawing() 
      
      BorderL + BorderWQuarter - AbschlagX ;/ AUF Keinen Fall BorderL = BorderWQuarter - AbschlagX sonst driftet der Zoom ab.
      BorderU + BorderHQuarter - AbschlagY ;/ Immer BorderL + BorderWQuarter - AbschlagX
      
      Debug "" 
      Debug PicStartY / 2
      BarW = GetGadgetAttribute(#XBar,#PB_ScrollBar_Maximum) : BarH = GetGadgetAttribute(#YBar,#PB_ScrollBar_Maximum) 
      Debug "BarW MAX="+BarW : Debug "BarH MAX="+BarH
      ;] 
      
    Else
      
      ;[
      Level - 50
      
      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)
      
      CreateSprite(0,IMG_W,IMG_H)
      ZoomSprite(0,one_w,one_h)
      
      PosX = GetGadgetState(#XBar) : PosY = GetGadgetState(#YBar) 
      
      ; HIER AUFschlag ! Nicht ABschlag
      
      If PicStartX > 0
        AufschlagX = (PicStartX / 2)
      Else
        AufschlagX = 0
      EndIf
      If PicStartY > 0
        AufschlagY = (PicStartY / 2)
      Else
        AufschlagY = 0
      EndIf
      
      StartDrawing(SpriteOutput(0))
        DrawImage(ImageID(#ResPic),BarWHalf - PosX,BarHHalf - PosY)
      StopDrawing() 
      
      BorderL - BorderWQuarter + AufschlagX ;/ AUF Keinen Fall BorderL = BorderWQuarter + AufschlagX sonst driftet der Zoom ab.
      BorderU - BorderHQuarter + AufschlagY ;/ Immer BorderL + BorderWQuarter + AufschlagX
      
      Debug "" 
      BarW = GetGadgetAttribute(#XBar,#PB_ScrollBar_Maximum) : BarH = GetGadgetAttribute(#YBar,#PB_ScrollBar_Maximum) 
      Debug "BarW MAX="+BarW  : Debug "BarH MAX="+BarH
      
      ;] 
      
    EndIf
    
    
  EndProcedure 
  
  Procedure ChangeBarPos(Mode, Steps = 10)
    
    PosX = GetGadgetState(#XBar) : PosY = GetGadgetState(#YBar) 
    
    If Steps = 0
      Steps = 10
    EndIf
    
    If Mode = 0 ; LEFT KEY
      SetGadgetState(#XBar,PosX - Steps)
    ElseIf Mode = 1 ; RIGHT KEY
      SetGadgetState(#XBar,PosX + Steps)
    ElseIf Mode = 2 ; UP KEY
      SetGadgetState(#YBar,PosY - Steps) 
    ElseIf Mode = 3 ; DOWN KEY
      SetGadgetState(#YBar,PosY + Steps) 
    EndIf  
    
  EndProcedure
  
  BorderW = 700 ; Sichtbarer Rahmen
  BorderH = 700 ; Sichtbarer Rahmen
  
  ;pic$ = "d:\FOTOS\GIF\roflcopter.gif"
  pic$ = "c:\PutYourDirtyJpgFileHere.jpg"
  
  If LoadImage(#OrigPic,pic$)
    ;Bildmaße mit Seitenverhältniss anpassen an Sichtbaren Rahmen 
    tmp_size$ = CalcImageSize(#OrigPic,BorderW,BorderH,0,0,0)
    IMG_W = Val(StringField(tmp_size$,1,":")) : IMG_H = Val(StringField(tmp_size$,2,":"))  
    Debug IMG_W : Debug IMG_H
    Debug ""
    CopyImage(#OrigPic,#ResPic) ; Wollen ja keinen Generationen Verlusst
    ; IMG_H = IMG_W ; Falls mann testen will wie es sich bei einem Quadratischen Bild verhält
    ResizeImage(#ResPic,IMG_W,IMG_H)
    Debug "PIC LOADED"
    StartDrawing(ImageOutput(#ResPic))
      Line(IMG_W / 2,0,1,IMG_H,#red) ; Senkrechte Mittel Linie
      Line(0,IMG_H / 2,IMG_W,1,#cyan) ; Waagrechte Mittel Linie
    StopDrawing()
  Else
    Debug "No Image Loaded"
    End
  EndIf
  
  PicStartX = IMG_W - BorderW
  PicStartY = IMG_H - BorderH
  
  If PicStartX = 0
    Debug "OK Bild W gleich groß wie BorderW"
    Debug "PicStartX=0"
  ElseIf PicStartX < 0
    Debug "OK Bild W kleiner als BorderW"
    PicStartX = BorderW - IMG_W
    PicStartX / 2
    Debug "PicStartX="+PicStartX
  Else
    Debug "BAD - Bild W größer als BorderW - Irgendwas muss bei CalcImageSize schiefgangen sein."
  EndIf
  If PicStartY = 0
    Debug "OK Bild H gleich groß wie BorderH"
    Debug "PicStartY=0" 
  ElseIf PicStartY < 0
    Debug "OK Bild H kleiner als BorderH"
    PicStartY = BorderH - IMG_H
    PicStartY / 2
    Debug "PicStartY="+PicStartY 
  Else
    Debug "BAD - Bild H größer als BorderH - Irgendwas muss bei CalcImageSize schiefgangen sein." 
  EndIf
  
  AbstandL = 100
  AbstandOb = 20
  
  BorderWQuarter = BorderW / 4
  BorderHQuarter = BorderH / 4
  
  InitBarW = (BorderW * 3) + 1 ; 2101 - Mitte ist also genau 1051
  BarWHalf = (InitBarW / 2) ; Kein + 1 sonst 1051 -> Schlecht teilbar 
  
  InitBarH = (BorderH * 3) + 1 ; 2101 - Mitte ist also genau 1051
  BarHHalf = (InitBarH / 2) ; Kein + 1 sonst 1051 -> Schlecht teilbar 
  
  CenterX = (InitBarW / 2) + 1
  CenterY = (InitBarH / 2) + 1
  
  Debug ""
  Debug "InitBarW="+InitBarW
  Debug "BarWHalf="+BarWHalf
  Debug "" 
  Debug "InitBarH="+InitBarH
  Debug "BarHHalf="+BarHHalf  
  Debug "" 
  Debug "CenterX="+CenterX
  Debug "CenterY="+CenterY
  
  Level = 100 
  BorderL = 0
  BorderU = 0
  PgLen = 0
  
  UseLButtonDrag = #True ; Wenn TRUE. Hin und her schieben vom Bild per Links gehaltener Mouse Taste, ansonsten Rechte Taste
  If UseLButtonDrag = #True
    XBUP = #WM_LBUTTONUP : XBDOWN = #WM_LBUTTONDOWN
  Else
    XBUP = #WM_RBUTTONUP : XBDOWN = #WM_RBUTTONDOWN
  EndIf
  
  If OpenWindow(#MainWin, 0, 0, 820,800, "A screen in a window...", #PB_Window_SystemMenu|#PB_Window_ScreenCentered)
    
    CreateStatusBar(0, WindowID(#MainWin))
    AddStatusBarField(420) 
    StatusBarText(0, 0, "Bla")
    
    ButtonGadget(#Z_IN,10,20,60,20,"ZoomIN")
    ButtonGadget(#Z_OUT,10,50,60,20,"ZoomOut")
    
    bla$ = "C"+#CRLF$+"e"+#CRLF$+"n"+#CRLF$+"t"+#CRLF$+"e"+#CRLF$+"r"+#CRLF$+" "+#CRLF$+"Y"
    
    ButtonGadget(#MidX, AbstandL, BorderH+42, (BorderW / 2) + 9, 20,"CenterX")  
    ButtonGadget(#MidY, AbstandL - 21, AbstandOb,19, (BorderH / 2) + 1, bla$,#PB_Button_MultiLine) 
    
    ButtonGadget(#CenterAll,0,500,80,60,"Center X+Y") 
    ButtonGadget(#ResetZoom,0,600,80,60,"Reset Zoom") 
    
    ScrollBarGadget(#XBar,AbstandL,BorderH+20,BorderW,20,0,InitBarW,PgLen)  
    ScrollBarGadget(#YBar,AbstandL+BorderW,AbstandOb,20,BorderH,0,InitBarW,PgLen,#PB_ScrollBar_Vertical)  
    
    Debug ""
    Debug "Drecks PageLen="+PgLen
    
    ;/ Wenn mann als BarW z.B 2100 setzt, und eine PgLen von 350, dann wird GetGadgetState am Maximalen Punkt GANZ Rechts aussen
    ;/ 1750 ausgeben ! Das Maximum als Rückgabewert ist >IMMER< so viel weniger wie Page Len ist !
    
    ;/ Und mann kann das >NICHT< ausgleichen mit SetGadgetAttribute(#XBar, 2100+PageLen, #PB_ScrollBar_Maximum)
    ;/ Dann kommt halt bei GetGadgetState als Maximaler Wert 2100 heraus, obwohl die BarBreite eigentlich 2450 ist.
    
    ;/ Lösung -> PageLen auf 0 setzen und gut is.
    
    ;/ Das macht halt einen sehr kleinen Balken. Der aber immer gleich groß bleibt.
    ;/ Ich empfehle jedem die verschissene PageLen auf 0 zu lassen, der Mist verkompliziert nur, weil mann noch eine Variable einplanen muss.
    
    ;/ Wenn einem 1px pro Klick auf Bar zu wenig sind, kann ja immer noch nenn KeyEvent Code benutzen das halt 10 oder mehr
    ;/ Pixel per Cursor gesprungen werden. (hab einen eingebaut)
    
    ;/ In BildScrollDatas() macht es keinen Sinn, da mann so nicht ohne 2 Zusatz Variablen
    ;/ (die den letzten Wert mit der Center Position abgleichen) 
    ;/ (oder erechnen ob Mouse Links oder Rechts vom Bar Center Punkt)
    ;/ herausfinden kann in welche Richtung gescrollt wurde. Ausserdem ist das Scrollen mit Mouse immer schnell (egal ob PageLen 0)
    ;/ ausser mann benutzt die beknackten kleinen Pfeile.
    
    ;/ NOCH EINE INFO ! Die ZOOM Berechnung ist vom Pic Verhältniss das das Bild im RAHMEN bei 100% hat !
    ;/ Wenn Pic Original 400x400 wird es im Rahmen 700x700 haben, und das wird der 100% Wert sein. Und von diesem
    ;/ 700x700 Wert aus wird hoch oder runter gerechnett
    
    SetGadgetState(#XBar,CenterX) : SetGadgetState(#YBar,CenterY)
    
    BindGadgetEvent(#XBar, @ BindScrollDatas())  
    BindGadgetEvent(#YBar, @ BindScrollDatas())   
    
    If OpenWindowedScreen(WindowID(#MainWin),AbstandL,AbstandOb,BorderW,BorderH,#False,0,0)
      
      LimitX = WindowWidth(#MainWin) - 19
      LimitY = (AbstandOb + BorderH) - 1
      
      SpriteQuality(#PB_Sprite_BilinearFiltering) ; Sieht sonst wie Müll aus
      
      CreateSprite(0,IMG_W,IMG_H) ; Erstellt ein leeres Sprites, dies wird komplett schwarz sein
      StartDrawing(SpriteOutput(0))
        DrawImage(ImageID(#ResPic),0,0)
      StopDrawing() 
      
      Repeat
        ; Es ist sehr wichtig, alle im Queue befindlichen Ereignisse während jedes Frames abzuarbeiten
        ;
        Repeat 
          
          Event = WaitWindowEvent(10) 
          
          If Event = XBUP ; Maus Taste wurde released
            MouseFollow = 0 
          EndIf 
          
          If Event = #WM_MOUSEWHEEL
            
            MouseFollow = 0
            
            MAIN_SCROLL_DIR = MouseWheelDelta()
            If MAIN_SCROLL_DIR = 1
              If Level >= 100
                Zoom(0) 
              EndIf
            ElseIf MAIN_SCROLL_DIR = -1
              If Level < 600
                Zoom(1) 
              EndIf
            EndIf
            
          EndIf
          
          If Event = #WM_KEYDOWN
            
            ;/ ACHTUNG ! WM_KEYDOWN reagiert so lange gedrückt gehalten wird !
            
            MouseFollow = 0
            
            Main_KeyCode = EventwParam() 
            
            If Main_KeyCode = #VK_Left
              ChangeBarPos(0,20) 
            ElseIf Main_KeyCode = #VK_Right 
              ChangeBarPos(1,20) 
            ElseIf Main_KeyCode = #VK_Up 
              ChangeBarPos(2,20) 
            ElseIf Main_KeyCode = #VK_Down
              ChangeBarPos(3,20)  
            EndIf
            
            If IsSprite(0) = 0
              CreateSprite(0,IMG_W,IMG_H)
            EndIf
            
            PosX = GetGadgetState(#XBar) : PosY = GetGadgetState(#YBar)  
            
            StartDrawing(SpriteOutput(0)) 
              DrawImage(ImageID(#ResPic),BarWHalf - PosX, BarHHalf - PosY)
              AntiBullShit(PosX,PosY) 
            StopDrawing()
            
          EndIf
          
          If Event = #WM_KEYUP
            
            ;/ #WM_KEYUP Reagiert erst beim Release
            If Main_KeyCode <> 0
              Debug "KEY RELEASED"
            EndIf
            
          EndIf
          
          If MouseFollow ; Zeichnen
            
            PosX = GetGadgetState(#XBar) : PosY = GetGadgetState(#YBar) 
            
            If IsSprite(0) = 0
              CreateSprite(0,IMG_W,IMG_H)
            EndIf
            
            StartDrawing(SpriteOutput(0)) 
              DrawImage(ImageID(#ResPic),BarWHalf - PosX, BarHHalf - PosY)
              AntiBullShit(PosX,PosY) 
            StopDrawing() 
            
          Else ; ansonsten um den anderen Kram kümmern
            
            If Event = XBDOWN ; Mouse Taste wurde gedrückt
              
              mx = WindowMouseX(#MainWin) : my = WindowMouseY(#MainWin)
              
              If mx > AbstandL And mx < LimitX And my > AbstandOb And my < LimitY
                If IsThread(MouseTH) = 0
                  MouseFollow = #True 
                  MouseTH=CreateThread(@MouseFollow(),0) 
                EndIf
              EndIf
              
            EndIf 
            
            If Event = #PB_Event_Gadget
              
              EventGadget = EventGadget()
              
              If EventGadget = #ResetZoom
                Level = 100 
                CreateSprite(0,IMG_W,IMG_H)
                StartDrawing(SpriteOutput(0)) 
                  DrawImage(ImageID(#ResPic),0,0) 
                StopDrawing()
                BorderL = 0 : BorderU = 0
                SetGadgetState(#XBar,CenterX) : SetGadgetState(#YBar,CenterY)
              EndIf
              
              If EventGadget = #MidX
                Debug "RESET CENTER X"
                PosY = GetGadgetState(#YBar)  
                CreateSprite(0,IMG_W,IMG_H) ; Erstellt ein leeres Sprites, dies wird komplett schwarz sein  
                StartDrawing(SpriteOutput(0))
                  If Level <> 100
                    ZoomSprite(0,one_w,one_h)
                  EndIf
                  DrawImage(ImageID(#ResPic),BarWHalf - CenterX, BarHHalf - PosY) 
                StopDrawing() 
                SetGadgetState(#XBar,CenterX)
              EndIf
              
              If EventGadget = #MidY
                Debug "RESET CENTER Y"
                PosX = GetGadgetState(#XBar)  
                CreateSprite(0,IMG_W,IMG_H) ; Erstellt ein leeres Sprites, dies wird komplett schwarz sein  
                StartDrawing(SpriteOutput(0))
                  If Level <> 100
                    ZoomSprite(0,one_w,one_h)
                  EndIf
                  DrawImage(ImageID(#ResPic),BarWHalf - PosX, BarHHalf - CenterY) 
                StopDrawing() 
                SetGadgetState(#YBar,CenterY)
              EndIf
              
              If EventGadget = #CenterAll
                SetGadgetState(#XBar,CenterX) : SetGadgetState(#YBar,CenterY)
                CreateSprite(0,IMG_W,IMG_H) ; Erstellt ein leeres Sprites, dies wird komplett schwarz sein  
                StartDrawing(SpriteOutput(0))
                  If Level <> 100
                    ZoomSprite(0,one_w,one_h)
                  EndIf
                  DrawImage(ImageID(#ResPic),BarWHalf - CenterX, BarHHalf - CenterY) 
                StopDrawing()  
              EndIf
              
              If EventGadget = #Z_IN And Level < 600 
                Zoom(1)  
              EndIf
              
              
              If EventGadget = #Z_OUT And Level >= 100
                Zoom(0) 
              EndIf 
              
            EndIf 
            
          EndIf 
          
          If Event = #PB_Event_CloseWindow
            End
          EndIf
          
        Until Event = 0 
        
        FlipBuffers()
        ClearScreen(RGB(0,0,100)) ; Ein blauer Hintergrund
        
        DisplaySprite(0, -BorderL +PicStartX, -BorderU +PicStartY) 
        
      ForEver
      
    Else
      MessageRequester("Error", "Can't open windowed screen!", 0)
    EndIf
  EndIf
https://www.geek.com/tech/a-commodore-6 ... s-1672510/
٩(̾●̮̮̃̾•̃̾)۶ __̴ı̴̴̡̡̡ ̡͌l̡̡̡ ̡͌l̡*̡̡ ̴̡ı̴̴̡ ̡̡͡|̲̲̲͡͡͡ ̲▫̲͡ ̲̲̲͡͡π̲̲͡͡ ̲̲͡▫̲̲͡͡ ̲|̡̡̡ ̡ ̴̡ı̴̡̡ ̡͌l̡̡̡̡.___٩(- ̮̮̃-̃)۶
Antworten