C语言控制台窗口图形界面编程之四 常用的文本输出函数2015-01-16文本颜色属性已经学会了,那么下面就学习几个比较常用的文本输出函数,如下:
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中编译通过。From:cnblogs 龙梦之痕