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


    00. 目录

    01. FillConsoleOutputAttribute函数

    设置指定数量的字符单元格的字符属性,从屏幕缓冲区中的指定坐标开始。

    函数声明:

    设置指定数量的字符单元格的字符属性BOOL WINAPI FillConsoleOutputAttribute(
      _In_  HANDLE  hConsoleOutput,
      _In_  WORD    wAttribute,
      _In_  DWORD   nLength,
      _In_  COORD   dwWriteCoord,
      _Out_ LPDWORD lpNumberOfAttrsWritten
    );
    功能:
    	设置指定数量的字符单元格的字符属性
    参数:
    	hConsoleOutput 控制台屏幕缓冲区的句柄。句柄必须具有GENERIC_WRITE访问权限。
    	wAttribute 写入控制台屏幕缓冲区时要使用的属性。
    	nLength 要设置为指定颜色属性的字符单元格数。
    	dwWriteCoord 指定字符坐标的开始位置
    	lpNumberOfAttrsWritten 指向变量的指针,该变量接收实际设置了属性的字符单元格数。
    	
    返回值:
    	如果函数成功,则返回值为非零值。
    	如果函数失败,则返回值为零。要获取扩展错误信息,请调用GetLastError。
    
    

    参考程序:

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    #include <Windows.h>
    
    #define N 255
    
    int main()
    {
    	int i = 0;
    	int len = 0;
    	char *str = "黑马程序员";
    
    	//定义句柄类型的变量
    	HANDLE hOut = NULL;
    	//窗口信息结构体
    	CONSOLE_SCREEN_BUFFER_INFO screenInfo;
    	//开始位置
    	COORD posShadow;
    
    	//获取标准输出句柄
    	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    
    	//获取窗口信息结构体
    	GetConsoleScreenBufferInfo(hOut, &screenInfo);
    
    	//长度
    	len = strlen(str) + 1;
    	posShadow.X = 8;
    	posShadow.Y = 8;
    	//BACKGROUND_INTENSITY 灰色属性
    	FillConsoleOutputAttribute(hOut, BACKGROUND_INTENSITY, len + 4, posShadow, NULL);
    
    	getchar();
    
    	//关闭句柄
    	CloseHandle(hOut);
    
    	system("pause");
    	return 0;
    }
    

    执行效果

    第8行第8列开始显示 长度为len + 4 属性为灰色

    官方参考手册:https://docs.microsoft.com/en-us/windows/console/fillconsoleoutputattribute

    02. FillConsoleOutputCharacter函数

    从指定的坐标开始,将一个字符按照指定的次数写入控制台屏幕缓冲区。

    函数声明:

    BOOL WINAPI FillConsoleOutputCharacter(
      _In_  HANDLE  hConsoleOutput,
      _In_  TCHAR   cCharacter,
      _In_  DWORD   nLength,
      _In_  COORD   dwWriteCoord,
      _Out_ LPDWORD lpNumberOfCharsWritten
    );
    功能:
    	填充指定次数的字符
    参数:
        hConsoleOutput 控制台屏幕缓冲区的句柄。句柄必须具有GENERIC_WRITE访问权限。
        cCharacter 要写入控制台屏幕缓冲区的字符。
        nLength 应写入字符的字符单元格数。
        dwWriteCoord 指定字符坐标到的字符是要被写入的开始位置。
        lpNumberOfCharsWritten 指向变量的指针,该变量接收实际写入控制台屏幕缓冲区的字符数。
        
    返回值:
    	如果函数成功,则返回值为非零值。
    	如果函数失败,则返回值为零。要获取扩展错误信息,请调用GetLastError。
    

    参考程序:

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    #include <Windows.h>
    
    #define N 255
    
    int main()
    {
    	int i = 0;
    	int len = 0;
    	char *str = "黑马程序员";
    
    	//定义句柄类型的变量
    	HANDLE hOut = NULL;
    	//窗口信息结构体
    	CONSOLE_SCREEN_BUFFER_INFO screenInfo;
    	//开始位置
    	COORD posShadow;
    
    	//获取标准输出句柄
    	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    
    	//获取窗口信息结构体
    	GetConsoleScreenBufferInfo(hOut, &screenInfo);
    
    	//开始位置 
    	COORD pos = {0, 0};
    
    	//填充指定数字的字符
    	FillConsoleOutputCharacter(hOut, 'B', screenInfo.dwSize.X * 4, pos, NULL);
    
    	getchar();
    
    	//关闭句柄
    	CloseHandle(hOut);
    
    	system("pause");
    	return 0;
    }
    
    

    执行结果:

    填充四行

    官方参考手册: https://docs.microsoft.com/en-us/windows/console/fillconsoleoutputcharacter

    03. WriteConsoleOutputCharacter函数

    从指定位置开始,将多个字符复制到控制台屏幕缓冲区的连续单元格。

    函数声明:

    BOOL WINAPI WriteConsoleOutputCharacter(
      _In_  HANDLE  hConsoleOutput,
      _In_  LPCTSTR lpCharacter,
      _In_  DWORD   nLength,
      _In_  COORD   dwWriteCoord,
      _Out_ LPDWORD lpNumberOfCharsWritten
    );
    
    功能:
    	从指定位置开始,将多个字符复制到控制台屏幕缓冲区的连续单元格。
    参数:
        hConsoleOutput 控制台屏幕缓冲区的句柄。句柄必须具有GENERIC_WRITE访问权限。
        lpCharacter 要写入控制台屏幕缓冲区的字符串。
        nLength 要写入的字符数。
        dwWriteCoord 起始位置
        lpNumberOfCharsWritten 指向接收实际写入的字符数的变量的指针。
        
    返回值:
    	如果函数成功,则返回值为非零值。
    	如果函数失败,则返回值为零。要获取扩展错误信息,请调用GetLastError。
    

    参考程序:

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    #include <Windows.h>
    
    #define N 255
    
    int main()
    {
    	int i = 0;
    	int len = 0;
    	char *str = "a";
    
    	//定义句柄类型的变量
    	HANDLE hOut = NULL;
    	//窗口信息结构体
    	CONSOLE_SCREEN_BUFFER_INFO screenInfo;
    	//开始位置
    	COORD posShadow;
    
    	//获取标准输出句柄
    	hOut = GetStdHandle(STD_OUTPUT_HANDLE);
    
    	//获取窗口信息结构体
    	GetConsoleScreenBufferInfo(hOut, &screenInfo);
    
    	//开始位置 
    	COORD pos = {0, 0};
    
    	//填充指定数字的字符
    	len = strlen(str);
    	WriteConsoleOutputCharacter(hOut, str, len, pos, NULL);
    
    	getchar();
    
    	//关闭句柄
    	CloseHandle(hOut);
    
    	system("pause");
    	return 0;
    }
    
    

    执行结果:

    官方参考手册:https://docs.microsoft.com/en-us/windows/console/writeconsoleoutputcharacter

    04. 综合实例

    参考程序:

    #define _CRT_SECURE_NO_WARNINGS
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    #include <Windows.h>
    #include <conio.h>
    
    
    int main()
    {
    	//定义输出信息
    	char *str = "Hello World!";     
    	int i;
    	int len = strlen(str);
    
    	//阴影属性
    	WORD shadow = BACKGROUND_INTENSITY;     
    	//文本属性
    	WORD text = BACKGROUND_GREEN | BACKGROUND_INTENSITY; 
    
    	//获得标准输出设备句柄
    	HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);  
    
    	//定义窗口缓冲区信息结构体
    	CONSOLE_SCREEN_BUFFER_INFO screenInfo; 
    
    	//获得窗口缓冲区信息
    	GetConsoleScreenBufferInfo(hOut, &screenInfo); 
    
    	//定义一个文本框输出区域
    	SMALL_RECT rc;      
    
    	//定义文本框的起始坐标
    	COORD posText;      
    
    	//定义阴影框的起始坐标
    	COORD posShadow;  
    
    	//确定区域的边界
    	rc.Top = 8;     //上边界
    	rc.Bottom = rc.Top + 4;     //下边界
    	rc.Left = (screenInfo.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(hOut, shadow, len + 4, posShadow, NULL);
    		posShadow.Y++;
    	}
    	for (i = 0; i < 5; ++i)     //在输出文本框,其中与阴影框重合的部分会被覆盖掉
    	{
    		FillConsoleOutputAttribute(hOut, text, len + 4, posText, NULL);
    		posText.Y++;
    	}
    	//设置文本输出处的坐标
    	posText.X = rc.Left + 2;
    	posText.Y = rc.Top + 2;
    	WriteConsoleOutputCharacter(hOut, str, len, posText, NULL);   //输出字符串
    
    	getchar();
    	SetConsoleTextAttribute(hOut, screenInfo.wAttributes);   // 恢复原来的属性
    	CloseHandle(hOut);
    
    	system("pause");
    	return 0;
    }
    
    
    宝剑锋从磨砺出,梅花香自苦寒来。
  • 相关阅读:
    js生成当前时间
    《JavaScript权威指南》读书笔记2
    firefox与ie的兼容(css,html)
    兼容ie ff 等浏览器的jquery,js层移动方法一
    解决文字撑大容器的方法,ie,ff, div,table
    兼容ie ff 等浏览器的jquery,js层移动方法二
    【CSS经典问题】子元素浮动之后如何撑开父元素
    【CSS技巧】列表横向排列的另一种方法
    【CSS经典问题】图片下面有空隙的解决办法
    MYSQL主从复制、主主复制、双主多从配置
  • 原文地址:https://www.cnblogs.com/szitcast/p/10923109.html
Copyright © 2020-2023  润新知