2011-03-08 6 views
3

StreamWriter를 사용하여 콘솔에 텍스트를 쓰는 C# .net 3.5 응용 프로그램이 있습니다. 밑줄과 취소 선과 같은 텍스트 장식을 콘솔에 인쇄 된 텍스트에 추가 할 수있는 방법이 있습니까? ANSI 이스케이프 시퀀스를 사용하고있을 가능성이 있습니까?콘솔 출력에 텍스트 장식 추가

TextWriter writer = new StreamWriter(Console.OpenStandardOutput()); 
writer.WriteLine("some underlined text"); 

감사합니다, PaulH

답변

6

Windows 콘솔은 ANSI 이스케이프 시퀀스를 지원하지 않습니다. 필자가 아는 한 출력 문자의 속성을 변경하는 유일한 방법은 문자를 쓰기 전에 SetConsoleTextAttribute을 호출하는 것입니다. 또는 .NET에서 Console.ForegroundColor 또는 Console.BackgroundColor 특성을 수정하십시오.

캐스팅 된 유형의 맞춤 값 (즉, ConsoleColor으로 정의되지 않은 값)으로 속성을 설정할 수 있습니다. 그러나 나는 당신에게 좋은 것을 모른다.

Windows 콘솔에서 취소 선 텍스트를 본 적이 있는지 알지 못합니다. 제가 밑줄을 쓴지 몇 년이 지났습니다. 나는 그것이 가능하다고 생각하지만, 그것이 어떻게 이루어 졌는지 모른다.

1

그것은 콘솔의 전경/배경 색상 변경하기 매우 쉽습니다 : http://www.dotnetperls.com/console-color을하지만 AFAIK 예를 들어, 일부 굵은 텍스트를 넣을 수있는 방법은 없습니다. 그러나 나는 그것을 성취하려고 애썼지 않아 확실하지 않습니다.

+2

참고 :은'ConsoleColor' 이른바'White' 그것이 윈도우 API 호출로 변환 어떻게으로까지 실제로 "굵은 회색"입니다. 기본적으로, 8 개의 "밝은"색상은 "FOREGROUND_INTENSITY"또는 "BACKGROUND_INTENSITY"비트가 설정된 "어두운"색상입니다. http://msdn.microsoft.com/en-us/library/ms682088(v=VS.85).aspx#_win32_character_attributes –

7

짧은 대답, 아니오; 콘솔은 출력시 밑줄이 표시된 문자의 사용을 허용하지 않습니다.

길게 대답 : 콘솔에서 사용되는 화면 버퍼는 바이트 배열보다 약간 큽니다. 각 커서 위치는 1 바이트 또는 1 문자입니다. 밑줄을 만들려면 두 개의 문자가 겹쳐져 있어야합니다 (콘솔에서는 불가능 함). 또는 상위 128 문자 값을 밑줄이 그어진 코드 페이지 또는 하위 128의 취소 코드 버전으로 사용하는 코드 페이지에 액세스해야합니다 (예 : 하나를 아는 것).

밑줄이있는 줄에 "이중 간격"을 사용하려는 경우이 문제를 해결할 수 있습니다. 문자 코드 0x00AF (십진수 175)는 문자 공간의 맨 위에있는 테두리를 나타내는 "텍스트 아트"문자입니다. 당신이 당신의 원본의 밑에 선에서 그들을 사용하는 경우에, 밑줄.

12
using System; 
using System.Runtime.InteropServices; 

class Program 
{ 
    const int STD_OUTPUT_HANDLE = -11; 
    const uint ENABLE_VIRTUAL_TERMINAL_PROCESSING = 4; 

    [DllImport("kernel32.dll", SetLastError = true)] 
    static extern IntPtr GetStdHandle(int nStdHandle); 

    [DllImport("kernel32.dll")] 
    static extern bool GetConsoleMode(IntPtr hConsoleHandle, out uint lpMode); 

    [DllImport("kernel32.dll")] 
    static extern bool SetConsoleMode(IntPtr hConsoleHandle, uint dwMode); 

    static void Main() 
    { 
     var handle = GetStdHandle(STD_OUTPUT_HANDLE); 
     uint mode; 
     GetConsoleMode(handle, out mode); 
     mode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING; 
     SetConsoleMode(handle, mode); 

     const string UNDERLINE = "\x1B[4m"; 
     const string RESET = "\x1B[0m"; 
     Console.WriteLine("Some " + UNDERLINE + "underlined" + RESET + " text"); 
    } 
} 

Console with underlined text

+0

죄송합니다. 저를 위해 일하지 않았습니다 .. 놓친 것이 있습니까? –

+0

** [편집] 작동, 문제는 const를 hexa로 변경했습니다. 습관을 유지하십시오! 감사 :)** –