c/c++ console(控制台)编程详解
前言:
控制台文本窗口的控制是基于win32 api(win32 api可理解为微软给我们提供的一系列函数的集合)实现的;
例1:
#include <stdio.h>int main()
{
printf("Hello World!\n");
return ;
}
运行结果:

例1中,我们用printf()函数实现在控制台输出了hello world!然而当我们想要将之前输出的内容清除时,在stdio.h中的函数并不能满足我们的需求;这时我们就要借助于win32 api函数
例2:
#include <stdio.h>
#include <windows.h>
int main()
{
printf("Hello World!\n");
Sleep();
system("cls");
return ;
}
运行结果:

例2中,用到windows.h中的Sleep();system();函数,Sleep(1000)函数功能为延时1s后程序向下运行,system(“cls”)清除内容,所以在例2中,程序运行显示hello world!一秒后就清除
用于控制台窗口操作的API函数如下:
GetConsoleScreenBufferInfo 获取控制台窗口信息
GetConsoleTitle 获取控制台窗口标题
ScrollConsoleScreenBuffer 在缓冲区中移动数据块
SetConsoleScreenBufferSize 更改指定缓冲区大小
SetConsoleTitle 设置控制台窗口标题
SetConsoleWindowInfo 设置控制台窗口信息
例3:
#include <windows.h>
#include <stdio.h> int main(void) {
SetConsoleTitle(L"hello world!"); // 设置窗口标题
printf("hello world!");
return ;
}
运行结果:

在例3中,我们使用了setconsoletitle()函数;窗口标题已然改变成为hello world!了
关于其它函数的使用方法,可以度,这里暂且不做赘述了。。。。。
1.控制台初始化
#include <iostream>
#include <windows.h>
using namespace std; int main()
{
//设置控制台窗口标题
//SetConsoleTitle("更改标题字符串")
SetConsoleTitleA("hello world!"); //获取控制台窗口信息;
//GetConsoleScreenBufferInfo(HANDLE hConsoleOutput, CONSOLE_SCREEN_BUFFER_INFO *bInfo)
//第一个hConsoleOutput参数(标准控制句柄)通过GetStdHandle()函数返回值获得
//第二个参数CONSOLE_SCREEN_BUFFER_INFO 保存控制台信息结构体指针
/*数据成员如下:
{
COORD dwSize; // 缓冲区大小
COORD dwCursorPosition; //当前光标位置
WORD wAttributes; //字符属性
SMALL_RECT srWindow; //当前窗口显示的大小和位置
COORD dwMaximumWindowSize; //最大的窗口缓冲区大小
}
*/
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO bInfo;
GetConsoleScreenBufferInfo(hOutput, &bInfo);
cout << "窗口缓冲区大小:" << bInfo.dwSize.X << ", " << bInfo.dwSize.Y << endl;
cout << "窗口坐标位置:" << bInfo.srWindow.Left << ", " << bInfo.srWindow.Top
<< ", "<< bInfo.srWindow.Right << ", " << bInfo.srWindow.Bottom << endl; //设置显示区域坐标
//SetConsoleWindowInfo(HANDLE, BOOL, SMALL_RECT *);
SMALL_RECT rc = {,, , }; // 坐标位置结构体初始化
SetConsoleWindowInfo(hOutput,true ,&rc);
cout << "窗口显示坐标位置:" << bInfo.srWindow.Left << ", " << bInfo.srWindow.Top
<< ", "<< bInfo.srWindow.Right << ", " << bInfo.srWindow.Bottom << endl; //更改指定缓冲区大小
//SetConsoleScreenBufferSize(HANDLE hConsoleOutput, COORD dwSize)
//COORD为一个数据结构体
COORD dSiz = {, };
SetConsoleScreenBufferSize(hOutput, dSiz);
cout << "改变后大小:" << dSiz.X << ", " << dSiz.Y << endl; //获取控制台窗口标题
//GetConsoleTitle(LPTSTR lpConsoleTitle, DWORD nSize)
//lpConsoleTitle为指向一个缓冲区指针以接收包含标题的字符串;nSize由lpConsoleTitle指向的缓冲区大小
char cTitle[];
GetConsoleTitleA(cTitle, );
cout << "窗口标题:" << cTitle << endl; // 关闭标准输出设备句柄
CloseHandle(hOut);
return ;
}

