본문 바로가기
C#, MONO

richTextBox에 Console출력하기

by gigasound 2021. 8. 9.

C# GUI를 사용하다 보면, 가끔 Console의 내용을 화면에 보여주고 싶습니다. 

이때 richTextBox를 이용해서 GUI 화면에 출력이 가능합니다.

다음 내용을 참조했습니다.

https://stackoverflow.com/questions/472282/show-console-in-windows-application/15079092#15079092
https://stackoverflow.com/questions/4362111/how-do-i-show-a-console-output-window-in-a-forms-application

먼저 클래스를 추가합니다.

public delegate void StringArgReturningVoidDelegate(string text);
public class RichTextBoxWriter: TextWriter {
	private readonly RichTextBox _richTextBox;
	public override Encoding Encoding => Encoding.ASCII;
 	public RichTextBoxWriter(RichTextBox richTexttbox) {
		_richTextBox = richTexttbox;
	}
	public override void Write(char value) {
		SetText(value.ToString());
	}
	public override void Write(string value) {
		SetText(value);
	}
	public override void WriteLine(char value) {
		SetText(value + Environment.NewLine);
	}
	public override void WriteLine(string value) {
		SetText(value + Environment.NewLine);
	}
	private void SetText(string text) { 
		if(_richTextBox.InvokeRequired) {
			var d = new StringArgReturningVoidDelegate(SetText);
			_richTextBox.Invoke(d,text);
		}
		else {_richTextBox.Text += text; }
	}
}

그리고 다음과 같이 richTextBox를 조정합니다.

using System.IO;
public Form1() {
	InitializeComponent();
	Console.SetOut(new RichTextBoxWriter(this.richTextBox1)); 	
    this.richTextBox1.SelectionStart = this.richTextBox1.Text.Length;
	this.richTextBox1.ScrollToCaret();
}

만약 다시 Console 출력을 해지하고 싶다면 다음과 같이 실행하면 됩니다.

var standardOutput = new StreamWriter(Console.OpenStandardOutput());
standardOutput.AutoFlush = true;
Console.SetOut(standardOutput);