Click here to Skip to main content
Click here to Skip to main content

CEditLog - fast logging into an edit control with cout

, 1 Nov 2003 CPOL
Rate this:
Please Sign up or sign in to vote.
Use an edit control for logging messages and redirect cout


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.


  • 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
    typedef CSubclassWnd root_type;

    // Constructs the CEditLog. You can pass the edit controls handle

    // here or set it later using the SetEditCtrl() function.

    // To increase performance CEditLog repaints the edit-control

    // only if the caret resides in the last line. Otherwise the

    // control will be refreshed only every nMaxRefreshDelay msec.

    CEditLog( HWND hEdit = NULL, UINT nMaxRefreshDelay = 500 );
    // Adds some text to the end of the edit control. Works asynchronously

    // (using PostMessage()) and is save to be called by multiple threads.

    // If you pass true for bLFtoCRLF every LF (ASCII 10) (as it is used in

    // most cases for end-of-line) will be converted to a CR/LF (ASCII 10/13)

    // sequence as it is needed by the windows edit control. 

    virtual void AddText( LPCWSTR pwszAdd, bool bLFtoCRLF = false );
    // Converts pszAdd to UNICODE and calls the above

    void AddText( LPCSTR pszAdd, bool bLFtoCRLF = false );

    // Sets the edit-control to be used for logging.

    // Pass NULL to stop text logging.

    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.


This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


About the Author

Daniel Lohmann