2.设置文本属性(文本颜色、移动控制)
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
/*设置文本属
BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput, WORD wAttributes);//句柄, 文本属性*/ HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); // 获取标准输出设备句柄
WORD wr1 = 0xfa;//定义颜色属性;第一位为背景色,第二位为前景色
SetConsoleTextAttribute(hOut, wr1);
cout << "hello world!" << endl; WORD wr2 = FOREGROUND_RED | FOREGROUND_INTENSITY;//方法二用系统宏定义颜色属性
SetConsoleTextAttribute(hOut, wr2);
cout << "hello world!" << endl; /*移动文本位置位置
BOOL ScrollConsoleScreenBuffer(HANDLE hConsoleOutput, CONST SMALL_RECT* lpScrollRectangle, CONST SMALL_RECT* lpClipRectangle,
COORD dwDestinationOrigin,CONST CHAR_INFO* lpFill);
// 句柄// 裁剪区域// 目标区域 // 新的位置// 填充字符*/
//输出文本
SetConsoleTextAttribute(hOut, 0x0f);
cout << "" << endl;
cout << "" << endl;
cout << "" << endl;
cout << "" << endl; SMALL_RECT CutScr = {, , , }; //裁剪区域与目标区域的集合行成剪切区域
SMALL_RECT PasScr = {, , , }; //可以是NULL,即全区域
COORD pos = {, }; //起点坐标,与裁剪区域长宽构成的区域再与目标区域的集合为粘贴区 //定义填充字符的各个参数及属性
SetConsoleTextAttribute(hOut, 0x1);
CONSOLE_SCREEN_BUFFER_INFO Intsrc;
GetConsoleScreenBufferInfo(hOut, &Intsrc);
CHAR_INFO chFill = {'A', Intsrc.wAttributes}; //定义剪切区域填充字符
ScrollConsoleScreenBuffer(hOut, &CutScr, &PasScr, pos, &chFill); //移动文本 CloseHandle(hOut); // 关闭标准输出设备句柄
return ;
}
运行结果:

