C语言控制台窗口图形界面编程(四):文本输出

       文本颜色属性已经学会了,那么下面就学习几个比较常用的文本输出函数,如下:

 1 BOOL FillConsoleOutputAttribute(    // 填充字符属性
 2 HANDLE hConsoleOutput,              // 句柄
 3 WORD wAttribute,                    // 文本属性
 4 DWORD nLength,                      // 个数
 5 COORD dwWriteCoord,                 // 开始位置
 6 LPDWORD lpNumberOfAttrsWritten      // 返回填充的个数
 7 );
 8 BOOL FillConsoleOutputCharacter(    // 填充指定数据的字符
 9 HANDLE hConsoleOutput,              // 句柄
10 TCHAR cCharacter,                   // 字符
11 DWORD nLength,                      // 字符个数
12 COORD dwWriteCoord,                 // 起始位置
13 LPDWORD lpNumberOfCharsWritten      // 已写个数
14 );
15 BOOL WriteConsoleOutputCharacter(   // 在指定位置处插入指定数量的字符
16 HANDLE hConsoleOutput,              // 句柄
17 LPCTSTR lpCharacter,                // 字符串
18 DWORD nLength,                      // 字符个数
19 COORD dwWriteCoord,                 // 起始位置
20 LPDWORD lpNumberOfCharsWritten      // 已写个数
21 );


       另外再介绍一个表示区域的结构体,如下:

 1 typedef struct _SMALL_RECT  //表示矩形区域的结构体
 2 {
 3   SHORT Left;       //左边界
 4   SHORT Top;        //上边界
 5   SHORT Right;      //右边界
 6   SHORT Bottom;     //下边界
 7 } SMALL_RECT;
 8 /*
 9 微软官方的说法是
10 Left    区域的左上顶点的X坐标
11 Top     区域的左上顶点的Y坐标
12 Right   区域的右下顶点的X坐标
13 Bottom  区域的右下顶点的Y坐标
14 */

       通过以上的文本输出函数,我们来做一个简单的在一个具有阴影效果的窗口显示字符串的示例程序,如下:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <Windows.h>
 4 #include <conio.h>
 5 
 6 int main()
 7 {
 8     char *str = "Hello World!";     //定义输出信息
 9     int len = strlen(str), i;
10     WORD shadow = BACKGROUND_INTENSITY;     //阴影属性
11     WORD text = BACKGROUND_GREEN | BACKGROUND_INTENSITY;    //文本属性
12     HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);    //获得标准输出设备句柄
13     CONSOLE_SCREEN_BUFFER_INFO csbi;    //定义窗口缓冲区信息结构体
14     GetConsoleScreenBufferInfo(handle_out, &csbi);  //获得窗口缓冲区信息
15     SMALL_RECT rc;      //定义一个文本框输出区域
16     COORD posText;      //定义文本框的起始坐标
17     COORD posShadow;    //定义阴影框的起始坐标
18     //确定区域的边界
19     rc.Top = 8;     //上边界
20     rc.Bottom = rc.Top + 4;     //下边界
21     rc.Left = (csbi.dwSize.X - len) / 2 - 2;    //左边界,为了让输出的字符串居中
22     rc.Right = rc.Left + len + 4;   //右边界
23     //确定文本框起始坐标
24     posText.X = rc.Left;
25     posText.Y = rc.Top;
26     //确定阴影框的起始坐标
27     posShadow.X = posText.X + 1;
28     posShadow.Y = posText.Y + 1;
29     for (i=0; i<5; ++i)     //先输出阴影框
30     {
31         FillConsoleOutputAttribute(handle_out, shadow, len + 4, posShadow, NULL);
32         posShadow.Y++;
33     }
34     for (i=0; i<5; ++i)     //在输出文本框,其中与阴影框重合的部分会被覆盖掉
35     {
36         FillConsoleOutputAttribute(handle_out, text, len + 4, posText, NULL);
37         posText.Y++;
38     }
39     //设置文本输出处的坐标
40     posText.X = rc.Left + 2;
41     posText.Y = rc.Top + 2;
42     WriteConsoleOutputCharacter(handle_out, str, len, posText, NULL);   //输出字符串
43     SetConsoleTextAttribute(handle_out, csbi.wAttributes);   // 恢复原来的属性
44     CloseHandle(handle_out);
45     return 0;
46 }


       以上样例在Code::Blocks 13.12中编译通过。

原文地址:https://www.cnblogs.com/JZQT/p/3802437.html