Germany Germany
Daniel Lohmann ( is Assistant Professor at the Distributed Systems and Operating Systems department at Friedrich-Alexander-University Erlangen-Nuremberg, Germany. His main research topic is the design of a highly customizable and scalable operating system product line for deeply embedded systems using static configuration and aspect-oriented techniques. Before joining Universität Erlangen he worked as a freelance trainer and consultant for NT system programming, advanced C++ programming and OOA/OOD. He is interested in upcoming programming techniques like aspect-oriented programming, generative programming and C++ meta coding and has written some nice and handy tools for Windows NT which you can download at his web site.

Comments and Discussions

Questionhow I can add color to ceditlog? PinmemberMember 328166623-Apr-13 6:18 
GeneralPassed on compiling, but failed on running on Windows Vista PinmemberGolden Lee3-Dec-09 20:25 
GeneralRe: Passed on compiling, but failed on running on Windows Vista PinmemberDaniel Lohmann7-Dec-09 1:37 
AnswerRe: Passed on compiling, but failed on running on Windows Vista Pinmemberysliou19-May-11 4:53 
GeneralRe: Passed on compiling, but failed on running on Windows Vista Pinmember Randor 7-Jul-12 14:50 
GeneralRe: Passed on compiling, but failed on running on Windows Vista PinmemberWalter Schmoll19-Sep-12 23:40 
GeneralRe: Passed on compiling, but failed on running on Windows Vista Pinmember Randor 17-Oct-12 15:09 
QuestionHow can I change the text color in this Class Pinmemberhuyphuc9-Dec-08 16:42 
QuestionHow do i use it for CRichEditCtrl? Pinmembersmalti16-Aug-07 4:02 
GeneralMax. number of lines control PinmemberVic Siu7-Oct-06 16:59 
QuestionWhat about printf PinmemberAvri27-Sep-06 20:54 
AnswerRe: What about printf Pinmembernikestone24-Nov-06 18:31 
GeneralNice but some error in VC2005 Pinmemberansoncat13-Jun-06 20:02 
GeneralRe: Nice but some error in VC2005 Pinmemberw00tzenheimer21-Jul-06 20:39 
GeneralNice Pinmemberucc8013-Feb-06 0:03 
GeneralSlow log Pinmembervdaanen25-Nov-05 2:26 
GeneralRe: Slow log PinmemberDaniel Lohmann26-Nov-05 4:28 
Hi Vince,
The edit control is updated "immediately" if the caret resides in the last line or at least every 500 msec. 500 msec is the default, the timeout is configurable at construction time.
Note that the update is actually performed by the thread who owns the edit control and not by the thread calling AddText(). Moreover, the UI thread (the thread owning the edit control) needs to process messages. So if your calculation thread has a higher priority than the UI thread and induces a high CPU load, this may cause the update delays as the UI thread never gets the chance to update the edit control. Maybe it would help to add a Sleep(0) after the output in the worker thread to yield the CPU to another thread.
If the calculation is actually performed by the same thread that owns the UI, this may also cause delays if your thread does not process messages during the calculations, which is required to update the UI. In this case it may help to invoke message processing explicitly.
Hope that helps Cool | :cool:
Daniel Lohmann
(Hey, this page is worth looking! You can find some free and handy NT tools there Big Grin | :-D )
QuestionApplication Crash on exit PinmemberProf.S.Mukherjee13-Nov-05 21:47 
AnswerRe: Application Crash on exit Pinmemberchurl-hee Jo9-May-06 19:29 
QuestionHow to change font PinmemberMarko Winter13-Jul-05 2:38 
AnswerRe: How to change font PinmemberDaniel Lohmann13-Jul-05 23:24 
GeneralRe: How to change font PinmemberMarko Winter15-Jul-05 0:42 
Generalx64 (AMD64) portability problem PinmemberModMa28-Jun-05 7:36 
AnswerRe: x64 (AMD64) portability problem Pinmemberpc_jisakker5-Apr-09 6:19 
GeneralVery Good PinmemberIain Fraser / Zeus9-May-05 5:21 
GeneralNo output at all when switching between several output destinations Pinsussasango29-Apr-05 10:49 
GeneralRe: No output at all when switching between several output destinations PinmemberDaniel Lohmann2-May-05 3:56 
GeneralRe: No output at all when switching between several output destinations Pinmemberasango@gmx.net2-May-05 9:07 
GeneralSave the log content into file. Pinmemberronenw5-Dec-04 5:02 
GeneralUseful tool. Pinmemberronenw24-Nov-04 5:16 
Generalnot using standard c++ libraries Pinmembersammyc21-Sep-04 18:16 
QuestionIs it really thread safed? Pinsussyuancc@21cn.com15-Jun-04 3:59 
AnswerRe: Is it really thread safed? PinmemberDaniel Lohmann18-Jun-04 1:06 
GeneralRe: Is it really thread safed? Pinsussyuancc@21cn.com19-Jun-04 1:30 
QuestionHow to reduce Flicker? Pinmemberpmackell17-Sep-03 10:08 
AnswerRe: How to reduce Flicker? Pinmembergbiddison24-Jun-04 21:09 
GeneralRe: How to reduce Flicker? PinmemberRJSoft23-Aug-04 4:04 
AnswerRe: How to reduce Flicker? Pinmemberlano11064-Jul-06 19:47 
Questionwhat about printf? Pinmemberomasoud14-Jul-03 15:32 
AnswerRe: what about printf? PinmemberDaniel Lohmann14-Jul-03 22:28 
GeneralRe: what about printf? Pinmemberomasoud15-Jul-03 1:35 
GeneralRe: what about printf? PinmemberDaniel Lohmann16-Jul-03 6:32 
GeneralHi Pinmemberannum14-Jun-03 17:19 
GeneralRe: Hi PinmemberDaniel Lohmann15-Jun-03 2:33 
GeneralRe: Hi Coloring Pinmemberpmackell17-Sep-03 10:06 
GeneralCEditLog and FormView Pinmemberabstract312-Jun-03 9:59 
GeneralRe: CEditLog and FormView PinmemberDaniel Lohmann15-Jun-03 2:40 
GeneralRe: CEditLog and FormView Pinmembersammyc6-Dec-04 15:52 
GeneralRe: CEditLog and FormView Pinmembersammyc6-Dec-04 16:13 
GeneralRe: CEditLog and FormView PinmemberDaniel Lohmann6-Dec-04 22:42 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web03 | 2.8.150327.1 | Last Updated 2 Nov 2003
Article Copyright 2000 by Daniel Lohmann
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid