Wait Cursor: Using 'using'
Introduction
A hack to replicate MFC's CWaitCursor
class in C#.
Background
I found that the using
keyword in C# has two uses:
- The
using
directive, which we all know. - The
using
statement, which is v. cool. This gave me the idea for this article.
Using the code
Basically, the using
statement declares that for a variable, Dispose
is always called at the end of the statement block.
This is a good thing. By writing a class that implements IDispose
, we can have destructor-like semantics that allow us to clean up after ourselves. This is useful in many scenarios; this article describes one such use.
We will start with our requirements. We want to be able to write code like this:
using ( new CWaitCursor() )
{
// Do something interesting
}
Just to make things a bit more interesting, we will start by writing a class that displays any System.Windows.Forms.Cursor
. It saves the current cursor, displays the specified cursor, then in the Dispose
method, it switches back to the saved cursor. This is really quite simple, and looks something like this:
using System.Windows.Forms;
namespace Common
{
internal class CCursor : IDisposable
{
private Cursor saved = null;
public CCursor( Cursor newCursor )
{
saved = Cursor.Current;
Cursor.Current = newCursor;
}
public void Dispose()
{
Cursor.Current = saved;
}
}
}
Our CWaitCursor
class just derives from this code, specifying the Cursors.WaitCursor
:
internal class CWaitCursor : CCursor
{
public CWaitCursor() : base( Cursors.WaitCursor ) {}
}
And we're done! The cursor is guaranteed to be cleaned up however we exit the using
statement.
Points of Interest
The using
statement is good; it should be used everywhere (IMHO) because it gives us some control over disposal of our objects.
I use it a lot in GDI stuff. For example:
using ( Brush brush = new SolidBrush( colour ) )
Graphics.FillRectangle( brush, rect );
History
Version 1: 2004 March 3.
License
This article, along with any associated source code and files, is licensed under The Code Project Open License.
Contact
If you have any feedback, please feel free to CONTACT me.