WORD文本属性预定义宏:(可以直接用16进制表示,WORD w = 0xf0;前一位表示背景色,后一位代表前景色)
FOREGROUND_BLUE 蓝色
FOREGROUND_GREEN 绿色
FOREGROUND_RED 红色
FOREGROUND_INTENSITY 加强
BACKGROUND_BLUE 蓝色背景
BACKGROUND_GREEN 绿色背景
BACKGROUND_RED 红色背景
BACKGROUND_INTENSITY 背景色加强
COMMON_LVB_REVERSE_VIDEO 反色
当前文本属性信息可通过调用函数GetConsoleScreenBufferInfo后,在CONSOLE_SCREEN_ BUFFER_INFO结构成员wAttributes中得到。
在指定位置处写属性
BOOL WriteConsoleOutputAttribute(HANDLE hConsoleOutput, CONST WORD *lpAttribute, DWORD nLength,
COORD dwWriteCoord, LPDWORD lpNumberOfAttrsWritten);
//句柄, 属性, 个数, 起始位置, 已写个数*/
填充指定数据的字符
BOOL FillConsoleOutputCharacter(HANDLE hConsoleOutput, TCHAR cCharacter,DWORD nLength, COORD dwWriteCoord,
LPDWORD lpNumberOfCharsWritten);
// 句柄, 字符, 字符个数, 起始位置, 已写个数*/
在当前光标位置处插入指定数量的字符
BOOL WriteConsole(HANDLE hConsoleOutput, CONST VOID *lpBuffer, DWORD nNumberOfCharsToWrite,
LPDWORD lpNumberOfCharsWritten,LPVOID lpReserved);
//句柄, 字符串, 字符个数, 已写个数, 保留*/
向指定区域写带属性的字符
BOOL WriteConsoleOutput(HANDLE hConsoleOutput, CONST CHAR_INFO *lpBuffer, COORD dwBufferSize,
COORD dwBufferCoord,PSMALL_RECT lpWriteRegion );
// 句柄 // 字符数据区// 数据区大小// 起始坐标// 要写的区域*/
在指定位置处插入指定数量的字符
BOOL WriteConsoleOutputCharacter(HANDLE hConsoleOutput, LPCTSTR lpCharacter, DWORD nLength,
COORD dwWriteCoord, LPDWORD lpNumberOfCharsWritten);
// 句柄// 字符串// 字符个数// 起始位置// 已写个数*/
填充字符属性
BOOL FillConsoleOutputAttribute(HANDLE hConsoleOutput, WORD wAttribute,DWORD nLength,
COORD dwWriteCoord, LPDWORD lpNumberOfAttrsWritten);
//句柄, 文本属性, 个数, 开始位置, 返回填充的个数*/ // 设置代码页,
SetConsoleOutputCP();如(简体中文) 设置成936
3.光标操作控制
#include <iostream>
#include <windows.h>
using namespace std;
int main()
{
cout << "hello world!" << endl; //设置光标位置
//SetConsoleCursorPosition(HANDLE hConsoleOutput,COORD dwCursorPosition);
//设置光标信息
//BOOL SetConsoleCursorInfo(HANDLE hConsoleOutput, PCONST PCONSOLE_CURSOR_INFO lpConsoleCursorInfo);
//获取光标信息
//BOOL GetConsoleCursorInfo(HANDLE hConsoleOutput, PCONSOLE_CURSOR_INFO lpConsoleCursorInfo);
//参数1:句柄;参数2:CONSOLE_CURSOR_INFO结构体{DWORD dwSize;(光标大小取值1-100)BOOL bVisible;(是否可见)} Sleep();//延时函数
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
COORD w = {, };
SetConsoleCursorPosition(hOut, w);
CONSOLE_CURSOR_INFO cursorInfo = {, FALSE};
Sleep();//延时函数
SetConsoleCursorInfo(hOut, &cursorInfo);
CloseHandle(hOut); // 关闭标准输出设备句柄
return ;
}
运行结果:
输出hello world!后延时两秒,光标从第二行移到行首,再2秒后光标隐藏不显示;
4.键盘操作控制
#include <iostream>
#include <windows.h>
#include <conio.h>
using namespace std;
HANDLE hOut;
//清除函数
void cle(COORD ClPos)
{
SetConsoleCursorPosition(hOut, ClPos);
cout << " " << endl;
}
//打印函数
void prin(COORD PrPos)
{
SetConsoleCursorPosition(hOut, PrPos);
cout << "hello world!" << endl;
}
//移动函数
void Move(COORD *MoPos, int key)
{
switch(key)
{
case : MoPos->Y--;break;
case : MoPos->X--;break;
case : MoPos->X++;break;
case : MoPos->Y++;break;
default: break;
}
} int main()
{
cout << "用方向键移动下行输出内容" << endl;
hOut = GetStdHandle(STD_OUTPUT_HANDLE);//取句柄
COORD CrPos = {, };//保存光标信息
prin(CrPos);//打印
//等待键按下
while()
{
if(kbhit())
{
cle(CrPos);//清除原有输出
Move(&CrPos, getch());
prin(CrPos);
}
}
return ;
}
运行结果:

