WebGadget im Container nach Resize verschwunden

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

WebGadget im Container nach Resize verschwunden

Beitrag von Bisonte »

Hallo. Ich hab da grade ein sehr nerviges Problem :

Ich habe hier ein SplitterGadget, das Vertikal 2 Container in der Grösse ändern kann.
Beim Splittergadget "resize", also dem bewegen des Balkens, flackert es natürlicherweise beim Webgadget.
Das ist aber gar nicht das Problem, sondern, das das Webgadget komplett nicht mehr auftaucht.
Wenn man den Splitter nun ein wenig hin und herschiebt, verschwindet das Webgadget komplett.

Um festzustellen, ob der Splitterbalken sich bewegt, nehme ich den relativ neuen EventType des
Containergadgets : #PB_EventType_Resize. Also ich prüfe ob der Container die Grösse ändert (was
ja beim Splitter der Fall ist). Ansonsten wüsste ich jetzt nicht, wie man feststellen sollte das der User
das Splittergadget benutzt. Das Ding hat ja keine Events/EventTypes laut der Hilfe.

Wie krieg ich das Webgadget nach einem Resize wieder sichtbar ?

Lösungen dürfen auch WindowsAPI enthalten... ;)

Hier eine Demo um das Problem zu veranschaulichen.

Code: Alles auswählen

OpenWindow(0, 0, 0, 640, 480, "Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)

; Container Links mit nix drin
ContainerGadget(0, 0, 0, 0, 0, #PB_Container_Raised) : CloseGadgetList()
; Container Rechts mit dem WebGadget
ContainerGadget(1, 0, 0, 0, 0, #PB_Container_Double) 
WebGadget(2, 0, 0, 0, 0, "http://www.google.de")
CloseGadgetList()

; Splitter der die beiden Container beinhaltet
SplitterGadget(3, 0, 0, 640, 480, 0, 1, #PB_Splitter_Vertical)

Repeat
  
  Event = WaitWindowEvent()
  
  Select Event
    Case #PB_Event_CloseWindow
      Break
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1 ; Container rechts
          If EventType() = #PB_EventType_Resize ; Wurde in der Grösse geändert
            ResizeGadget(2, 0, 0, GadgetWidth(1), GadgetHeight(1)); Webgadget an Container anpassen
          EndIf
      EndSelect
      
  EndSelect
  
ForEver
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: WebGadget im Container nach Resize verschwunden

Beitrag von mk-soft »

Es scheint sich das WebGadget bei zu schnellen neu Zeichen zu verschlucken.

Habe es mal ohne API gelöst. Dazu wird nur alle 500 ms das WebGadget in der große geändert. Scheint zu funktionieren.

Code: Alles auswählen


OpenWindow(0, 0, 0, 640, 480, "Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)

; Container Links mit nix drin
ContainerGadget(0, 0, 0, 0, 0, #PB_Container_Raised) : CloseGadgetList()
; Container Rechts mit dem WebGadget
ContainerGadget(1, 0, 0, 0, 0, #PB_Container_Double) 
WebGadget(2, 0, 0, 0, 0, "http://www.google.de")
CloseGadgetList()

; Splitter der die beiden Container beinhaltet
SplitterGadget(3, 0, 0, 640, 480, 0, 1, #PB_Splitter_Vertical)


Global start_timer

Repeat
  
  Event = WaitWindowEvent()
  
  Select Event
    Case #PB_Event_CloseWindow
      Break
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1 ; Container rechts
          If EventType() = #PB_EventType_Resize ; Wurde in der Grösse geändert
            If Not start_timer
              AddWindowTimer(0, 1, 500)
              start_timer = #True
            EndIf
          EndIf
      EndSelect
    Case #PB_Event_Timer
      Select EventTimer()
        Case 1
          ResizeGadget(2, 0, 0, GadgetWidth(1), GadgetHeight(1)); Webgadget an Container anpassen
          RemoveWindowTimer(0, 1)
          start_timer = #False
      EndSelect
  EndSelect
  
ForEver
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: WebGadget im Container nach Resize verschwunden

Beitrag von RSBasic »

Ich hatte vorhin genau die selbe Idee und habe auch versucht, mit einem Timer das Problem von Bisonte zu beheben, aber leider funktioniert es nicht zuverlässig: http://www.rsbasic.de/temp/2018-02-10%2021-57-29.mp4
Getestet mit dem Code von mk-soft
Das Redraw-Problem entsteht immer, wenn man versucht, mit der Maus zuerst nach links oder rechts zu verschieben und dann nach unten oder oben. Dann wird nichts mehr gezeichnet.
Ich habe vorhin auch mit verschiedenen Redraw-Möglichkeiten (#WM_NCPAINT, InvalidateRect_(), #WM_Paint, UpdateWindow_(), #SWP_FRAMECHANGED, RedrawWindow_(), HideGadget(), ...) ausprobiert, aber leider erfolglos. Sonst hätte ich dir bereits eine Lösung gepostet.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: WebGadget im Container nach Resize verschwunden

Beitrag von Bisonte »

@mk-Soft: Interessanter Lösungsversuch. Leider hilft das nicht wirklich. Es kommen immer wieder Momente in denen das Webgadget "verschwindet".
Allerdings verschwindet das Webgadget nicht wirklich. Wenn man mit rechter Maustaste auf den rechten grauen bereich klickt,
kommt das typische Popupmenu (hier das vom IE). Wenn man "Quellcode anzeigen" wählt, erscheint der Editor in nur "<HTML></HTML>"
angezeigt wird. Also liegt es am Zusammenwirken von Container/Splitter und Webgadget. Weil wenn man den Container
weglässt und das Webgadget direkt in den Splitter einträgt, klappt alles.... Nur dann kann ich da keine weiteren Gadgets mehr einfügen, oder
einen Rahmen um das Webgadget machen .....

@RSBasic: Ich hab all die verschiedenen Möglichkeiten auch probiert. Sogar die Webseite per Refresh neu laden zu lassen, die Url selbst neu eingetragen, ja selbst den HTML Text vorher aus dem Webgadget lesen und wieder einfügen klappt alles nicht. wenn das Ding einmal grau ist, bleibt es das auch. In einigen Fällen hilft es nur wenn man mit der Maus über das Webgadget fährt oder reinklickt und rauf und runterscrollt.
Aber das ist ja nicht wirklich ein Zustand ;)

Und selbst ein Webgadget ohne Splitter resizen ..... genau das gleiche Problem. Nur einzelnd im Splitter scheint es zu gehen.
Gibt es für Windows eine "einfach" zu nutzende Alternative zum Webgadget IE ActiveX Control... so wie früher das Mozilla Control ?
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: WebGadget im Container nach Resize verschwunden

Beitrag von RSBasic »

@Bisonte
Ich habe für das Problem, welches ich nachollziehen konnte und auch in meinem Video gezeigt habe, eine Lösung gefunden. Kannst du meinen Code testen und prüfen, ob dein Problem auch behoben wurde?

Code: Alles auswählen


Global WebGadgetCB

Procedure WebGadgetCB(hWnd, uMsg, wParam, lParam)
  
  Select uMsg
    Case #WM_LBUTTONUP
      HideGadget(2, 1)
      HideGadget(2, 0)
  EndSelect
  
  ProcedureReturn CallWindowProc_(WebGadgetCB, hWnd, uMsg, wParam, lParam)
EndProcedure

OpenWindow(0, 0, 0, 640, 480, "Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)

; Container Links mit nix drin
ContainerGadget(0, 0, 0, 0, 0, #PB_Container_Raised) : CloseGadgetList()
; Container Rechts mit dem WebGadget
ContainerGadget(1, 0, 0, 0, 0, #PB_Container_Double)
WebGadget(2, 0, 0, 0, 0, "http://www.google.de")
CloseGadgetList()

; Splitter der die beiden Container beinhaltet
SplitterGadget(3, 0, 0, 640, 480, 0, 1, #PB_Splitter_Vertical)

WebGadgetCB = SetWindowLongPtr_(GadgetID(3), #GWL_WNDPROC, @WebGadgetCB())

Repeat
  
  Event = WaitWindowEvent()
  
  Select Event
    Case #PB_Event_CloseWindow
      Break
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1 ; Container rechts
          If EventType() = #PB_EventType_Resize ; Wurde in der Grösse geändert
            ResizeGadget(2, 0, 0, GadgetWidth(1), GadgetHeight(1)); Webgadget an Container anpassen
          EndIf
      EndSelect
      
  EndSelect
  
ForEver
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: WebGadget im Container nach Resize verschwunden

Beitrag von Bisonte »

Klasse. Dem Splitter einen Callback aufzudrücken, darauf bin ich nicht gekommen :allright: ... Somit hab ich dann auch gleich sämtliches
"Geflacker" ausgeschaltet, indem ich bei #WM_LBUTTONDOWN das Webgadget verstecke und so wie bei dir bei #WMLBUTTONUP wieder
anzeige.

Dann will ich mal hoffen, das das auf den anderen beiden OS nicht auch so dramatisch wird... ;)

Danke nochmals !!!
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: WebGadget im Container nach Resize verschwunden

Beitrag von mk-soft »

Vielleicht noch ein anderen Lösungsansatz.

Im rechte Splitterbereich noch ein SplitterGadget setzen. Dann flackert auch nicht mehr.

Code: Alles auswählen

OpenWindow(0, 0, 0, 640, 480, "Test", #PB_Window_ScreenCentered|#PB_Window_SystemMenu)

; Container Links mit nix drin
ContainerGadget(0, 0, 0, 0, 0, #PB_Container_Raised) : CloseGadgetList()

;Rechte Seite
WebGadget(2, 0, 0, 0, 0, "http://www.google.de")
TextGadget(3, 0, 0, 0, 0, GetGadgetText(2))

SplitterGadget(4, 0, 0, 640, 480, 2, 3, #PB_Splitter_SecondFixed)
SetGadgetState(4, 460)
; Splitter der die beiden Container beinhaltet
SplitterGadget(5, 0, 0, 640, 480, 0, 4, #PB_Splitter_Vertical)

Repeat
  
  Event = WaitWindowEvent()
  
  Select Event
    Case #PB_Event_CloseWindow
      Break
      
    Case #PB_Event_Gadget
      Select EventGadget()
        Case 1 ; Container rechts
          If EventType() = #PB_EventType_Resize ; Wurde in der Grösse geändert
          EndIf
      EndSelect
  EndSelect
  
ForEver
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten