文章目錄
連結:http://support.microsoft.com/kb/319883/zh-cn簡介
若要將控制台視窗將顯示的文本的前景色彩和背景顏色使用 SetConsoleTextAttribute Win32 API (API) 函數。此函數設定螢幕緩衝區寫入的字元的屬性。
當您在運行時更改這些屬性時,所做的更改是有效只要控制台視窗處於開啟狀態。如果關閉,然後重新開啟控制台視窗屬性重設為它們的預設值。如果從已在啟動並執行控制台視窗中的命令列執行的程式,文字屬性所做的更改可用於為該控制台視窗,只要視窗開啟時,即使您的程式將退出。因此,程式應在退出該程式前還原原始的顏色屬性。
通過使用 GetConsoleScreenBufferInfo API 函數,您可以獲得控制台視窗的文字屬性。此函數填充 CONSOLE_SCREEN_BUFFER_INFO 結構包含有關當前輸出緩衝區設定的資訊的執行個體。此結構的 wAttribute 參數包含定義文本的前景色彩和背景顏色的顏色資訊。可能的顏色是通過將紅色、 綠色和藍色的組合,可以建立任意顏色組合。
分步樣本
- 在 Visual Studio.net 或 Visual Studio 2005 中建立一個新的 Visual C# 控制台應用程式項目。
- 在方案總管中,用滑鼠右鍵單擊您的項目,單擊 添加,然後選擇 添加類 將一個新類添加到您的程式。
- 粘貼下面的程式碼範例在類中建立的。驗證的程式碼範例將替換所有的現有代碼中 class.
OriginalColors = ConsoleInfo.wAttributes;
SetConsoleTextAttribute(hConsoleHandle, color);
使用 ResetColor 方法可以重設為原始值在程式開始執行時捕獲的控制台視窗的輸出緩衝區屬性。
SetConsoleTextAttribute(hConsoleHandle, OriginalColors);
分步樣本
- 在 Visual Studio.net 或 Visual Studio 2005 中建立一個新的 Visual C# 控制台應用程式項目。
- 在方案總管中,用滑鼠右鍵單擊您的項目,單擊 添加,然後選擇 添加類 將一個新類添加到您的程式。
- 粘貼下面的程式碼範例在類中建立的。驗證的程式碼範例將替換所有的現有代碼中 class.
代碼
using System;
using System.Runtime.InteropServices;
namespace ConsoleColor
{
/// Summary description for Class2.
public class Class2
{
private int hConsoleHandle;
private COORD ConsoleOutputLocation;
private CONSOLE_SCREEN_BUFFER_INFO ConsoleInfo;
private int OriginalColors;
private const int STD_OUTPUT_HANDLE = -11;
[DllImport("kernel32.dll", EntryPoint="GetStdHandle", SetLastError=true,
CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
private static extern int GetStdHandle(int nStdHandle);
[DllImport("kernel32.dll", EntryPoint="GetConsoleScreenBufferInfo",
SetLastError=true, CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
private static extern int GetConsoleScreenBufferInfo(int hConsoleOutput,
ref CONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo);
[DllImport("kernel32.dll", EntryPoint="SetConsoleTextAttribute",
SetLastError=true, CharSet=CharSet.Auto,
CallingConvention=CallingConvention.StdCall)]
private static extern int SetConsoleTextAttribute(int hConsoleOutput,
int wAttributes);
public enum Foreground
{
Blue = 0x00000001,
Green = 0x00000002,
Red = 0x00000004,
Intensity = 0x00000008
}
public enum Background
{
Blue = 0x00000010,
Green = 0x00000020,
Red = 0x00000040,
Intensity = 0x00000080
}
[StructLayout(LayoutKind.Sequential)] private struct COORD
{
short X;
short Y;
}
[StructLayout(LayoutKind.Sequential)] private struct SMALL_RECT
{
short Left;
short Top;
short Right;
short Bottom;
}
[StructLayout(LayoutKind.Sequential)] private struct CONSOLE_SCREEN_BUFFER_INFO
{
public COORD dwSize;
public COORD dwCursorPosition;
public int wAttributes;
public SMALL_RECT srWindow;
public COORD dwMaximumWindowSize;
}
// Constructor.
public Class2()
{
ConsoleInfo = new CONSOLE_SCREEN_BUFFER_INFO();
ConsoleOutputLocation = new COORD();
hConsoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hConsoleHandle, ref ConsoleInfo);
OriginalColors = ConsoleInfo.wAttributes;
}
public void TextColor(int color)
{
SetConsoleTextAttribute(hConsoleHandle, color);
}
public void ResetColor()
{
SetConsoleTextAttribute(hConsoleHandle, OriginalColors);
}
}
}
4.粘貼下面的程式碼範例包含 Main 函數的類檔案中。驗證的程式碼範例將替換現有代碼檔案中的所有
代碼
using System;
namespace ConsoleColor
{
class Class1
{
[STAThread]
static void Main(string[] args)
{
Class2 TextChange = new Class2();
Console.WriteLine("Original Colors");
Console.WriteLine("Press Enter to Begin");
Console.ReadLine();
TextChange.TextColor((int)Class2.Foreground.Green +
(int)Class2.Foreground.Intensity);
Console.WriteLine("THIS TEXT IS GREEN");
Console.WriteLine("Press Enter to change colors again");
Console.ReadLine();
TextChange.TextColor((int)Class2.Foreground.Red +
(int)Class2.Foreground.Blue +
(int)Class2.Foreground.Intensity);
Console.WriteLine("NOW THE TEXT IS PURPLE");
Console.WriteLine("Press Enter to change colors again");
Console.ReadLine();
TextChange.TextColor((int)Class2.Foreground.Blue +
(int)Class2.Foreground.Intensity +
(int)Class2.Background.Green +
(int)Class2.Background.Intensity);
Console.WriteLine("NOW THE TEXT IS BLUE AND BACKGROUND OF IT IS GREEN");
Console.WriteLine("Press Enter change everything back to normal");
Console.ReadLine();
TextChange.ResetColor();
Console.WriteLine("Back to Original Colors");
Console.WriteLine("Press Enter to Terminate");
Console.ReadLine();
}
}
}
有關詳細的資訊,請訪問下面的 Microsoft 網站:
控制台功能
http://msdn2.microsoft.com/en-us/library/ms682073.aspx (http://msdn2.microsoft.com/en-us/library/ms682073.aspx)
有關更多的資訊請單擊下面文章編號,以查看 Microsoft 知識庫中相應的文章:
319257 (http://support.microsoft.com/kb/319257/EN-US/ ) 如何: 清除與 Visual C#.net 控制台視窗點擊這裡察看該文章的英文版: 319883