Aktuelle Zeit: 16.01.2021 07:27

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]




Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: ScrollAreaGadget Fokus driftet ab nach Zoom
BeitragVerfasst: 07.11.2020 22:01 
Offline
Benutzeravatar

Registriert: 11.06.2017 20:25
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:
 
 
  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:
  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̡̡̡̡.___٩(- ̮̮̃-̃)۶


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ScrollAreaGadget Fokus driftet ab nach Zoom
BeitragVerfasst: 08.11.2020 01:26 
Offline
Benutzeravatar

Registriert: 11.06.2017 20:25
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̡̡̡̡.___٩(- ̮̮̃-̃)۶


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ScrollAreaGadget Fokus driftet ab nach Zoom
BeitragVerfasst: 09.11.2020 06:40 
Offline
Benutzeravatar

Registriert: 22.12.2016 12:49
Wohnort: :D_üsseldorf-Wersten
Hallo GlassJoe,
100 = ScrollBereichBreite und 100= ScrollBereichHöhe beim Aufruf von ScrollAreaGadget verstehe ich nicht:
Code:
; 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ScrollAreaGadget Fokus driftet ab nach Zoom
BeitragVerfasst: 10.11.2020 01:43 
Offline
Benutzeravatar

Registriert: 11.06.2017 20:25
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:
  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̡̡̡̡.___٩(- ̮̮̃-̃)۶


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ScrollAreaGadget Fokus driftet ab nach Zoom
BeitragVerfasst: 10.11.2020 07:37 
Offline
Benutzeravatar

Registriert: 22.02.2008 20:49
Wohnort: Utah, USA
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ScrollAreaGadget Fokus driftet ab nach Zoom
BeitragVerfasst: 10.11.2020 11:38 
Offline
Benutzeravatar

Registriert: 11.06.2017 20:25
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̡̡̡̡.___٩(- ̮̮̃-̃)۶


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: ScrollAreaGadget Fokus driftet ab nach Zoom
BeitragVerfasst: 25.11.2020 02:02 
Offline
Benutzeravatar

Registriert: 11.06.2017 20:25
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:
  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̡̡̡̡.___٩(- ̮̮̃-̃)۶


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde [ Sommerzeit ]


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 23 Gäste


Sie dürfen keine neuen Themen in diesem Forum erstellen.
Sie dürfen keine Antworten zu Themen in diesem Forum erstellen.
Sie dürfen Ihre Beiträge in diesem Forum nicht ändern.
Sie dürfen Ihre Beiträge in diesem Forum nicht löschen.

Suche nach:
Gehe zu:  
cron

 


Powered by phpBB © 2008 phpBB Group | Deutsche Übersetzung durch phpBB.de
subSilver+ theme by Canver Software, sponsor Sanal Modifiye