可以用方向键任意移动hello world!
注意区分 getch(); getche(); getcher();函数
综合案例贪吃蛇,推箱子,俄罗斯方块(待续。。。)
c/c++ console(控制台)编程详解的更多相关文章
- Log4J:Log4J三大组件:Logger+Appender+Layout 格式化编程详解
快速了解Log4J Log4J的三个组件: Logger:日志记录器,负责收集处理日志记录 (如何处理日志) Appender:日志输出目的地,负责日志的输出 (输出到什么 地方) Layo ...
- Linux串口编程详解(转)
串口本身,标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备.虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接 ...
- ORACLE PL/SQL编程详解
ORACLE PL/SQL编程详解 编程详解 SQL语言只是访问.操作数据库的语言,并不是一种具有流程控制的程序设计语言,而只有程序设计语言才能用于应用软件的开发.PL /SQL是一种高级数据库程序设 ...
- [强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!)
原文:[强烈推荐]ORACLE PL/SQL编程详解之七:程序包的创建与应用(聪明在于学习,天才在于积累!) [强烈推荐]ORACLE PL/SQL编程详解之七: 程序包的创建与应用(聪明在于学习,天 ...
- [推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆)
原文:[推荐]ORACLE PL/SQL编程详解之三:PL/SQL流程控制语句(不给规则,不成方圆) [推荐]ORACLE PL/SQL编程详解之三: PL/SQL流程控制语句(不给规则,不成方圆) ...
- 【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航
原文:[强烈强烈推荐]<ORACLE PL/SQL编程详解>全原创(共八篇)--系列文章导航 <ORACLE PL/SQL编程详解> 系列文章目录导航 ——通过知识共享树立个人 ...
- [推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下)
原文:[推荐]ORACLE PL/SQL编程详解之一:PL/SQL 程序设计简介(千里之行,始于足下) [推荐]ORACLE PL/SQL编程详解之一: PL/SQL 程序设计简介(千里之行,始于足下 ...
- [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)
原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) [顶]ORACLE PL/SQL编程详解之二: PL/SQL块结构和组成元素(为山九仞,岂一日 ...
- Java8 函数式编程详解
Java8 函数式编程详解 Author:Dorae Date:2017年11月1日23:03:26 转载请注明出处 说起Java8,可能很多人都已经知道其最大的改进,就是引入了Lambda表达式与S ...
随机推荐
- [乐意黎原创] cuteftp 9 显示中文乱码
当用FTP连接空间时.中文命名的文件名称会显示乱码,原来是编码设置错误.怎么改动呢? 改动方法例如以下: 选择. 工具--> 全局选项->传输: 1. 传输方法: ASCII 2. SFT ...
- x86 处理器开机顺序
无论是千万行的linux ,还是百万行的uefi ,或者百十行的app, 它都有一个主线.应用程序是main() 函数里面全部函数运行完,程序结束.这里main() 做为程序的起点,uefi 能够觉得 ...
- ITM事件直接接收并解析
之前在实施一个监控项目时.客户由于买了IBM的小机.当前就赠送了TIVOLI的系统监控软件一套,客户也在他们的生产环境中部署了ITM的监控.由于没有购买IBM的netcool,无法集中管理告警事件,请 ...
- 【Jquery系列】prop和attr区别
问题描述 由于prop(property的缩写)和attr(attribute的缩写)翻译成汉语,均有“特性.属性”等意思的原因,导致大家容易混淆分不清,本篇文章将试图从英文含义,中文含义和Jquer ...
- python与redis交互
爬虫抓来的数据根据实际情况需要存入不同数据库,今天分享一下自己把数据存入redis数据库的经验,有需要的童鞋拿走不谢. 1.环境: Mac osx + python2. 2.需要安装的python包 ...
- 自学Zabbix1.2-zabbix特性
Zabbix是一个高度集成的网络监控套件,通过一个软件包即可提供如下特性. 概述 Zabbix是一个高度集成的网络监控套件,通过一个软件包即可提供如下特性 数据收集 可用性及性能检测 支持SNMP(t ...
- Selenium与phantomJS 登入豆瓣 有bug
# -*- coding:utf-8 -*- from selenium import webdriver from selenium.webdriver.common.keys import Key ...
- [.Net跨平台]部署DTCMS到Jexus遇到的问题及解决思路---Linux环境搭建
最近朋友托我帮忙研究如何把一个DTCMS部署到Linux下,经过1天的研究,部署基本成功,可能有些细节还未注意到,现在把心得分享一下.过程比预期的要简单 身为.Net程序员,这个问题的第一步可能就是如 ...
- C#创建对象时各种初始化属性、字段的方式的执行顺序
创建对象代码如下: new FilterInfo(Student.CreateTimeProperty,"朱七",Express.Equals,Relationship.Or) { ...
- Java I/O---类体系总结
1.Java I/O常用 (1)File 对文件系统中文件以及文件夹进行封装的对象,可以通过对象的思想来操作文件和文件夹. (2)FileInputStream 从文件系统中的某个文件中获得输入字节: ...