Seite 1 von 1

Koordinatensystem

Verfasst: 12.09.2006 09:33
von Martin66119
Einen schönen guten Morgen an alle!

Mal wieder was zu meinem Messprogramm! Das programm funktioniert soweit auf einem meiner Rechner. Auf dem anderen jedoch bewegt sich das Fadenkreuz erst verzögert wenn ich die Mouse bewege (beim langsameren Rechner ist alles bestens; beim schnelleren die Verzögerung).

Nun habe ich versucht sowohl das Koordinatensytem als auch das Fadenkreuz durch eine andere Methode darzustellen.

Nun meine Frage/n

1) Ist das so ok oder gibt es schnellere Lösungen (wenn ja, was ist besser)
2) Muss ich in jedem durchlauf der Procedure - Fadenkreuz() - die CreateSprite(#Fadenkreuz, 800,800) aufrufen oder kann ich das Sprite auch sozusagen leeren?
Hier der Code:

Code: Alles auswählen

Enumeration
  #Koordinatensystem
  #Fadenkreuz
  
  #Window_1
  #Window_2
  
  #Button_1
  
  #File_1

EndEnumeration

;---------------------------------------------------------------------------------------------------
If InitSprite() = 0 Or InitKeyboard() = 0 Or InitSprite3D() = 0
  MessageRequester("Error", "Can't open DirectX 7 or later", 0)
  End
EndIf
;---------------------------------------------------------------------------------------------------
Procedure Fadenkreuz()
  MouseX.w =  DesktopMouseX() - 5
  MouseY.w =  DesktopMouseY() -25
  CreateSprite(#Fadenkreuz, 800,800)
 
  If StartDrawing(SpriteOutput(#Fadenkreuz)) 
   
      If MouseY < 710 And MouseY > 30
      LineXY(2, MouseY, 795, MouseY,$FF0000) ;X 
    Else 
      If MouseY > 710 
        LineXY(5, 710, 795, 710,$FF0000) ;X 
        MouseY = 710
      Else
        LineXY(5, 5, 795, 5,$FF0000)
        MouseY = 5
      EndIf
    EndIf 
    
    If MouseX < 751 And MouseX > 30
      LineXY(MouseX, 2, MouseX, 718,$FF0000)  ;Y 
    Else 
      If MouseX > 751
        LineXY(751, 5, 751, 710,$FF0000)  ;Y
        MouseX = 750
      Else
        LineXY(30, 2, 30, 718,$FF0000) 
        MouseX = 30
      EndIf
    EndIf 
    StopDrawing()
  EndIf 
 
EndProcedure  
;---------------------------------------------------------------------------------------------------
  
  If OpenWindow(#Window_1, 0, 0, 1400,1280, "A screen in a window...", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    If CreateGadgetList(WindowID(#Window_1))
      ButtonGadget(0, 170, 135, 45, 20, "Quit")
    EndIf
    
    If OpenWindowedScreen(WindowID(#Window_1), 0, 0, 800, 800, 0, 0, 0) 
      LoadSprite(#Koordinatensystem, "f:\PB\TempMessung\Messwerte.bmp", 0)      
    Else
      MessageRequester("Error", "Can't open windowed screen!", 0)
      End
    EndIf
  EndIf
;---------------------------------------------------------------------------------------------------  
  LoadSprite(#Koordinatensystem, "f:\PB\TempMessung\Messwerte.bmp", 0)  
  CreateSprite(#Fadenkreuz, 792,792)
  
 Repeat                
  EventID=WindowEvent() 
  EventWindowID = EventWindow() 
  EventGadgetID= EventGadget()
  EventMenuID = EventMenu()  

  Select EventWindowID   
    Case #Window_1      ; Handling #Window_1 
      Select EventID       
        Case   #WM_MOUSEMOVE 
          Fadenkreuz()
        Case #PB_Event_Gadget
       
          Select EventGadgetID 
            Case #Button_1                          
          EndSelect       

          Case #PB_Event_CloseWindow 
          Window_1_IsClosed = #True 
        
      EndSelect           
;---------------------------------
     If EventID = #PB_Event_Menu
    
       MenuID = EventMenu()
    
       If MenuID = #File_1
 
       EndIf
    
    EndIf
;---------------------------------      
    Case #Window_2    ; Handling #Window_2 
      Select EventID 
        Case #PB_Event_Gadget 
        Case #PB_Event_CloseWindow 
          CloseWindow(#Window_2) 
          Window_2_IsClosed = #True 
      EndSelect          
  EndSelect 

    FlipBuffers() 
    ClearScreen(0)
    DisplaySprite(#Koordinatensystem, 0, 0)
    DisplayTranslucentSprite(#Fadenkreuz, 1, 1,128)   
Delay(1)    
Until     Window_1_IsClosed = #True  ;And Window_2_IsClosed = #True 

End   


Danke für die Hilfe

Martin

Verfasst: 12.09.2006 14:16
von Kaeru Gaman
Auch dir einen schönen Morgen. :)

da du sowieso auf nen screen darstellst, könntest du das line-zeichnen auch direkt in den screen vornehmen.

die alternative zu einem wiederholten CreateSprite() wäre das clearen über eine Box() zu beginn des Draw-Vorgangs.

du ermittelst deine Maus-Koordinaten über DesktopMouseX/Y().
wenn jemand das fenster bewegt, gibt das chaos.
benutz mal WindowMouseX/Y().
(hier könnte auch der kernfehler liegen)

und den koordinatencheck könntest du auch eleganter lösen.
das erschien mir erst weniger wichtig, aber zusammen mit dem DesktopMouse-Problem könnte das wirklich die Ursache sein.

ich hab die routine mal umgestrickt gemäß den genannten gesichtspunkten.
außerdem hab ich noch den Variablennamen verändert, denn ich bevorzuge,
keine reservierten Namen für Variablen zu verwenden.
(auch wenn er es hier nicht anmeckert, aber es ist nützlich, sich das anzugewöhnen)

Code: Alles auswählen

Procedure Fadenkreuz() 
  MausX.w =  WindowMouseX() 
  MausY.w =  WindowMouseY() 

  If MausX <  30 : MausX =  30 : EndIf
  If MausX > 750 : MausX = 750 : EndIf
  If MausY <   5 : MausY =   5 : EndIf
  If MausY > 710 : MausY = 710 : EndIf
  
  If StartDrawing(ScreenOutput()) 
      LineXY(2, MausY, 795, MausY,$FF0000) ;X 
      LineXY(MausX, 2, MausX, 718,$FF0000) ;Y 
    StopDrawing() 
  EndIf 
  
EndProcedure 
probiers mal, vielleicht gehts ja besser jetzt... :|