Seite 2 von 2

Verfasst: 04.09.2009 09:51
von Thatsanee
Hi Rokur,

klasse :allright: , an sowas habe ich mich auch mal versucht, aber nie so richtig
hinbekommen, na ich übe halt noch. Wird schon irgendwann noch mal
was geben bei mir, auch wenn es heißt Frauen und Technik ...

Aber sag mal, wenn ich den gridSize per Maus ändern will, also ich
halte die linke Maustaste fest und ziehe dann das sich der Rahmen
entsprechend eines vorgegeben Maßes vergrößert, na du weist schon
was ich meine. Hast Du dafür auch eine kleine Lösung parat ???

Thatsanee

Verfasst: 04.09.2009 11:13
von Rokur
Meinst du eine freie, rechteckige Auswahl?

Beispiel für Auswahlrahmen mit gedrückter, linker Maustaste aufziehen:

Variablen path und color bitte entsprechend anpassen

Code: Alles auswählen

EnableExplicit

Structure struct_auswahl
  x.l ;Startpunkt der Auswahl, -1 wenn nichts ausgewählt ist
  y.l ;Startpunkt der Auswahl
  width.l ;Breite der Auswahl
  height.l  ;Höhe der Auswahl
  selecting.b
EndStructure

OpenWindow(0,0,0,400,400,"Auswahlrahmen",#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)

Global auswahl.struct_auswahl
Global path.s = "test.bmp"
Global color = #Green

LoadImage(0,path)
If Not IsImage(0)
  Debug "Fehler beim Laden von "+path+"!"
  End
EndIf

CreateImage(1,ImageWidth(0),ImageHeight(0))

Procedure repaint()
  Protected mx, my
  mx = WindowMouseX(0)
  my = WindowMouseY(0)
  StartDrawing(ImageOutput(1))
    DrawImage(ImageID(0),0,0)
    If mx <> -1 And my <> -1 ;Maus innerhalb des Fensters?
      If auswahl\selecting = #True
        auswahl\width = mx - auswahl\x
        auswahl\height = my - auswahl\y
      EndIf
    EndIf
    If auswahl\x <> -1 ;wenn etwas ausgewählt ist
      DrawingMode(#PB_2DDrawing_Outlined)
      Box(auswahl\x,auswahl\y,auswahl\width,auswahl\height,color)
    EndIf
  StopDrawing()
  StartDrawing(WindowOutput(0))
    DrawImage(ImageID(1),0,0)
  StopDrawing()
EndProcedure

auswahl\selecting = #False
auswahl\x = -1

Repeat
  Define event = WaitWindowEvent(10)
  
  Select event
    Case #PB_Event_CloseWindow
      End
    Case #WM_LBUTTONDOWN ;linke Maustaste gedrückt
      auswahl\x = WindowMouseX(0)
      auswahl\y = WindowMouseY(0)
      auswahl\selecting = #True
    Case #WM_LBUTTONUP ;linke Maustaste losgelassen
      auswahl\selecting = #False
      If auswahl\width = 0
        auswahl\x = -1
      EndIf
  EndSelect
  
  repaint()
ForEver
Noch ein kleiner Tipp zur Auswahlfarbe:
Eine feste Farbe wie in meinem Beispiel ist nicht optimal, wenn man vorher nicht genau weiß wie die Grafik aussieht, denn evtl. ist der Rahmen dann schlecht oder garnicht zu sehen.
Besser wäre es den Rahmen automatisch abzuheben, z.B. gestreift, blinkend oder eine eigene Prozedur schreiben, um die Linien als Negativ des darunter liegenden Bildes zu zeichnen. Das wird dann zwar bunt, aber ist meist gut zu sehen.

Verfasst: 04.09.2009 20:07
von mk-soft
Habe in meiner sammlung noch was gefunden.

Code: Alles auswählen

OpenWindow(0,0,0,400,300,"untitled",#WS_OVERLAPPEDWINDOW | 1)

Repeat
   EventID = WaitWindowEvent()
   
   If EventID = #WM_LBUTTONDOWN      
      IX = WindowMouseX(0) : IY = WindowMouseY(0)      
   EndIf
      
   If EventID = #WM_MOUSEMOVE And EventwParam() = #MK_LBUTTON
       MX = WindowMouseX(0) : MY = WindowMouseY(0)
      
      hdc = GetDC_(WindowID(0))
      DrawFocusRect_(hdc,frc.RECT)
      
        If ((IX < MX) And (IY > MY))
            SetRect_(frc,IX,MY, MX,IY)
        ElseIf ((IX > MX) And (IY > MY))
            SetRect_(frc,MX, MY, IX,IY)
        ElseIf ((IX > MX) And (IY < MY))
            SetRect_(frc,MX,IY, IX, MY)
        Else
            SetRect_(frc,IX,IY,MX,MY)
        EndIf

      DrawFocusRect_(hdc,frc)
      ReleaseDC_(WindowID(0),hdc)   
   EndIf   
Until EventID = 16

Verfasst: 05.09.2009 21:38
von Donald
Hi mk-soft,

das mit dem SetRect ist ja natürlich auch Klasse, habe es gerade mal
ein wenig getestet, klappt sogar noch besser als meine jetzige Lösung.
Eine Frage habe ich aber noch:
Ist es Möglich das Aussehen des Rahmes zu verändern ?
Bisher habe ich noch nichts gefunden in meinen API Sachen.

Guß Donald