Problem
I once wanted to use an edit control for fast, asynchronous text output. I need to log messages from a lot of threads, sometimes more than 1000 per second. And since I created already functions to dump my objects to std::cout
I also wanted to use an edit control as std::ostream
.
Features
- Asynchronous, very fast output to any edit control
- User can scroll back, select and copy text and so on during output
- Can be used with or without MFC (Sample is a MFC project)
- Uses window-subclassing, so you can use it even with CEdit-derived controls
- Save to be used by multiple threads
- Special
basic_streambuf
class to create or redirect a std::ostream
(such as std::cout
) to an edit control
Using CEditLog
Just create an Instance of CEditLog
and attach an edit control to it using the SetEditControl()
function. Then you can add text to the end of the edit control using one of the AddText()
members:
class CEditLog : protected CSubclassWnd
{
public:
typedef CSubclassWnd root_type;
CEditLog( HWND hEdit = NULL, UINT nMaxRefreshDelay = 500 );
virtual void AddText( LPCWSTR pwszAdd, bool bLFtoCRLF = false );
void AddText( LPCSTR pszAdd, bool bLFtoCRLF = false );
virtual void SetEditCtrl( HWND hEdit );
HWND GetEditCtrl() const
...
};
The sample project
The included sample project shows the usage of CEditLog
and how to use basic_editstrbuf
to redirect std::cout
to use the edit log.
CEditLog
uses the CSubclassWnd
class, written by William E. Kempf for implementation. I have included the soure of CSubclassWnd
in the sample project, the complete article is also available here at CodeProject.
Version |
Comments |
1.0 |
First Release |
1.1 |
Minor Revision. Now uses V2.0 of SubclassWindow . Now really works on Win9x (V1.0 used UNICODE for internal data handling and failed on Win9x systems. Now the code checks if it runs on Win9x and does the required conversions.) |
1.2 |
Minor Revision. Now compiles fine even in VC.NET 2003. |