WNDCLASS Clipping

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
pbnewby
Beiträge: 34
Registriert: 21.01.2008 16:10

WNDCLASS Clipping

Beitrag von pbnewby »

Hi

Wie kann ich PureBasic bez. Windows beibringen den Fenster-Inhalt selbst zu Updaten?
Ich Zeichne das Fenster (Skin) mit einigen Grafikbefehlen. Dann, wenn ein #PB_Event_Repaint Ereignis auftritt Zeichne ich das Fenster erneut. So weit so gut. Wenn ich jedoch dann z.B. ein OpenFileRequester-Dialog öffne, so wird das Fenster nicht mehr neu gezeichnet da kein #PB_Event_Repaint eingeht bis der Dialog wieder geschlossen wird.
Ich habe dann versucht das Problem mit einem Thread zu lösen was aber bei mehreren Fehnstern langsam zu einer Orgie wird und alles andere als sauber Programmiert wirkt.
In der MSDN hab ich dann die WNDCLASS gefunden, in welcher etwas von CS_SAVEBITS, CS_VREDRAW und CS_OWNDC steht.
Ist es möglich mit diesen Windows den Kram des neuzeichnens zu überlassen?
Setze ich mit SetClassLong_(WindowID(0),#GCL_STYLE, #CS_SAVEBITS) das #CS_SAVEBITS oder #CS_OWNDC Flag, so erhalte ich von PB einen Fehler bei StartDrawing() und StopDrawing() meiner Repaint-Funktion.

Edit: #WS_CLIPSIBLINGS | #WS_CLIPCHILDREN bringt auch nichts.

Echt, langsam habe ich echt Lust PB zu löschen und wieder VB6 oder .NET zu nutzen wo man nicht so einen Aufwand betreiben muss um nur das Fenster Updaten zu können :(
-=[ PBNewBy ]=-
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Re: WNDCLASS Clipping

Beitrag von Fluid Byte »

pbnewby hat geschrieben:Wie kann ich PureBasic bez. Windows beibringen den Fenster-Inhalt selbst zu Updaten?
Üblicherweise mit einem Callback oder wie du, mit #PB_Event_Repaint.
pbnewby hat geschrieben:Ich Zeichne das Fenster (Skin) mit einigen Grafikbefehlen. Dann, wenn ein #PB_Event_Repaint Ereignis auftritt Zeichne ich das Fenster erneut. So weit so gut. Wenn ich jedoch dann z.B. ein OpenFileRequester-Dialog öffne, so wird das Fenster nicht mehr neu gezeichnet da kein #PB_Event_Repaint eingeht bis der Dialog wieder geschlossen wird.
Du brauchst einen kontinuierlich abfragenden Eventloop. Dies erreichst du mit WindowEvent() + Delay() oder WaitWindowEvent() mit Timeout-Wert.
pbnewby hat geschrieben:In der MSDN hab ich dann die WNDCLASS gefunden, in welcher etwas von CS_SAVEBITS, CS_VREDRAW und CS_OWNDC steht.
Ist es möglich mit diesen Windows den Kram des neuzeichnens zu überlassen?
Nein. Du kannst aber #CS_HREDRAW und #CS_VREDRAW setzen damit sich der Fensterinhalt automatisch beim Vergrößern / Verkleinern des Fensters aktualisiert.
pbnewby hat geschrieben:Edit: #WS_CLIPSIBLINGS | #WS_CLIPCHILDREN bringt auch nichts.
Warum sollten sie auch?
pbnewby hat geschrieben:Echt, langsam habe ich echt Lust PB zu löschen und wieder VB6 oder .NET zu nutzen wo man nicht so einen Aufwand betreiben muss um nur das Fenster Updaten zu können :(
Au ja, Pest oder Cholera. Also im Ernst, das liegt einzig an deiner Unerfahrenheit und nicht an PB. Die nahtlose Integration des API in das reguläre Befehlsset ist einfach ein Traum und sucht ihresgleichen. Du wirst das in dieser Form in keiner anderen BASIC-Sprache finden.
Windows 10 Pro, 64-Bit / Outtakes | Derek
pbnewby
Beiträge: 34
Registriert: 21.01.2008 16:10

Beitrag von pbnewby »

Danke Dir erst mal für Deine Antwort.
Au ja, Pest oder Cholera. Also im Ernst, das liegt einzig an deiner Unerfahrenheit und nicht an PB. Die nahtlose Integration des API in das reguläre Befehlsset ist einfach ein Traum und sucht ihresgleichen. Du wirst das in dieser Form in keiner anderen BASIC-Sprache finden.
Nun, in VB6 muss ich mich nicht darum kümmern das jedes Gadget, jede gezeichnete Linie und andere Grafische Sachen neu gezeichnet werden.
Auch OwnerDrawed Gadgets, Fenster usw sind dank ActiveX-Controls in VB ein Kinderspiel. Man kann Objekte übereinander legen ohne SetParent und Container-Zeugs, kann neue Gadgets von vorhandenen ableiten ohne danach auf irgend einen Callback zurückgreifen zu müssen usw.
In PB hingegen ist es nur solange einfach wenn man PB-Eigene Befehle nutzt. Will man mehr, so artet alles in 100te von Zeilen Callback-Zeugs aus.
Schau mal auf http://www.planet-source-code.com/vb/de ... p?lngWId=1 vorbei, da hast Du 10000de Möglichkeiten um auf einfachste Art und Weise Dinge zu erreichen, welche in PB selbst Experten keine Ahnung haben wie das mit PB gehen könnte. Ich meine VB6 ist schon über 10 Jahre alt und trotzdem kann man damit scheinbar schneller und effizienter GUIs erstellen.

Auch auf die Gefahr hin mich hier unbeliebt zu machen:
Ich Denke mal das PB eher für Games und nicht für Windows-GUI Programmierung zugeschnitten ist.
-=[ PBNewBy ]=-
Benutzeravatar
Laurin
Beiträge: 1639
Registriert: 23.09.2004 18:04
Wohnort: /dev/eth0

Beitrag von Laurin »

pbnewby hat geschrieben:Ich meine VB6 ist schon über 10 Jahre alt und trotzdem kann man damit scheinbar schneller und effizienter GUIs erstellen.
Hinter VB stehen aber auch ein paar hundert Entwickler, hinter PB gerade mal einer bis 3 (je nach Betrachtungsweise). Es ist logisch, dass PB in gewissen Bereichen etwas unzulänglich ist. Mit ein wenig Handarbeit kann man das aber dann wieder ausbügeln.
Now these points of data make a beautiful line.
And we're out of beta. We're releasing on time.
Benutzeravatar
Fluid Byte
Beiträge: 3110
Registriert: 27.09.2006 22:06
Wohnort: Berlin, Mitte

Beitrag von Fluid Byte »

pbnewby hat geschrieben:Nun, in VB6 muss ich mich nicht darum kümmern das jedes Gadget, jede gezeichnete Linie und andere Grafische Sachen neu gezeichnet werden.
Hast du da mal ein konkretes Beispiel inwiefern PB da im Nachteil ist?
pbnewby hat geschrieben:Auch OwnerDrawed Gadgets, Fenster usw sind dank ActiveX-Controls in VB ein Kinderspiel.
ActiveX dafür zu benötigen ist gut? OwnerDrawed Gadgets werden in PB nicht anders behandelt als in VB.
pbnewby hat geschrieben:In PB hingegen ist es nur solange einfach wenn man PB-Eigene Befehle nutzt. Will man mehr, so artet alles in 100te von Zeilen Callback-Zeugs aus.
Was genau ist denn "mehr"? Außerdem ist die Aussage "100te von Zeilen" Blödsinn. Du kannst nicht einfach alles so pauschalisieren. Es kommt drauf an was du machen willst. Außerdem benutzt VB ebenfalls Callbacks.
pbnewby hat geschrieben:... da hast Du 10000de Möglichkeiten um auf einfachste Art und Weise Dinge zu erreichen, welche in PB selbst Experten keine Ahnung haben wie das mit PB gehen könnte.
Also "10000de Möglichkeiten" ist wirklich 'ne Menge. Zieh davon drei Nullen ab und wir nähern uns der Wahrheit. :wink:
pbnewby hat geschrieben:Ich meine VB6 ist schon über 10 Jahre alt und trotzdem kann man damit scheinbar schneller und effizienter GUIs erstellen.
Das hängt vom Visual Designer ab, nicht von der Sprache. Der aktuelle Version des VD für PB ist meiner Meinung nach sehr effizient was das betrifft.
pbnewby hat geschrieben:Auch auf die Gefahr hin mich hier unbeliebt zu machen:

Es ist völlig legitim eine gewisse Meinung zu vertreten nur solltest du mit den Übertreibungen und Pauschalisierungen etwas sparsamer um dich werfen.
pbnewby hat geschrieben:Ich Denke mal das PB eher für Games und nicht für Windows-GUI Programmierung zugeschnitten ist.
Nein, es ist genau andersrum.
Windows 10 Pro, 64-Bit / Outtakes | Derek
pbnewby
Beiträge: 34
Registriert: 21.01.2008 16:10

Beitrag von pbnewby »

Laurin hat geschrieben:
pbnewby hat geschrieben:Ich meine VB6 ist schon über 10 Jahre alt und trotzdem kann man damit scheinbar schneller und effizienter GUIs erstellen.
Hinter VB stehen aber auch ein paar hundert Entwickler, hinter PB gerade mal einer bis 3 (je nach Betrachtungsweise). Es ist logisch, dass PB in gewissen Bereichen etwas unzulänglich ist. Mit ein wenig Handarbeit kann man das aber dann wieder ausbügeln.
Ein wenig Handarbeit? Wenn dem nur so wäre. Ich sage ja nicht das PB schlecht ist. Es erzeugt hervorragenden, kleinen und schnellen Code. Doch was nützt dies mir wenn ich selbst für kleinere Dinge zwei Wochen an einer Callback-Funktion schreiben muss wo ich hingegen in VB dies in 20 Min. erledigt habe?
In VB muss ich ja auch mit API nachhelfen, ist schon klar, aber wenn ich mir hier im Forum einige Callback-Schlaufen ansehe um z.B. ein OwnerDrawed Fehster oder CustomButton zu erzeugen, die alles andere als übersichtlich und gut wartbar sind, so stelle ich mir eben die Frage ob sich dass zugunsten des grossen Aufwands lohnt. Zeit ist Geld...

Zum Rest
Das lass ich mal so dahin gestellt.

Edit by NicTheQuick: Diese verdammten Doppelposts mit riesen-Quotes
nerven langsam! Meine Farbe ist grün
-=[ PBNewBy ]=-
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

direkt auf Fenstermalen ist unprickelnd .male, so möglich, in ein
imagegadget. das problemlöst so einiges.
anbei ne kleine spielerei (u.a.auch mit dem üblen VD gemacht :twisted: )

Code: Alles auswählen

; PB4.10
; PureBasic Visual Designer v3.95 build 1485 (PB4Code)
;- Window Constants
;
Enumeration
  #Window_0
EndEnumeration
;- Gadget Constants
;
Enumeration
  #Button_0
  #Button_1
  #Button_2
  #Button_3
  #Button_schratig
  #Image_0
  #Button_4
  #Text_0
  #Image
EndEnumeration
;- Image Plugins
;- Image Globals
;- Catch Images
CreateImage(#Image,100,100)
StartDrawing(ImageOutput(#Image))
  Box(0,0,100,100,RGB(64,200,222))
  For z=0 To 5000
    Plot(Random(200),Random(200),RGB(Random(128)+128,Random(128)+128,Random(128)+128))
  Next z
StopDrawing()
;SetGadgetState(#Image_0,Image0)
;- Images

If OpenWindow(#Window_0, 216, 0, 900, 900, "New window ( 0 )",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
  If CreateGadgetList(WindowID(#Window_0))
    ImageGadget(#Image_0, 60, 100, 100, 70, ImageID(#Image),#PB_Image_Border)
    DisableGadget(#Image_0,1)
    ButtonGadget(#Button_0, 100, 40, 70, 30, "1 an")
    ButtonGadget(#Button_1, 170, 40, 60, 30, "1&&3 aus")
    ButtonGadget(#Button_2, 230, 40, 80, 30, "7 Dialog")
    ButtonGadget(#Button_3, 310, 40, 120, 30, "3 Windowdrawing an")
    ButtonGadget(#Button_schratig, 430, 40, 120, 30, "schratig an")
    TextGadget(#Text_0, 170, 90, 420, 80, "schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel schnasel ")
    ButtonGadget(#Button_4, 210, 190, 220, 60, "ENDE")
  EndIf
EndIf

Repeat ; Start of the event loop
  
  If eumel
    StartDrawing(ImageOutput(#Image))
      Box(0,0,100,100,RGB(64,200,222))
      For z=0 To 500
        x=Random(100)
        y=Random(100)
        Box(x,y,5,5,RGB(Random(128)+128,Random(128)+128,Random(128)+128))
      Next z
    StopDrawing()
    SetGadgetState(#Image_0,ImageID(#Image))
    
  EndIf
  
  Event = WaitWindowEvent(eumel) ; This line waits until an event is received from Windows
  WindowID = EventWindow() ; The Window where the event is generated, can be used in the gadget procedures
  GadgetID = EventGadget() ; Is it a gadget event?
  EventType = EventType() ; The event type
  
  If event<>0 ; bei Events
    SetGadgetText(#Text_0,Str(event))  ;Ausgabe des Events
    
    If erwin                                         ;so es soll
      StartDrawing(WindowOutput(#window_0))          ;wird das Bild auf
        DrawImage(ImageID(#Image),0,0,100,100)       ;das Window gemalt
        DrawText(0,0,"ich zappel nur für Events")
      StopDrawing()
    EndIf
    
  EndIf
  
  ;You can place code here, and use the result as parameters for the procedures
  
  If Event = #PB_Event_Gadget
    
    If GadgetID = #Button_0
      eumel=20
    ElseIf GadgetID = #Button_schratig
      If GetGadgetText(#Button_schratig)="schratig an"
        SetGadgetText(#Button_schratig,"schratig aus")
      Else
        SetGadgetText(#Button_schratig,"schratig an")
      EndIf
      
    ElseIf GadgetID = #Button_1
      eumel=0
      If erwin                                       ;so es soll
        erwin=0                                      ;soll es nicht mehr :)
        StartDrawing(WindowOutput(#Window_0))        ;letzte Ausgabe
          DrawText(0,0,"refresh? ..selber machen")
          Delay(1000)
          DrawText(20,0,"AaH .. Idee !!")
          Delay(500)
        StopDrawing()
        ;es folgt eine etwas ungewöhnliche refreshlösung
        
        y=WindowY(#window_0)
        If GetGadgetText(#Button_schratig)="schratig an"
          While WindowHeight(#window_0)+WindowY(#window_0)>0
            ResizeWindow(#window_0,#PB_Ignore,WindowY(#window_0)-1,#PB_Ignore,#PB_Ignore)
            While WindowEvent():Wend
            Delay(1)
          Wend
          While WindowY(#window_0)<y
            ResizeWindow(#window_0,#PB_Ignore,WindowY(#window_0)+1,#PB_Ignore,#PB_Ignore)
            While WindowEvent():Wend
            Delay(2)
          Wend
        Else
          ResizeWindow(#window_0,#PB_Ignore,-WindowHeight(#window_0),#PB_Ignore,#PB_Ignore)
          ResizeWindow(#window_0,#PB_Ignore,y,#PB_Ignore,#PB_Ignore)
        EndIf
        
      EndIf
      
    ElseIf GadgetID = #Button_2
      OpenFileRequester("Eumel?","redraw checken","*.*",0)
    ElseIf GadgetID = #Button_3
      erwin=1
    ElseIf GadgetID = #Image_0
    ElseIf GadgetID = #Button_4
      quit=1
    EndIf
  EndIf
Until Event = #PB_Event_CloseWindow Or quit=1; End of the event loop
End

‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Antworten