Deutsch
Forum

Flackerfreies Redraw

 
- Seite 1 -



Normann
Strübli
Moin moin,

ist schon ein wenig her seitdem ich mich intensiver mit Xprofan
beschäftigt habe also hoffentlich keine dumme Frage:

Es um eine Statusbar im Hauptfenster, die ich bei
Fenstergrößenänderung neu zeichnen möchte.
Leider flackert das ganze furchtbar, da gibt es doch sicherlich
eine bessere Lösung?

Das Subclassing soll erhalten bleiben.
 $H windows.ph
 $H messages.ph
'Statusbar
DEF CreateStatusWindow(4) ! "comctl32","CreateStatusWindow"
Declare Dialog&,Status&,SText$,Positions#
Declare CLASSNAME$,PROGRESSHandle&,HWND&,ProgressZähler&
Dim Positions#,16
Long Positions#,0=250
Long Positions#,4=500
Long Positions#,8=-1
'**********************

SUBCLASSPROC

    declare dis#,rect#,tcitem#,b#,t$,mx%,my%,i%,o%

    if &sWnd=%HWnd

        if %sMessage= ~wm_size

            SetWindowPos Status& = 0,0 - 0,0; 0'Redraw Statusbar

        ElseIf %sMessage= ~wm_sizing

            SetWindowPos Status& = 0,0 - 0,0; 0'Redraw Statusbar

        EndIf

    ENDPROC

    CLS
    Var TEXT$ = ""
    Status&=CreateStatusWindow($50000920,@ADDR(TEXT$),%HWND,1000)
    Sendmessage(Status&,$404,3,Positions#)
    Dispose Positions#
    SubClass %HWnd, 1

    While 1

        Waitinput

    EndWhile

    subclass %HWnd,0
    End
 
03.02.2023  
 



« Dieser Beitrag wurde als Lösung gekennzeichnet. »


H.Brill
Das Flackern entsteht durch das Abfragen des ~wm_sizing.
Das heißt, jedesmal, wenn die Maus das Fenster in der Größe
verändert, sich also bewegt, geht auch die Message ~wm_sizing ein.

Aber das brauchst du eigentlich nicht. Da reicht auch das
Ende der Bewegung zum Neuzeichnen. Also laß das ~wm_sizing
einfach weg.

Anbei die Verschlimmbesserung, wo die aktuelle Breite des Fensters
auch die Länge der Felder in der Statusbar neu setzt.
 $H windows.ph
 $H messages.ph
'Statusbar
DEF CreateStatusWindow(4) ! "comctl32","CreateStatusWindow"
Declare Dialog&,Status&,SText$,Positions#
Declare CLASSNAME$,PROGRESSHandle&,HWND&,ProgressZähler&
Dim Positions#,16
Long Positions#,0=250
Long Positions#,4=500
Long Positions#,8=-1
'**********************

SUBCLASSPROC

    declare Positions#, dis#,rect#,tcitem#,b#,t$,mx%,my%,i%,o%

    if &sWnd=%HWnd

        if %sMessage= ~wm_size

            SetWindowPos Status& = 0,0 - 0,0; 0'Redraw Statusbar
            Dim Positions#, 16
            Long Positions#, 0 = Width(%HWnd, 0) / 4
            Long Positions#, 4 = Width(%Hwnd, 0) / 2
            Long Positions#, 8 = -1
            SendMessage(Status&, $404, 3, Positions#)

        ElseIf %sMessage = ~wm_sizing

            SetText %HWnd, "Fensterbreite : " + Str$(Width(%HWnd))

        EndIf

    ENDPROC

    CLS
    Var TEXT$ = ""
    Status&=CreateStatusWindow($50000920,@ADDR(TEXT$),%HWND,1000)
    Sendmessage(Status&,$404,3,Positions#)
    Dispose Positions#
    SubClass %HWnd, 1

    While 1

        Waitinput

    EndWhile

    subclass %HWnd,0
    Dispose Positions#
    End

Ich denke, das ist was du meinst.
PS : Die Statusbar gibt es auch integriert als StatusWindow in Profan.
Create("StatusWindow",N1,S[,N2,B])
 
Benutze XPROFAN X3 + FREEPROFAN
Wir sind die XProfaner.
Sie werden von uns assimiliert.
Widerstand ist zwecklos!
Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.

Was die Borg können, können wir schon lange.
04.02.2023  
 




Normann
Strübli
Moin,

Im Grunde völlig klar - hab ich abgeändert und das ganze war trotzdem
am flackern.
Ich hatte so viel hin - und herprobiert und dann dieses Beispiel
aus meinen Code zusammengestellt, da war das setwindowpos dann
sowohl bei ~wm_size als auch ~wm_sizing drin

Du hast mich trotzdem auf die Lösung gebracht, weil es ja in deinem
geänderten Beispiel nicht flackert.

Ich hatte ein überlappendes Static Control - eigentlich hatte ich die höhe
der Statusbar abgezogen, durch einen kleinen Schreibfehler war dieser
Wert aber 0.
Passiert wohl wenn man zu lange den Fehler an der falschen Stelle sucht.

Vielen Dank nochmal !!!
 
04.02.2023  
 




Georg
Teles
Nabend, innerhalb der SUBCLASS fehlt übrigens ein EndIf, zum Fehler kommt es nicht, warum auch immer nicht

Ebenfalls tut das gleiche folgender Code, falls jemand vor XProfan 11 ohne SubClassing arbeitet
 $H windows.ph
 $H messages.ph
'Statusbar
DEF CreateStatusWindow(4) ! "comctl32","CreateStatusWindow"
Declare Dialog&,Status&,SText$,Positions#,OldWndProc&
Declare CLASSNAME$,PROGRESSHandle&,HWND&,ProgressZähler&
Dim Positions#,16
Long Positions#,0=250
Long Positions#,4=500
Long Positions#,8=-1
'**********************

Proc ChangeControl

    Parameters hWnd&, Message&, wParam&, lParam&
    declare Positions#, dis#,rect#,tcitem#,b#,t$,mx%,my%,i%,o%

    if hWnd&=%HWnd

        if Message&= ~wm_size

            SetWindowPos Status& = 0,0 - 0,0; 0'Redraw Statusbar
            'Dim Positions#, 16
            'Long Positions#, 0 = Width(%HWnd, 0) / 4
            'Long Positions#, 4 = Width(%Hwnd, 0) / 2
            'Long Positions#, 8 = -1
            'SendMessage(Status&, $404, 3, Positions#)

        ElseIf %sMessage = ~wm_sizing

            SetText %HWnd, "Fensterbreite : " + Str$(Width(%HWnd))

        EndIf

    EndIf

    Return ~CallWindowProc(OldWndProc&, hWnd&, Message&, wParam&, lParam&)

EndProc

Set("FastMode", 1)'FastMode
CLS
Var TEXT$ = ""
Status&=CreateStatusWindow($50000920,@ADDR(TEXT$),%HWND,1000)
Sendmessage(Status&,$404,3,Positions#)
Dispose Positions#
OldWndProc& = ~GetWindowLong(%hWnd, ~GWL_WNDPROC)' save old WindowLong
~SetWindowLong(%hWnd, ~GWL_WNDPROC, @ProcAddr("ChangeControl", 4))' set new WindowLong

While 1

    Waitinput

EndWhile

~SetWindowLong(%hWnd, ~GWL_WNDPROC, OldWndProc&)' restore WindowLong
Dispose Positions#
End

Grüße
 
Alle Sprachen
TC-Programming [...] 
XProfan 8.0 - 10.0 - X2 - X3 - X4

05.02.2023  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

2.095 Betrachtungen

Unbenanntvor 0 min.
Sven Bader24.11.2023
Axel Berse13.08.2023
Wilfried Friebe28.05.2023
Rainer Hoefs02.05.2023
Mehr...

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie