Forum | | | | - 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
|
| | | | |
| | « 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 !!! |
| | | | |
| | 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 |
| | | | |
|
AntwortenThemenoptionen | 2.095 Betrachtungen |
ThemeninformationenDieses Thema hat 3 Teilnehmer: |