Ein kleiner Aktionsrahmen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
BSP
Beiträge: 201
Registriert: 01.02.2009 14:04

Ein kleiner Aktionsrahmen

Beitrag von BSP »

Hallo.
Gibt es sowas schon?

Manchmal kommt es vor, das man im Prg eine Aktion auslöst,
bei der es keine Rückmeldung gibt.
(Z.B. einen kurzen Text ins Clipboard übergeben).
Um grafisch darzustellen, das gerade eine Aktion gelaufen ist,
habe ich einen kleinen Aktionsrahmen gebastelt.
Der Rahmen läuft von Punkt A nach Punkt B.
Z.B. vom Listicongadget zum Auslösebutton.
Man kann auch eigene Punkte bestimmen.
Z.B. einen Linksklick ins Listicongadget.

Das Prg habe ich geschrieben,
weil ich selber sowas brauche und um zu sehen,
ob ich das mit der Zeigerübergabe an Proceduren verstanden habe.

Vieleicht kann der eine oder ander sowas ja gebrauchen.
Oder hat Verbesserungsvorschläge?

Gruß: BSP

Code: Alles auswählen


EnableExplicit

; ===== Ins Programm einbauen
Structure Rahmen
  x1.i
  x2.i
  x3.i
  x4.i
  y1.i
  y2.i
  y3.i
  y4.i
EndStructure

Procedure AktionsRahmen(IDWin,*p1.rahmen,*p2.rahmen)
  ; p1 / p2 steht für punkte1 / punkte2
  
  Protected x1 , x2 , y1 , y4 ,w , h , i , st
  
  Protected a1= *p2\x1 - *p1\x1
  Protected b1= *p2\y1 - *p1\y1
  Protected l1= Sqr(a1*a1 + b1*b1)
  
  Protected a2= *p2\x2 - *p1\x2
  Protected b2= *p2\y2 - *p1\y2
  Protected l2= Sqr(a2*a2 + b2*b2)
  
  Protected a4= *p2\x4 - *p1\x4
  Protected b4= *p2\y4 - *p1\y4
  Protected l4= Sqr(a4*a4 + b4*b4)
  
  Protected fw.d= l2/l1
  Protected fh.d= l4/l1
  
  StartDrawing(WindowOutput(IDWin))
  DrawingMode(#PB_2DDrawing_XOr|#PB_2DDrawing_Outlined )
  
  st=l1/50
  If st=0:st=1:EndIf
  ;For I = 0 To l1 Step 4
  While i<l1
    x1= *p1\x1 + a1*I/l1
    y1= *p1\y1 + b1*I/l1
    
    x2= *p1\x2 + a2*I*fw/l2
    w= x2-x1
    
    y4= *p1\y4 + b4*I*fh/l4
    h= y4-y1
    
    Box(x1,y1,w,h)
    Delay(4)
    Box(x1,y1,w,h)
    i+st
    While WindowEvent():Wend
  ;Next
  Wend
  
  StopDrawing()
;   For i=4000 To 2000 Step -200
;   Beep_( i, 6)
;   Next

EndProcedure
; =====

Procedure Get_GadgRahmen(*pos.rahmen , gadg)
  *pos\x1=GadgetX(gadg)
  *pos\y1=GadgetY(gadg)
  *pos\x2=GadgetX(gadg)+GadgetWidth(gadg)
  *pos\y2=GadgetY(gadg)
  *pos\x3=GadgetX(gadg)+GadgetWidth(gadg)
  *pos\y3=GadgetY(gadg)+GadgetHeight(gadg)
  *pos\x4=GadgetX(gadg)
  *pos\y4=GadgetY(gadg)+GadgetHeight(gadg)
EndProcedure

; ab hier das Testprogramm


Define _Flag.i , ende.i
Define.i x,y,w,h

Enumeration
  #HWnd
EndEnumeration

Enumeration
  #LiGadg
  #Butt
EndEnumeration
_Flag = #PB_Window_SystemMenu
_Flag | #PB_Window_MaximizeGadget
_Flag | #PB_Window_MinimizeGadget
_Flag | #PB_Window_ScreenCentered
;_Flag | #PB_Window_Maximize
OpenWindow(#HWnd, 0, 0, 800,400,"Fenster", _Flag)
;SetClassLongPtr_(WindowID(#HWnd),#GCL_HCURSOR,LoadCursor_(0,#IDC_WAIT))
;AddKeyboardShortcut(#HWnd,#PB_Shortcut_Space,#TSpace)

x=4
y=4
w=WindowWidth(#HWnd)-8
h=WindowHeight(#HWnd)-50
ListIconGadget(#LiGadg,x,y,w,h,"Test",w,#PB_ListIcon_GridLines|#PB_ListIcon_AlwaysShowSelection)
  AddGadgetItem(#LiGadg,-1,"Eine Zeile")
  SetGadgetState(#LiGadg,0)
x=WindowWidth(#HWnd)/2
x-50
y=WindowHeight(#HWnd)-40
w=100
h=30
ButtonGadget(#Butt,x/2,y,w,h,"ClipBoard")
  
  Define Gadg1.rahmen
  Get_GadgRahmen(@Gadg1 , #LiGadg)
  
  Define Gadg2.rahmen

Repeat
  Select WaitWindowEvent()
  Case #WM_CLOSE: ende=1
  
  Case #PB_Event_Gadget
    Select EventGadget()
    Case #butt
      Get_GadgRahmen(@Gadg2 , #butt)
      AktionsRahmen(#HWnd,@Gadg1,@Gadg2)
      
    Case #LiGadg
      If EventType()=#PB_EventType_LeftClick
        Gadg2\x1=WindowMouseX(#HWnd)
        Gadg2\y1=WindowMouseY(#HWnd)
        Gadg2\x2=WindowMouseX(#HWnd)
        Gadg2\y2=WindowMouseY(#HWnd)
        Gadg2\x3=WindowMouseX(#HWnd)
        Gadg2\y3=WindowMouseY(#HWnd)
        Gadg2\x4=WindowMouseX(#HWnd)
        Gadg2\y4=WindowMouseY(#HWnd) 
        AktionsRahmen(#HWnd,@Gadg1,@Gadg2)  
      EndIf      
    EndSelect
    
  EndSelect
Until ende
__________________________________________________
Thread verschoben
Grafik & Sound - Programmierung>Code, Tipps und Tricks
08.02.2012
RSBasic
Zuletzt geändert von BSP am 09.02.2012 00:57, insgesamt 2-mal geändert.
PB 5.31 (x86) & (x64) Win10
Benutzeravatar
Kiffi
Beiträge: 10715
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Ein kleiner Aktionsrahmen

Beitrag von Kiffi »

nette Idee! :allright:

Kleiner Schönheitsfehler: Klickt man links oben, ist der Rahmen
wesentlich schneller als wenn man rechts unten klickt.

Grüße ... Kiffi
a²+b²=mc²
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Ein kleiner Aktionsrahmen

Beitrag von DarkDragon »

Und wenn man mehrfach klickt dauert das ganze ziemlich lange. :lol:

Aber ansonsten: cool.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
BSP
Beiträge: 201
Registriert: 01.02.2009 14:04

Re: Ein kleiner Aktionsrahmen

Beitrag von BSP »

Ok, habe die Schleife und den "Schrittzähler"
in der Procedure AktionsRahmen geändert.
Nun läuft's gleichmässiger.

Gruß & Dank: BSP
PB 5.31 (x86) & (x64) Win10
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Ein kleiner Aktionsrahmen

Beitrag von Nino »

Kiffi hat geschrieben:nette Idee! :allright:
Finde ich auch!
BSP hat geschrieben:Ok, habe die Schleife und den "Schrittzähler"
in der Procedure AktionsRahmen geändert.
Nun läuft's gleichmässiger.
Das ist immer noch unnötig kompliziert IMHO. Ich hab's etwas vereinfacht. :)

Code: Alles auswählen

EnableExplicit

; ===== Ins Programm einbauen
Procedure AktionsRahmen (idWin.i, mouseX.i, mouseY.i, *start.Rect, numSteps.i=100)
   Protected.i i
   Protected.f x, y, w, h
   Protected.f stepLeft, stepAbove, stepWidth, stepHeight
   
   x = *start\left
   y = *start\top
   w = *start\right  - *start\left
   h = *start\bottom - *start\top
   
   stepLeft   = (mouseX - *start\left) / numSteps
   stepAbove  = (mouseY - *start\top)  / numSteps
   stepWidth  = w / numSteps
   stepHeight = h / numSteps
   
   StartDrawing(WindowOutput(idWin))
   DrawingMode(#PB_2DDrawing_XOr|#PB_2DDrawing_Outlined)
   For i = 1 To numSteps
      x + stepLeft
      y + stepAbove
      w - stepWidth
      h - stepHeight
      Box(x, y, w, h)
      Delay(4)
      Box(x, y, w, h)
   Next
   StopDrawing()
EndProcedure


; ===== Hier beginnt das Testprogramm
Enumeration
   #Window
EndEnumeration

Enumeration
   #List
   #Button
EndEnumeration


Define.Rect win
Define.i flags, ende, x, y, w, h

win\left   = 0
win\top    = 0
win\right  = 800
win\bottom = 400
flags = #PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget
OpenWindow(#Window, win\left, win\top, win\right, win\bottom, "Fenster", flags)

x = 4
y = 4
w = WindowWidth(#Window) - 8
h = WindowHeight(#Window) - 50
ListIconGadget(#List, x, y, w, h, "Test", w, #PB_ListIcon_GridLines|#PB_ListIcon_AlwaysShowSelection)
AddGadgetItem(#List, -1, "Eine Zeile")

x = WindowWidth(#Window)/4 - 25
y = WindowHeight(#Window) - 40
w = 100
h = 30
ButtonGadget(#Button, x, y, w, h, "ClipBoard")

Repeat
   Select WaitWindowEvent()
      Case #WM_CLOSE
         ende = 1
         
      Case #PB_Event_Gadget
         Select EventGadget()
            Case #Button
               AktionsRahmen(#Window, WindowMouseX(#Window), WindowMouseY(#Window), @win)
               
            Case #List
               If EventType() = #PB_EventType_LeftClick
                  AktionsRahmen(#Window, WindowMouseX(#Window), WindowMouseY(#Window), @win)
               EndIf     
         EndSelect
   EndSelect
Until ende
Grüße, Nino

//edit: Noch ein klein wenig mehr vereinfacht.
Zuletzt geändert von Nino am 09.02.2012 00:39, insgesamt 2-mal geändert.
Benutzeravatar
Kiffi
Beiträge: 10715
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Ein kleiner Aktionsrahmen

Beitrag von Kiffi »

@Nino: In Deinem Code wird der erste
Klick auf das ListIconGadget verschluckt.

Kann man ganz gut erkennen, wenn man
zwischen Button und LIG hin- und herklickt.

Grüße ... Kiffi
a²+b²=mc²
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Ein kleiner Aktionsrahmen

Beitrag von Nino »

Ja. Das kam, weil ich beim ListIconGadget() das Flag #PB_ListIcon_AlwaysShowSelection "wegrationalisiert" hatte. :) Ist jetzt wieder drin.

Grüße, Nino
BSP
Beiträge: 201
Registriert: 01.02.2009 14:04

Re: Ein kleiner Aktionsrahmen

Beitrag von BSP »

Hallo Nino.
Ja; Deine Version ist vieleicht etwas einfacher: Aber:
Wenn Du in meiner Version mal die Delay vergrösserst
Delay(50) oder so, dann kannst Du sehen,
das mein Rahmen vom grossen auf das kleine Gadget läuft.
Nicht nur auf den Mauspunkt.
Der Button wird quasi "eingerahmt.
Dadurch ergeben sich ausbaufähige Möglichkeiten.
Nimm mal in dem DrawingMode das "|#PB_2DDrawing_Outlined" raus.

Das mit dem nicht funktionierendem ersten Klick im Listicongadget war mir auch aufgefallen.
Keine Ahnung, warum das so ist.
Darum hatte ich auch das Flag "#PB_ListIcon_AlwaysShowSelection "
und
SetGadgetState(#LiGadg,0)
eingesetzt. Ist wohl der "Vorführeffekt". Smile.

Dann habe ich in meiner Version noch die Eventschleife
While WindowEvent():Wend
eingesetzt. Hat sich wieder mal als praktisch erwiesen.

Danke für die Rückmeldungen.
BSP
PB 5.31 (x86) & (x64) Win10
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Re: Ein kleiner Aktionsrahmen

Beitrag von rolaf »

Nino, wenn man die Fenstergröße ändert wird dies beim Aktionsrahmen nicht berücksichtigt.
Sonst nette Idee. :allright:

So wird die Fenstergröße berücksichtigt:

Code: Alles auswählen

EnableExplicit

; ===== Ins Programm einbauen
Procedure AktionsRahmen (idWin.i, mouseX.i, mouseY.i, numSteps.i=100)
   Protected.i i
   Protected.f x, y, w, h
   Protected.f stepLeft, stepAbove, stepWidth, stepHeight
   
   x = 0
   y = 0
   w = WindowWidth(idWin)
   h = WindowHeight(idWin)
   
   stepLeft   = (mouseX - x) / numSteps
   stepAbove  = (mouseY - y)  / numSteps
   stepWidth  = w / numSteps
   stepHeight = h / numSteps
   
   StartDrawing(WindowOutput(idWin))
   DrawingMode(#PB_2DDrawing_XOr|#PB_2DDrawing_Outlined)
   For i = 1 To numSteps
      x + stepLeft
      y + stepAbove
      w - stepWidth
      h - stepHeight
      Box(x, y, w, h)
      Delay(4)
      Box(x, y, w, h)
   Next
   StopDrawing()
EndProcedure


; ===== Hier beginnt das Testprogramm
Enumeration
   #Window
EndEnumeration

Enumeration
   #List
   #Button
EndEnumeration


Define.Rect win
Define.i flags, ende, x, y, w, h

win\left   = 0
win\top    = 0
win\right  = 800
win\bottom = 400
flags = #PB_Window_ScreenCentered|#PB_Window_MaximizeGadget|#PB_Window_MinimizeGadget
OpenWindow(#Window, win\left, win\top, win\right, win\bottom, "Fenster", flags)

x = 4
y = 4
w = WindowWidth(#Window) - 8
h = WindowHeight(#Window) - 50
ListIconGadget(#List, x, y, w, h, "Test", w, #PB_ListIcon_GridLines|#PB_ListIcon_AlwaysShowSelection)
AddGadgetItem(#List, -1, "Eine Zeile")

x = WindowWidth(#Window)/4 - 25
y = WindowHeight(#Window) - 40
w = 100
h = 30
ButtonGadget(#Button, x, y, w, h, "ClipBoard")

Repeat
   Select WaitWindowEvent()
      Case #WM_CLOSE
         ende = 1
         
      Case #PB_Event_Gadget
         Select EventGadget()
            Case #Button
               AktionsRahmen(#Window, WindowMouseX(#Window), WindowMouseY(#Window))
               
            Case #List
               If EventType() = #PB_EventType_LeftClick
                  AktionsRahmen(#Window, WindowMouseX(#Window), WindowMouseY(#Window))
               EndIf     
         EndSelect
   EndSelect
Until ende
Ich sehe da noch weitere Verkürzungsmöglichkeiten für deinen Code. Prozedurparameter "*start.Rect" wird gar nicht benötigt.

Edit: Parameter "*start.Rect" oben entfernt.
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Benutzeravatar
rolaf
Beiträge: 3843
Registriert: 10.03.2005 14:01

Re: Ein kleiner Aktionsrahmen

Beitrag von rolaf »

Procedure noch n bisschen aufgehübscht. :mrgreen:

Code: Alles auswählen

; ===== Ins Programm einbauen
Procedure AktionsRahmen(idWin.i, mouseX.i, mouseY.i, numSteps.i = 100)

  Protected.i i
  Protected.i x = 0
  Protected.i y = 0
  Protected.i w = WindowWidth(idWin)
  Protected.i h = WindowHeight(idWin)
  Protected.f stepLeft = (mouseX - x) / numSteps
  Protected.f stepAbove = (mouseY - y) / numSteps
  Protected.f stepWidth = w / numSteps
  Protected.f stepHeight = h / numSteps

  StartDrawing(WindowOutput(idWin))
    DrawingMode(#PB_2DDrawing_XOr | #PB_2DDrawing_Outlined)
    For i = 1 To numSteps
      x + stepLeft
      y + stepAbove
      w - stepWidth
      h - stepHeight
      Box(x, y, w, h)
      Delay(4)
      Box(x, y, w, h)
    Next
  StopDrawing()
 
EndProcedure
Mann will es ja auch gemütlich haben im Code... :lol:
:::: WIN 10 :: PB 5.73 :: (x64) ::::
Antworten