1. 程式人生 > >EditLog類的使用-將C++標準輸出cout重定向到edit控制元件

EditLog類的使用-將C++標準輸出cout重定向到edit控制元件

原文地址:https://blog.csdn.net/vrix/article/details/1808421

原文中的下載地址已失效,重新給出csdn的下載:https://download.csdn.net/download/augusdi/4012663

要解決的問題:

我曾經想使用EDIT控制元件來快速的處理非同步文字輸出。我需要在很多執行緒裡記錄大量的資訊。有時候每秒1000個Log資訊。自從我建立了一些函式把我要的物件資訊輸出到 std::cout ,我也想吧edit控制元件作為std::ostream.

特點:

  • 非同步, 快速的輸出資訊到任何的edit 控制元件
  • 你可以在列印資訊的時候檢視記錄,選擇和複製文字等等。
  • 可以支援MFC和飛MFC程式
  • 使用了子類化,你可以把任何CEdit派生出的類和一同使用
  • 支援多執行緒
  • basic_streambuf 用來建立和 重定向 std::ostream (such as std::cout) 的輸出到 edit控制元件

使用 CEditLog

建立CEditLog 的一個例項並通過SetEditControl() 方法把它和EDIT控制元件繫結,然後你就可以用AddText()成員函式來新增一些文字到EDIT控制元件了。

class CEditLog : protected CSubclassWnd
{
public:
    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

    ...
};

例項程式碼說明

例項程式碼中演示了CEditLog 的用法以及basic_editstrbuf 如何重定向 std::cout 到EDIT控制元件.

CEditLog 用到了William E. Kempf 寫的CSubclassWnd 類,例項程式碼中也包含了CSubclassWnd 類

-------------以上翻譯由vrix.yan完成於2007.09.30 21:18

在使用此類的過程當中,我總結了一下的步驟:

1>將例項工程中的code子目錄,複製到你的工程目錄中

2>在你的對話方塊xxDlg.h 裡引入標頭檔案,並定義一些變數

#include "EditLog.h"
#include "editlog_stream.h"

 // The logger object
 CEditLog   m_EditLogger;
 // ANSI and UNICODE stream buffers for the EditLogger
 std::editstreambuf m_EditStrBuf;
 std::weditstreambuf m_EditStrBufW;

 // Used to save the previos values for cout and wcout
 std::basic_streambuf<char>*  m_pOldBuf;
 std::basic_streambuf<wchar_t>* m_pOldBufW;

3>在你的stdafx.h中加入

// Include core STL header
#include <string>
#include <streambuf>
#include <iostream>

4>在你的xxDlg.cpp 中記得新增一下的程式碼

CEditLogDlg::CEditLogDlg(CWnd* pParent /*=NULL*/)
 : CDialog(CEditLogDlg::IDD, pParent), m_EditStrBuf( m_EditLogger ), m_EditStrBufW( m_EditLogger )

5>在你的xxDlg.cpp裡面OnInitDialog初始化

 // 設定EDIT控制元件為LOG的目標
 m_EditLogger.SetEditCtrl( m_ctrlEdit.m_hWnd );  //記得要先定義Edit 控制元件


 // 重定向cout 的輸出到 Edit控制元件
 m_pOldBuf = cout.rdbuf( &m_EditStrBuf );
 // unicode 版本
 m_pOldBufW = wcout.rdbuf( &m_EditStrBufW );

 // 用法
 cout << "cout (ANSI) works :-)" << endl;
 wcout << L"wcout (UNICODE) works also ;-)" << endl;
 cout << "/n/n";

6>在你的WM_DESTROY訊息里加入

void CEditLogDlg::OnDestroy() 
{
 // Restore the previous stream state for cout and wcout
 cout.rdbuf( m_pOldBuf );
 wcout.rdbuf( m_pOldBufW );

 CDialog::OnDestroy();
}

我通過以上的步驟,成功的在我的程式裡使用了EDITLOG類,希望對大家有所幫助。


相關推薦

EditLog的使用C++標準輸出cout定向edit控制元件

原文地址:https://blog.csdn.net/vrix/article/details/1808421原文中的下載地址已失效,重新給出csdn的下載:https://download.csdn.net/download/augusdi/4012663要解決的問題:我曾

2>&1 &:標準錯誤2定向標準輸出1中

bash中 2>&1 & 的解釋 1、bash中0,1,2三個數字分別代表: 0 STDIN_FILENO 標準輸入(一般是鍵盤) 1 STDOUT_FILENO 標準輸出(一般是使用者終端控制檯) 2 STDERR_FILENO 標準錯

簡單的使用SwigC++標準庫編寫的動態庫提供給C#使用方法

處於工作要求,需要把Qt和opencv編寫的動態庫提供給客戶的的csharp程式使用,因此花時間研究了這個方法,本人的方法比較簡單,就是提供一個C++標準的動態庫作為橋,可以在動態庫中再呼叫opencv和qt編寫的動態庫,降低了耦合度,也有利於我自己修改介面而不需要別人干預;

Linux 標準輸出,錯誤輸出定向到檔案

1.想要把make輸出的全部資訊,輸出到某個檔案中,最常見的辦法就是:make xxx > build_output.txt此時預設情況是沒有改變2=stderr的輸出方式,還是螢幕,所以,如果有錯誤資訊,還是可以在螢幕上看到的。2.只需要把make輸出中的錯誤(及警

C語言與c++標準輸出底層細節-四捨六入五成雙

引言:相信每個學生從小學就被教導要四捨五入,那四捨五入真的通用嗎? 四捨六入五成雙: 1."四捨六入五成雙"是什麼?     這是一種數字修約規則,一種比四捨五入更加精確科學的計數保留法.     其實就是在進位時四舍六進,為五時若後面有有效數字則捨去進1,否則前

Java 演示如何用標準的輸入輸出定向到一個文件

sys fileread off 進行 log idea blog 效率 dir 最近,在學習Java,並且學習到了Java的IO(輸入與輸入),什麽是Java IO呢? IO流位於java.io包中,根據操作數據不同,分為字節流和字符流;根據數據輸入方面的不同又可分為輸入

C# Winform 一個可以用滑鼠改變控制元件位置和大小的,直接呼叫即可.....(程式碼收藏)

using System;   using System.Collections.Generic;   using System.Text;   using System.ComponentModel;   using System.Data;   using System.

標準輸入輸出、錯誤輸出定向標準輸出

I/O重定向詳解及應用例項 1、 基本概念(這是理解後面的知識的前提,請務必理解) a、 I/O重定向通常與 FD有關,shell的FD通常為10個,即 0~9; b、 常用FD有3個,為0(stdin,標準輸入)、1(stdout,標準輸出)、2(stderr,標準錯誤輸出),預設與keyboar

程式碼中的輸入輸出定向、檔案流C/C++)

一.freopen的使用(C/C++) 函式原型:FILE *freopen( const char *path, const char*mode, FILE *stream ); 標頭檔案: std

標準輸入輸出定向

standard 屏幕 建立 job ack 存在 linux 系統 標準 tracker 準輸入輸出 在 Linux 系統中: 標準輸入(stdin)默認為鍵盤輸入; 標準輸出(stdout)默認為屏幕輸出; 標準錯誤輸出(stderr)默認也是輸出到屏幕(上面的 st

Linux基礎管理—— " 標準IO及定向及管道 "

輸入輸出重定向 管道 標準輸入 標準錯誤輸入 1、標準輸入和輸出 一般來說程序是由指令+數據組成;那麽就不可避免的要讀入和輸出數據,即input和output。 打開的文件都有一個fd: file descriptor (文件描述符),可以在/proc/$$/fd中查看當前終端打開的文件

shell介紹/命令歷史/命令補全/通配符/輸出輸入定向

時間 ima 顯示 work zsh 之前 img ole cgroup shell介紹 * shell是一個命令解釋器,提供用戶和機器之間的交互。 * 支持特定語法,比如邏輯判斷、循環。 * 每個用戶都可以有自己特定的shell。 * Centos7默認shell為

26期20180628 shell 命令操作 通配符 輸出輸入定向

重新 a-z 安裝 AC ott fff 當前 sof itl 6月28日任務8.1 shell介紹8.2 命令歷史8.3 命令補全和別名8.4 通配符8.5 輸入輸出重定向shell介紹Shell腳本只是一個表現,所謂的shell是一個命令解釋器,用戶和機器的一個交互Sh

Linux命令執行的屏幕輸出內容定向到日誌文件

mrc 使用 解釋 ech class 執行過程 包名 linux命令 css 摘要: 作者:Syn良子 出處:http://www.cnblogs.com/cssdongl 轉載請註明出處 快速mark一下這個命令細節,免得以後使用又忘記了 大家都知道可以用echo來

WPF 窗體基實現的體驗及實現回車到下一控制元件

原文: WPF 窗體基類實現的體驗及實現回車到下一控制元件 1、窗體基類實現參考 http://weblogs.asp.net/psheriff/archive/2009/11/02/creating-a-base-window-class-in-wpf.aspx 2、基類不能像Wi

C#匯出 Excel 時, 生成 CheckBox 控制元件

在使用 Microsoft.Office.Interop.Excel 元件匯出Excel 表格時,要把匯出前的  CheckBox 控制元件一同匯出到 excel 表格中,對於這個功能 看似很簡單,但 Microsoft.Office.Interop

C#GDI+自定義繪製曲線圖表控制元件DataChart 簡單實現 C#GDI+ 繪製線段(實線或虛線)、矩形、字串、圓、橢圓

C#GDI+自定義繪製曲線圖表控制元件DataChart 這裡只說明在計算刻度和曲線繪製的時候 只提供思路,只是做了下簡單的計算,不喜勿噴 還望見諒,高手直接飄過吧。這個要做好,還是需要研究研究演算法的,比如刻度隨著控制元件的大小發生改變的時候計算不同的值,根據刻度範圍來計算刻度以及刻度值等,這裡沒有研究,

程序通訊之二 管道技術第一篇 輸入輸出定向

                繼上一篇《程序通訊之一使用WM_COPYDATA C++及C#實現》,程序通訊之二將分為三篇文章講解如何使用管道技術來完成程序通訊功能。三篇文章目錄如下:本篇將介紹輸入輸出的重定向問題,先來看一個小小的例項,設有一個程式,該程式的輸入輸出為標準輸入輸出即從鍵盤上輸入,輸出到螢幕

C#進階 WPF基礎一 XAML控制元件基礎、佈局

一、控制元件模型 WPF的控制元件與WinForm類似。區別在於WPF的控制元件可以用XAML手寫,並且功能更多更強大 二、XAML語言 1、概念:在WPF中用來描述控制元件的語言. 特點: 與XML、HTML語言類似,但對大小寫敏感 一個XAML標籤代表NEW一個控制元件

Winform/C#入門程式設計之第二部分常用控制元件(九:進度條控制元件ProgressBar)

簡介:         介紹進度條控制元件ProgressBar。常用於上傳、下載等,來體現進度。給使用者提示當前執行的進度,防止被認為介面卡主或宕機。   介紹: 1.屬性 常用屬性