Seite 2 von 2

Verfasst: 26.05.2007 01:56
von Xaby
vielleicht reiß ich ja auch mal eine LIB, die dich vom Hocker haut.
Hab dich auch lieb :)
Schlaf gut.

Und was das Ziel und den Weg angeht, sehe ich es genauso.
Aber ich muss doch erstmal schauen, wie ich in PB was genau machen kann, um dann zu entscheiden, ob es mir den Aufwand wert ist oder nicht.

Ich hätte mir auch selbst ein Gadget mit CreateGadget() gemacht, aber da hab ich die Beispiele nicht verstanden. Und ich hab auch noch nicht begriffen, was die Marcos so cool macht. Werden dadurch EXE schneller und größer? Oder nur schneller ... (oder nur größer :| )

:coderselixir: :allright:

Verfasst: 26.05.2007 02:05
von ts-soft
Xaby hat geschrieben: Und was das Ziel und den Weg angeht, sehe ich es genauso.
Aber ich muss doch erstmal schauen, wie ich in PB was genau machen kann, um dann zu entscheiden, ob es mir den Aufwand wert ist oder nicht.
Einfach so machen wie Du es im Moment am einfachsten oder sinnvollsten
findest, bessere Wege wirste dann später autom. lernen zu beurteilen und
einzusetzen, wenn sie besser sind. Es gibt keinen optimalen Weg, das ändert
sich immer mit der Aufgabe. Aber ich wiederhole mich, also gn8

Verfasst: 26.05.2007 02:20
von edel

Code: Alles auswählen

Prototype reset(long.l)
Prototype check(long.l,max=10) ; prototyp mit default wert , long.l gibt nur den typ an und ist keine variable

Structure obj
  count.l 
  reset.reset  ; prototyp -> methode
  check.check  ; prototyp -> methode
EndStructure

Procedure _check(*o.obj,max) ; -> methode
  If *o\count = max
    *o\reset(*o)
    Debug "Counter wurde zurueck gesetzt"
  EndIf 
EndProcedure

Procedure _reset(*o.obj) ; -> methode
  *o\count = 0
EndProcedure

Procedure NewObj() ; konstruktor
  Protected *o.obj
  *o = AllocateMemory(SizeOf(obj))
  *o\reset = @_reset()
  *o\check = @_check()
  ProcedureReturn *o
EndProcedure

Procedure main()
  Protected hWnd.l , gadget.l , event.l
  Protected *objekt.obj
  
  hWnd = OpenWindow(0,#PB_Ignore,#PB_Ignore,200,100,"leer")
  
  CreateGadgetList(hWnd)
  ButtonGadget(0,0,0,100,100,"button 1")
  ButtonGadget(1,100,0,100,100,"button 2")
  
  *objekt = NewObj() ; neues objekt erstellen
  SetGadgetData(0,*objekt) ; object dem gadget zuweisen - es reicht hier eigentlich auch ein SetGadgetData(0,NewObj())
  *objekt = NewObj() ; neues objekt erstellen
  SetGadgetData(1,*objekt) ; object dem gadget zuweisen
  
  Repeat
    event = WaitWindowEvent()
    
    If event = #PB_Event_Gadget
      gadget = EventGadget()
      *objekt = GetGadgetData(gadget) ; object wieder aus dem gadget holen
      *objekt\count + 1 
      Debug "Der Button " + GetGadgetText(gadget) +  " wurde " + Str(*objekt\count) + " mal gedrueckt"
      *objekt\check(*objekt) ; Methode aufrufen, Objekt muss mit uebergeben werden , da PB so kein this kennt.
    EndIf
    
    
  Until event = #PB_Event_CloseWindow
  
EndProcedure:main()

Ich hätte mir auch selbst ein Gadget mit CreateGadget() gemacht, aber da hab ich die Beispiele nicht verstanden.
Was genau moechtest du ueberhaupt machen :?

Verfasst: 26.05.2007 10:25
von Xaby
Ich wollte mir ein Mal-Gadget basteln.

Welches ich in der Größe angebe und auch Vorder und Hintergrundfarbe.

Ich wollte ein ImageGadget und ein Image benutzen.
Beide bekommen die gleiche ID.

Wenn man mit der Maus über dem Gadget ist und eine Taste drückt, soll die Farbe benutzt werden, die man als Vordergrundfarbe eingestellt hat.

Als Rückgabe meines Gadgets soll man das Bild bekommen können.
Aber auch die einzelnen Punkte, die man schon gemalt hat.

Am besten in einer Liste.


Klar kann ich die Sache auch anders regeln. Aber ich wollte es gleich so machen, dass ich mehrere dieser Gadgets machen kann.
Und es soll auch nicht unbedingt von der Maus abhängen.

Man könnte dann zum Beispiel durch verschiedene Benutzer auf einem oder auf mehreren Gadgets zeichnen.

Schau dir mal was zum Thema Videoanalyse an:
http://www.purebasic.fr/german/viewtopi ... deoanalyse

Ich wollte es so machen, dass man an dieses Gadget auch als State ein Image liefern kann und dann mit GetGadgetData eine Liste der erkannten Objekte erhält.

Und als Gadget sollte es sein, damit der normale Nutzer vielleicht verstehen muss, was eine Liste ist, aber der Rest wie ein ImageButton Gadget nach außenhin wirkt.

Genauso wenn man einen Farbrequester hätte, der 16 vordefinierte Farben hat.
Hab hier schon mal was im Forum dazu gesehen.

Ich würds halt toll finden, wenn es eine einfache vorgehensweise gibt, wie man Gadgets machen kann, die alles mögliche Zurückgeben können.

Da fällt mir ein:

- Eine Liste kann ich ja auch mit Items machen.

Wenn ich GetGadgetItem...
benutzen könnte auf mein Gadget, obwohl es aussieht wie ein ImageGadget ... das wäre cool.

Dann bräuchte ich andere verrenkungen nicht machen.

Als ItemColor bekommt man dann die Farbe des Punktes wieder.
http://www.purebasic.fr/german/viewtopi ... icongadget

Das Problem ist, ich möchte keine zwei GadgetIDs verwenden.
Denn dann wären es ja mehrere Gadgets.
Man soll das resultierende Gadet jedoch wie gewohnt benutzen können und es soll nicht vorkommen, dass der Anwender Fehler ohne Ende hat, nur weil er die zweite GadgetID, die ich benutzen würde schon belegt hat und sich wundert, das nix zu sehen ist oder mein Gadget nicht auf seine eigene unsichtbare Liste zugreifen kann ...

:? Dank dir im Voraus :allright:

Ein bisschen CODE:

Code: Alles auswählen

EnableExplicit

Enumeration
  #MainWin
  
  #Eingabe
  #Eingabe2
EndEnumeration

Define Event.l
Define EventType.l
Define GadgetNr.l
Define MausA.POINT
Define MausE.POINT

NewList MausPunkte.POINT()


;Global NewList GadgetFarben()

Procedure Erstelle(Gadget.l,x.l,y.l,xl.l,yl.l,f.l=#White, f2.l=#Blue)
  CreateImage(Gadget,xl,yl)
  StartDrawing(ImageOutput(Gadget))
  Box(0,0,xl,yl,f)
  StopDrawing()
  ImageGadget(Gadget,x,y,xl,yl,ImageID(Gadget),#PB_Image_Border)  
EndProcedure


Procedure Prufen()   
  
EndProcedure


OpenPreferences("FLMAUSiX.ini")
Define WinPosX_MainWin.l=ReadPreferenceLong("WINDOW_XPOS_MAIN",50);
Define WinPosY_MainWin.l=ReadPreferenceLong("WINDOW_YPOS_MAIN",50);
ClosePreferences()

OpenWindow(#MainWin,WinPosX_MainWin,WinPosY_MainWin, 750,550,":: FL :: MAUSiX")

CreateGadgetList(WindowID(#MainWin))
Erstelle(#Eingabe,10,10,300,300,#White)
Erstelle(#Eingabe2,320,10,300,300,#Yellow,#Black)


Repeat
  
  Event= WaitWindowEvent()
  
  If Event=#PB_Event_Gadget
    GadgetNr=EventGadget()
    Debug GadgetNr
  EndIf  
  
Until Event=#PB_Event_CloseWindow

CreatePreferences("FLMAUSiX.ini")
WritePreferenceLong("WINDOW_XPOS_MAIN",WindowX(#MainWin))
WritePreferenceLong("WINDOW_YPOS_MAIN",WindowY(#MainWin))

ClosePreferences()

CloseWindow(#MainWin)

Sowas in der Richtung, nur mit ein paar mehr Optionen.
Vielleicht gleich ein kleines Zeichenprogramm, was man einfach einbinden kann später in seine Programme.

Code: Alles auswählen

;XIncludeFile "MyPaintBoxGadget.pb"

; original source by El_Choni

OpenWindow(0, #PB_Ignore, 0, 320, 256, "MyPaintBoxGadget test", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget)
SetWindowLong_(WindowID(0), #GWL_STYLE, GetWindowLong_(WindowID(0), #GWL_STYLE)|#WS_CLIPCHILDREN)
CreateGadgetList(WindowID(0))
EC_MyPaintBoxGadget(0, 0, 0, 320, 256, 4, $FF00, $FF0000)

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_SizeWindow
      ResizeGadget(0, #PB_Ignore, #PB_Ignore, WindowWidth(0), WindowHeight(0))
  EndSelect  
  
ForEver
Hab mir auch mal die IncludeDatei angesehen.
Sehr mystisch :? Auch viele * * * und \\\
Einen eigenen Gadget zu erstellen ist doch etwas komplexer.
:roll:

Verfasst: 26.05.2007 11:09
von Xaby
Hab mir die MyPaintBoxGadget.pb
Mal angesehen. Wie ich das sehe, müsste man mit GetGadgetState() die Zeichenfarbe wieder bekommen. Das funktioniert aber nicht.
Und wie ich das Bild ermitteln kann, steht auch in den Sternen.
Was nützen einem Zeichenfunktionen, wenn man nicht weiß, was man gemalt hat :mrgreen:
Für Leute, die einfach nur mal kritzeln wollen und den Datenmüll eh nicht speichern würden :D

Dient wahrscheinlich auch nur als Beispiel, und ist deshalb nicht so umfangreich.

Code: Alles auswählen

;XIncludeFile "MyPaintBoxGadget.pb"

Download der CreateGadget() und Beispiele wie diese PaintBox:
[url]http://www.purebasic.fr/german/viewtopic.php?t=8071&start=0[/url]

; original source by El_Choni

OpenWindow(0, #PB_Ignore, 0, 640, 556, "MyPaintBoxGadget test", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_SizeGadget|#PB_Window_MaximizeGadget)
SetWindowLong_(WindowID(0), #GWL_STYLE, GetWindowLong_(WindowID(0), #GWL_STYLE)|#WS_CLIPCHILDREN)
CreateGadgetList(WindowID(0))
EC_MyPaintBoxGadget(0, 0, 0, 320, 240, 4, $FF00, $FF0000)
EC_MyPaintBoxGadget(1, 320, 0, 320, 240, 2, $0, #White)
ButtonGadget(3,280,240,80,20,"1->2")

Repeat
  Select WaitWindowEvent()
    Case #PB_Event_CloseWindow
      Break
    Case #PB_Event_SizeWindow
      ;ResizeGadget(0, #PB_Ignore, #PB_Ignore, WindowWidth(0), WindowHeight(0))
    Case #PB_Event_Gadget  
      GadgetNr=EventGadget()
      Debug GadgetNr
      If GadgetNr=3
        SetGadgetState(1,GetGadgetState(2))   ; Tauscht die MalfarbeFarbe des Gadgets, zu mindest würde ich das aus der PaintBoxGadget.pbi lesen  
      EndIf   
      
  EndSelect
   
  
ForEver
......................

Hab mich nun erstmal entschieden, es so zu versuchen. ts-soft hat ja recht. Und wenn ihr dann später lieber einen Gadget haben wollt, könnt ihr mir ja bei helfen.

Code: Alles auswählen

EnableExplicit


Structure HWR_Type
  fcolor.l
  hcolor.l
  
EndStructure

Enumeration
  #MainWin
  
  #Eingabe
  #Eingabe2
EndEnumeration

Define Event.l
Define EventType.l
Define GadgetNr.l
Define MausA.POINT
Define MausE.POINT

Define StartTime, EndTime


NewList MausPunkte.POINT()



;Global NewList GadgetFarben()

Procedure Erstelle(Gadget.l,x.l,y.l,xl.l,yl.l,f.l=#Blue,f2.l=#White)
  CreateImage(Gadget,xl,yl)
  StartDrawing(ImageOutput(Gadget))
  Box(0,0,xl,yl,f2)
  StopDrawing()
  ImageGadget(Gadget,x,y,xl,yl,ImageID(Gadget),#PB_Image_Border)  
  SetGadgetData(Gadget,f)
EndProcedure


Procedure Prufen() 
  
  
EndProcedure

Procedure Zeichnen(Gadget.l, GadgetN.l);,*PA.POINT)
  Static PN.POINT
  If Gadget = GadgetN ; And  IsGadget(Gadget) ... wenn eine GadgetNummer vorhanden ist, muss zwangsweise ein echtes Gadget vorliegen
    If GadgetType(Gadget)=#PB_GadgetType_Image
      StartDrawing(ImageOutput(Gadget))
      PN\x=WindowMouseX(#MainWin)-GadgetX(Gadget)
      Debug PN\x
      PN\y=WindowMouseY(#MainWin)-GadgetY(Gadget)
        Circle(PN\x,PN\y,3,GetGadgetData(Gadget))
      
        ;LineXY(*PA\x,*PAy\
      StopDrawing()
      SetGadgetState(Gadget,ImageID(Gadget))
    EndIf  
  EndIf
EndProcedure



OpenPreferences("FLMAUSiX.ini")
Define WinPosX_MainWin.l=ReadPreferenceLong("WINDOW_XPOS_MAIN",50);
Define WinPosY_MainWin.l=ReadPreferenceLong("WINDOW_YPOS_MAIN",50);
ClosePreferences()

OpenWindow(#MainWin,WinPosX_MainWin,WinPosY_MainWin, 750,550,":: FL :: MAUSiX")

CreateGadgetList(WindowID(#MainWin))
Erstelle(#Eingabe,10,10,300,300)
Erstelle(#Eingabe2,320,10,300,300,#Black,#Yellow)


Repeat
  
  Event= WaitWindowEvent()
  
  If Event=#PB_Event_Gadget
    GadgetNr=EventGadget()
    Debug GadgetNr
    Zeichnen(#Eingabe,GadgetNr)
    Zeichnen(#Eingabe2,GadgetNr)
    
    
  EndIf  
  GadgetNr=-1
  
  
Until Event=#PB_Event_CloseWindow

CreatePreferences("FLMAUSiX.ini")
WritePreferenceLong("WINDOW_XPOS_MAIN",WindowX(#MainWin))
WritePreferenceLong("WINDOW_YPOS_MAIN",WindowY(#MainWin))

ClosePreferences()

CloseWindow(#MainWin)
PB Hilfe hat geschrieben:ImageGadget(): gibt die ImageID des gerade angezeigten Bilds zurück.
Wieso kann ich dann nicht
StartDrawing(ImageOutput(GetGadgetState(#)))
machen?

Debug ImageID(GetGadgetState(GadgetNr))
Geht auch nicht.

Wie kann ich ImageID(#Image) -> Umwandeln in #Image

:freak:

Verfasst: 26.05.2007 16:18
von Xaby

Code: Alles auswählen

EnableExplicit


Procedure.b MouseOverGadget(GadID.l, Window.l) 
  Static result.b
  Static mX.l
  Static mY.l
  result =  #False
  mX.l = WindowMouseX(Window): mY.l = WindowMouseY(Window) 
  If (mX>GadgetX(GadID)) And (mX <(GadgetX(GadID)+GadgetWidth (GadID))): result+1: EndIf ; Wenn Resultat = 1, dann X-Bereich
  If (mY>GadgetY(GadID)) And (mY <(GadgetY(GadID)+GadgetHeight(GadID))): result+2: EndIf ; wenn Resultat = 2, dann y-Bereich
  ; wenn Resultat = 3, befindet sich die Mouse im Feld
  ProcedureReturn result 
EndProcedure 

Procedure GetMousePoints(GadID.l,Window.l,*xy.POINT)
  *xy\x=WindowMouseX(Window)-GadgetX(GadID)
  *xy\y=WindowMouseY(Window)-GadgetY(GadID) 
EndProcedure


Procedure.b MouseWindowButton()
  Static result
  If GetAsyncKeyState_(#VK_LBUTTON)
    result=1
  ElseIf GetAsyncKeyState_(#VK_RBUTTON)
    result=2
  ElseIf GetAsyncKeyState_(#VK_MBUTTON)
    result=3
  Else
    result=0  
  EndIf
  ProcedureReturn result
  
EndProcedure  
  
  


Structure HWR_Type
  fcolor.l
  hcolor.l
  
EndStructure

Enumeration
  #MainWin
  
  #Eingabe
  #Eingabe2
EndEnumeration

Define Event.l
Define EventType.l
Define GadgetNr.l
Define MausA.POINT
Define MausE.POINT

Define StartTime, EndTime


NewList MausPunkte.POINT()



;Global NewList GadgetFarben()

Procedure Erstelle(Gadget.l,x.l,y.l,xl.l,yl.l,f.l=#Blue,f2.l=#White)
  CreateImage(Gadget,xl,yl)
  StartDrawing(ImageOutput(Gadget))
  Box(0,0,xl,yl,f2)
  StopDrawing()
  ImageGadget(Gadget,x,y,xl,yl,ImageID(Gadget),#PB_Image_Border)  
  SetGadgetData(Gadget,f)
EndProcedure


Procedure Prufen() 
  
  
EndProcedure

Procedure Zeichnen(Gadget.l, GadgetN.l, Window.l);,*PA.POINT)
  Static P.POINT
  If MouseOverGadget(Gadget,Window) And MouseWindowButton()=1
    GetMousePoints(Gadget, Window,@P)
    StartDrawing(ImageOutput(Gadget))
     Circle(P\x,P\y,3,GetGadgetData(Gadget))
    StopDrawing()
    SetGadgetState(Gadget, ImageID(Gadget))
  EndIf 
EndProcedure



OpenPreferences("FLMAUSiX.ini")
Define WinPosX_MainWin.l=ReadPreferenceLong("WINDOW_XPOS_MAIN",50);
Define WinPosY_MainWin.l=ReadPreferenceLong("WINDOW_YPOS_MAIN",50);
ClosePreferences()

OpenWindow(#MainWin,WinPosX_MainWin,WinPosY_MainWin, 750,550,":: FL :: MAUSiX")

CreateGadgetList(WindowID(#MainWin))
Erstelle(#Eingabe,10,10,300,300)
Erstelle(#Eingabe2,320,10,300,300,#Black,#Yellow)


Repeat
  
  Event= WaitWindowEvent()
  
  If Event=#PB_Event_Gadget
    GadgetNr=EventGadget()
    Debug GadgetNr
   
    ;Debug GetGadgetState(GadgetNr)
    
  EndIf  
  
  Zeichnen(#Eingabe,GadgetNr,#MainWin)
  Zeichnen(#Eingabe2,GadgetNr,#MainWin)
  
  
  GadgetNr=-1
  
  
Until Event=#PB_Event_CloseWindow

CreatePreferences("FLMAUSiX.ini")
WritePreferenceLong("WINDOW_XPOS_MAIN",WindowX(#MainWin))
WritePreferenceLong("WINDOW_YPOS_MAIN",WindowY(#MainWin))

ClosePreferences()


CloseWindow(#MainWin)
Was noch fehlt sind die zu merkenden letzten Koordinaten, damit man Linien zwischen den Punkten zeichnen kann.

Aber sonst doch schon ganz schick oder? :roll: