Lockwindowupdate vs WM_SETREDRAW

17/12/2015 - 15:19 von Klaus Ketelaer | Report spam
Hallo zusammen,

ich schreibe gerade ein Steuerelement, basierend auf einem
Listview oder Treeview (habe mich noch nicht entschieden),
in dem die Eintràge per Button verschoben werden können.

Wegen der Diskussion, die wir kürzlich hier hatten, und ich
trotz meines Alters noch lernfàhig bin, wollte ich nun statt
LockWindowUpdate lieber WM_SETREDRAW verwenden, um ein Flackern
des Bildschirms zu vermeiden.

Der Code ist banal und in der Liste befinden sich etwa 20 Eintràge.

lResult = SendMessage(lv.hWnd, WM_SETREDRAW, 0, 0)
'Call LockWindowUpdate(lv.hWnd)

Set LiBuffer = lv.SelectedItem
If Not LiBuffer Is Nothing Then
Index = LiBuffer.Index
lv.ListItems.Remove Index
With LiBuffer
Index = IIf(Button.Key = "dn", Index + 1, Index - 1)
Set Li = lv.ListItems.Add(Index, .Key, .Text, .Icon, .SmallIcon)
Li.Tag = .Tag
End With

Li.Selected = True
Set lv.SelectedItem = Li
End If

'Call LockWindowUpdate(0)
lResult = SendMessage(lv.hWnd, WM_SETREDRAW, 1, 0)


Wie kann es sein, dass beim Verschieben der Eintràge die
Liste flackert wie Teufel, wenn ich WM_SETREDRAW verwende,
aber absolut ruhig ist (und deutlich schneller), wenn ich
wie gewohnt LockWindowUpdate verwende?

Mir ist das im Grunde egal, und schreibe das nur, weil ich
eure Ausführungen in keiner Weise nachvollziehen kann und
konnte.

In den vielen, vielen Jahren habe ich noch niemals Probleme
mit LockWindowUpdate gehabt, und die Funktion arbeitet immer
wie gewünscht. Als vielleicht schlichtes Gemüt verwende ich
einfach das, was funktoniert und auch immer funktioniert hat.
Egal was das MSDN schreibt.

Gruß Klaus
 

Lesen sie die antworten

#1 Ulrich Möller
17/12/2015 - 21:16 | Warnen spam
Am 17.12.2015 um 15:19 schrieb Klaus Ketelaer:
Hallo zusammen,

ich schreibe gerade ein Steuerelement, basierend auf einem
Listview oder Treeview (habe mich noch nicht entschieden),
in dem die Eintràge per Button verschoben werden können.

Wegen der Diskussion, die wir kürzlich hier hatten, und ich
trotz meines Alters noch lernfàhig bin, wollte ich nun statt
LockWindowUpdate lieber WM_SETREDRAW verwenden, um ein Flackern
des Bildschirms zu vermeiden.

Der Code ist banal und in der Liste befinden sich etwa 20 Eintràge.

lResult = SendMessage(lv.hWnd, WM_SETREDRAW, 0, 0)
'Call LockWindowUpdate(lv.hWnd)

Set LiBuffer = lv.SelectedItem
If Not LiBuffer Is Nothing Then
Index = LiBuffer.Index
lv.ListItems.Remove Index
With LiBuffer
Index = IIf(Button.Key = "dn", Index + 1, Index - 1)
Set Li = lv.ListItems.Add(Index, .Key, .Text, .Icon, .SmallIcon)
Li.Tag = .Tag
End With

Li.Selected = True
Set lv.SelectedItem = Li
End If

'Call LockWindowUpdate(0)
lResult = SendMessage(lv.hWnd, WM_SETREDRAW, 1, 0)


Wie kann es sein, dass beim Verschieben der Eintràge die
Liste flackert wie Teufel, wenn ich WM_SETREDRAW verwende,
aber absolut ruhig ist (und deutlich schneller), wenn ich
wie gewohnt LockWindowUpdate verwende?

Mir ist das im Grunde egal, und schreibe das nur, weil ich
eure Ausführungen in keiner Weise nachvollziehen kann und
konnte.

In den vielen, vielen Jahren habe ich noch niemals Probleme
mit LockWindowUpdate gehabt, und die Funktion arbeitet immer
wie gewünscht. Als vielleicht schlichtes Gemüt verwende ich
einfach das, was funktoniert und auch immer funktioniert hat.
Egal was das MSDN schreibt.

Gruß Klaus



Hallo Klaus,

ich habe das bei mir gerade mal mit einem kleinen Testprogramm unter
(Win 8.1/64) ausprobiert, und konnte zwischen den Versionen einmal mit
Lock... und einmal mit SendRedraw... keinen Unterschied feststellen. In
beiden Fàllen hat nichts geflackert.

Allerdings habe ich wie hier beschrieben
https://msdn.microsoft.com/en-us/li...p/dd145219(v=vs.85).aspx
<https://msdn.microsoft.com/en-us/li...9.aspx>
noch ein RedrawWindow angefügt.

Pragmatisch würde ich also erstmal SendRedrawWindow versuchen
einzusetzen, solange es in dem Szenario funktioniert, ansonsten einfach
LockWindowUpdate.

Ulrich

Ähnliche fragen