|
Hi,
I need to reduce the flickering on listview when change the backcolor of subitems of each and every item in listview continously(for eg : 5 times per second).
Thanks,
Latha
Latha.P
Raja Engg College,
Madurai.
|
|
|
|
|
Try listview1.suspendlayout before making the changes and listview1.resumelayout afterwards
Bob
Ashfield Consultants Ltd
|
|
|
|
|
Sorry, I have already used that, but still flickering.
Latha.P
Raja Engg College,
Madurai.
|
|
|
|
|
Sorry, out of ideas then.
Bob
Ashfield Consultants Ltd
|
|
|
|
|
|
I have "half an answer" here for you.
I went through google and found the reason for the flicker is that a listview repaints the whole control every update.
There is a solution in c# that overrode the control, and disabled the "erase background" message, so when the listview redrew itself, flicker would be significantly reduced. Unfortunately, I lost the web site with the code in, but I do have the vb.net version of the code, which is attached.
I hope it works for you! And sorry to the originial author that I cant properly reference this - I have tried searching google, but cant find it again.
Anyway, here is the code, along with a simulated "change background color" loop:
Private Sub ToolStripButton2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ToolStripButton2.Click
Dim lv As New FlickerFreeListView
lv.Left = 0
lv.Top = 0
lv.Width = 200
lv.Height = 200
Me.Panel1.Controls.Add(lv)
For x As Integer = 0 To 10
lv.Items.Add(New ListViewItem(New String() {"hello", "Hello", "HELLO", x.ToString}))
Next
For x As Integer = 0 To 100
lv.Items(0).BackColor = Color.Red
Application.DoEvents()
System.Threading.Thread.Sleep(100)
lv.Items(0).BackColor = Color.Blue
Application.DoEvents()
System.Threading.Thread.Sleep(100)
Next
End Sub
And the actual code that overloads the listview. Just add this to your project and you can replace a listview with a flickerfreelistview...
Public Class FlickerFreeListView
Inherits ListView
Sub New()
Me.SetStyle(ControlStyles.OptimizedDoubleBuffer Or ControlStyles.AllPaintingInWmPaint, True)
Me.SetStyle(ControlStyles.EnableNotifyMessage, True)
End Sub
Protected Overrides Sub OnNotifyMessage(ByVal m As System.Windows.Forms.Message)
If m.Msg <> &H14 Then
MyBase.OnNotifyMessage(m)
End If
End Sub
End Class
|
|
|
|
|
C# Code is:
class ListViewNF : System.Windows.Forms.ListView
{
public ListViewNF()
{
//Activate double buffering
this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true);
//Enable the OnNotifyMessage event so we get a chance to filter out
// Windows messages before they get to the form's WndProc
this.SetStyle(ControlStyles.EnableNotifyMessage, true);
}
protected override void OnNotifyMessage(Message m)
{
//Filter out the WM_ERASEBKGND message
if(m.Msg != 0x14)
{
base.OnNotifyMessage(m);
}
}
}
found the code at: http://geekswithblogs.net/cpound/archive/2006/02/27/70834.aspx[^]
|
|
|
|
|
Yep - that looks like the code I savaged
It will have a more thorough description of what the code is doing too.
|
|
|
|
|
Heheh happy to help
Also for all the people new to VB.net and programming in general, if you have used the standard listview in your program and want to use the flicker free one discussed here, u dont need to go through every form and replace the listview with the flickerfree one using the code example. Simply go into the designer of the forms and change your ListView type to FlickerFreeListView
Example:
[Declaration]
Friend WithEvents ListView1 as System.Windows.Forms.ListView
[InitializeComponent]
Me.ListView1 = New System.Windows.Forms.ListView
Change to:
[Declaration]
Friend WithEvents ListView1 as FlickerFreeListView
[InitializeComponent]
Me.ListView1 = New FlickerFreeListView
do a replace all in your entire project for "as System.Windows.Forms.ListView" and "= New System.Windows.Forms.ListView" and presto, listview flicker solved in under a min.
HTH all the newbies not sure how to use the class
Regards,
Richard
|
|
|
|
|
Hi,
what is the difference between those and which is faster?
example:
a=2
b,c,d,e=1
1)if a=1 and b=1 and c=1 and d=1 and e=1 then....
2)if a=1 andAlso b=1 andAlso c=1 andAlso d=1 andAlso e=1 then....
3)if a=10 or b=10 or c=10 or d=10 or e=1 then....
4)if a=10 orElse b=10 orElse c=10 orElse d=10 orElse e=1 then....
Thanks in advance
|
|
|
|
|
Wow - VB sure sucks.
http://visualbasic.about.com/od/usingvbnet/l/bldykvbnetlogop.htm[^]
Looks like the answer is that the old operators do not optimise in any way.
Christian Graus
Please read this if you don't understand the answer I've given you
"also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
|
|
|
|
|
This is in no way different from the way C# works with &[^] and &&[^]...
|
|
|
|
|
The way I read it, it was saying that VB6 would evaluate the whole line even when it knew it was going to fail, so you can't do if (x != null && x.y != 0 ).
Christian Graus
Please read this if you don't understand the answer I've given you
"also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
|
|
|
|
|
>>The way I read it, it was saying that VB6 would evaluate the whole line even when it knew it was going to fail, so you can't do if (x != null && x.y != 0 ).
Correct! VB6 would eval both expressions before coming back with a result, even if the first failed.
AndAlso & OrElse allow "short cut" checks. Meaning after the first expression that fails/passes the check, the remaining checks are ignored and processing continues.
|
|
|
|
|
Nice explanation about AndAlso. However, proper checks for the division by zero in the example could do away with the need for AndAlso. It does make sense about short circuiting if the boolean condition can be determined with out fully evaluating the entire expression.
"The clue train passed his station without stopping." - John Simmons / outlaw programmer
"Real programmers just throw a bunch of 1s and 0s at the computer to see what sticks" - Pete O'Hanlon
|
|
|
|
|
The one that drives me nuts is the lack of a decent ternery operator. The rough equivalent of say:
foo == null ? "null" : foo.bar;
is Iif(foo = null, "null", foo.bar)
Which is just a regular function, all arguments get evaluated before it's called, and bang! Null ref. :/
|
|
|
|
|
Yeah, I've been bitten by that on brief visits to VB land
Christian Graus
Please read this if you don't understand the answer I've given you
"also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
|
|
|
|
|
AndAlso and OrElse perform what is known as short curcuit evaluation.
What this means is that if the first argument makes it such that the result is known then the second argument is not tested.
For example if you have:
If DayIsTuesDay() And DayisSomeonesBirthday()
Both DayIsTuesday() and DayIsSomeonesBirthday() will be valuated.
However if you have:
If DayIsTuesDay() AndAlso DayisSomeonesBirthday()
and DayIsTuesday returns false then there is no point executing DayIsSomeonesBirthday
Where your second operation is doing something slow (like reading from a database) using short curcuit evaluations can significantly speed up your application.
|
|
|
|
|
You may have to be a bit careful though. In the statement
If DayIsTuesDay() And DayisSomeonesBirthday()
if "DayIsTuesday" alters data, and "DayIsSomeonesBirthday" also alters data, you might not want to short-cut... for example (and yes, its a crap example!)
if ClearUserTable() and ClearPasswordTable() then
messagebox.show("Tables Cleared")
end if
In this case, you would definitely NOT want to shortcut the second function using AndAlso
|
|
|
|
|
I think the subliminal message is: "use C# !"
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
The VB.Net keyword And
is equivalent to the C# operator &
The VB.Net keyword AndAlso is equivalent to the C# operator &&
The VB.Net keyword Or is equivalent to the C# operator |
The VB.Net keyword OrElse is equivalent to the C# operator ||
The subliminal message is RTM[^]?
|
|
|
|
|
Duncan Edwards Jones wrote: The subliminal message is RTM[^]?
Nope. IMHO default behaviour should be short-cut and the keywords AndAlso , OrElse are simply foolish, hence my subliminal still stands.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
Right.
Read The Fantastic Manual.
Apparently no one does anymore, even asking Google seems too much for some.
|
|
|
|
|
Luc Pattyn wrote: Google seems too much for some
Seems like it.
"The clue train passed his station without stopping." - John Simmons / outlaw programmer
"Real programmers just throw a bunch of 1s and 0s at the computer to see what sticks" - Pete O'Hanlon
|
|
|
|
|
As a minor semantic difference - the & operator in C# is a bitwise and, whereas && is the logical and which also shortcircuits. (Like C++)
I'm used to using & with caution - coming from a C++ background - you could have two "true" results from a function - but 1 & 2 == false In C# this cautioning really doesnt apply though.
|
|
|
|