<知識分享>
文本顏色屬性已經學會了,那么下面就學習幾個比較常用的文本輸出函數,如下:
- BOOL FillConsoleOutputAttribute( // 填充字符屬性
- HANDLE hConsoleOutput, // 句柄
- WORD wAttribute, // 文本屬性
- DWORD nLength, // 個數
- COORD dwWriteCoord, // 開始位置
- LPDWORD lpNumberOfAttrsWritten // 返回填充的個數
- );
- BOOL FillConsoleOutputCharacter( // 填充指定數據的字符
- HANDLE hConsoleOutput, // 句柄
- TCHAR cCharacter, // 字符
- DWORD nLength, // 字符個數
- COORD dwWriteCoord, // 起始位置
- LPDWORD lpNumberOfCharsWritten // 已寫個數
- );
- BOOL WriteConsoleOutputCharacter( // 在指定位置處插入指定數量的字符
- HANDLE hConsoleOutput, // 句柄
- LPCTSTR lpCharacter, // 字符串
- DWORD nLength, // 字符個數
- COORD dwWriteCoord, // 起始位置
- LPDWORD lpNumberOfCharsWritten // 已寫個數
- );
另外再介紹一個表示區域的結構體,如下:
- typedef struct _SMALL_RECT //表示矩形區域的結構體
- {
- SHORT Left; //左邊界
- SHORT Top; //上邊界
- SHORT Right; //右邊界
- SHORT Bottom; //下邊界
- } SMALL_RECT;
- /*
- 微軟官方的說法是
- Left 區域的左上頂點的X坐標
- Top 區域的左上頂點的Y坐標
- Right 區域的右下頂點的X坐標
- Bottom 區域的右下頂點的Y坐標
- */
通過以上的文本輸出函數,我們來做一個簡單的在一個具有陰影效果的窗口顯示字符串的示例程序,如下:
- #include <stdio.h>
- #include <stdlib.h>
- #include <Windows.h>
- #include <conio.h>
- int main()
- {
- char *str = "Hello World!"; //定義輸出信息
- int len = strlen(str), i;
- WORD shadow = BACKGROUND_INTENSITY; //陰影屬性
- WORD text = BACKGROUND_GREEN | BACKGROUND_INTENSITY; //文本屬性
- HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE); //獲得標准輸出設備句柄
- CONSOLE_SCREEN_BUFFER_INFO csbi; //定義窗口緩沖區信息結構體
- GetConsoleScreenBufferInfo(handle_out, &csbi); //獲得窗口緩沖區信息
- SMALL_RECT rc; //定義一個文本框輸出區域
- COORD posText; //定義文本框的起始坐標
- COORD posShadow; //定義陰影框的起始坐標
- //確定區域的邊界
- rc.Top = 8; //上邊界
- rc.Bottom = rc.Top + 4; //下邊界
- rc.Left = (csbi.dwSize.X - len) / 2 - 2; //左邊界,為了讓輸出的字符串居中
- rc.Right = rc.Left + len + 4; //右邊界
- //確定文本框起始坐標
- posText.X = rc.Left;
- posText.Y = rc.Top;
- //確定陰影框的起始坐標
- posShadow.X = posText.X + 1;
- posShadow.Y = posText.Y + 1;
- for (i=0; i<5; ++i) //先輸出陰影框
- {
- FillConsoleOutputAttribute(handle_out, shadow, len + 4, posShadow, NULL);
- posShadow.Y++;
- }
- for (i=0; i<5; ++i) //在輸出文本框,其中與陰影框重合的部分會被覆蓋掉
- {
- FillConsoleOutputAttribute(handle_out, text, len + 4, posText, NULL);
- posText.Y++;
- }
- //設置文本輸出處的坐標
- posText.X = rc.Left + 2;
- posText.Y = rc.Top + 2;
- WriteConsoleOutputCharacter(handle_out, str, len, posText, NULL); //輸出字符串
- SetConsoleTextAttribute(handle_out, csbi.wAttributes); // 恢復原來的屬性
- CloseHandle(handle_out);
- return 0;
- }
以上樣例在Code::Blocks 13.12中編譯通過。