[C++]常用的windows控制台操作

news/2024/12/4 22:12:15/文章来源:https://www.cnblogs.com/seikei/p/18587097

目录
  • 一、光标
    • 1. 隐藏光标
    • 2. 移动光标
  • 二、窗口大小
    • 1. 调整大小
    • 2、固定大小
  • 三、颜色
    • 1. cmd 命令
    • 2. 直接printf颜色
  • 四、控制台
    • 1. 标题

一些常用的控制台操作!

注意:该文章全程需要:Windows.h 头文件,因为使用了Windows的API

一、光标

1. 隐藏光标

void HideCursor(){CONSOLE_CURSOR_INFO cursor_info = {1, 0};SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

2. 移动光标

代码中的参数:

  • x x坐标
  • y y坐标
void gotoxy(int x, int y){HANDLE hout;COORD pos;pos.X = x;pos.Y = y;hout = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hout, pos);
} 

二、窗口大小

1. 调整大小

自定义窗口大小可以带来更好的体验!

代码中的参数:

  • col
  • row 行数
    其实就是高和宽

下面是Windows10系统的写法

void setsize(int col, int row){char cmd[64];sprintf(cmd, "mode con cols=%d lines=%d", col, row);system(cmd);
}

或者使用Windows API的写法

bool SetSize(int width, int height)
{HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); //获取输出句柄SMALL_RECT wrt = { 0, 0, width - 1, height - 1 }; //设置宽高bool ret = SetConsoleWindowInfo(hOutput, TRUE, &wrt); // 设置窗体尺寸if (!ret) return false;COORD coord = { width, height };ret = SetConsoleScreenBufferSize(hOutput, coord); // 设置缓冲尺寸return ret;
}

上面的方法在Win10可以使用,但是在Win11系统失效了,如果想要在Win11系统下修改窗口大小,可以手动修改终端设置实现,但是!!
我们是为了在程序运行的时候能够自行修改窗口大小,怎么能让用户修改呢。
于是经过一番查找,发现了一个Windows的API可以实现修改窗口大小的操作————SetWindowPos
代码如下:

void setsize(int col,int row){HWND hwnd = GetConsoleWindow(Sleep(10);//如果在程序启动后立即执行这些代码,则必须在此处等待一小段时间,否则 GetWindow 将失败。我推测可能是因为控制台尚未完全初始化,若非开始时调用可以忽略此处。HWND owner = GetWindow(hwnd,GW_OWNER);if (owner == NULL) {// Windows 10SetWindowPos(hwnd, nullptr, 0, 0, col, row, SWP_NOZORDER | SWP_NOMOVE);}else {// Windows 11SetWindowPos(owner, nullptr, 0, 0, col, row, SWP_NOZORDER | SWP_NOMOVE);}
}

上面代码同时兼顾了Win10和Win11,推荐此写法。
这些代码不需要记忆,直接使用即可,参数和上面的一样。
同时,我们也可以利用它写一个全屏的函数

void full_screen()
{HWND hwnd = GetForegroundWindow();int cx = GetSystemMetrics(SM_CXSCREEN);            /* 屏幕宽度 像素 */int cy = GetSystemMetrics(SM_CYSCREEN);            /* 屏幕高度 像素 */LONG l_WinStyle = GetWindowLong(hwnd, GWL_STYLE);   /* 获取窗口信息 *//* 设置窗口信息 最大化 取消标题栏及边框 */SetWindowLong(hwnd, GWL_STYLE, (l_WinStyle | WS_POPUP | WS_MAXIMIZE) & ~WS_CAPTION & ~WS_THICKFRAME & ~WS_BORDER);SetWindowPos(hwnd, HWND_TOP, 0, 0, cx, cy, 0);
}

2、固定大小

当然,为了防止用户自己改变窗口大小,所以我们还需要固定窗口大小

HWND hWnd = GetConsoleWindow(); //获取窗口句柄
LONG_PTR sty = GetWindowLongPtrA(hWnd, GWL_STYLE); //获取窗口样式
sty = sty & ~WS_SIZEBOX & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX; //去除可变化大小,最大,最小化按钮,~是取反,&是与,这是位运算相关的知识了
SetWindowLongPtrA(hWnd, GWL_STYLE, sty); //设置窗体不可更改大小,不可最大化

或者直接写为一句代码(

SetWindowLongPtrA(GetConsoleWindow(), GWL_STYLE, GetWindowLongPtrA(GetConsoleWindow(),GWL_STYLE)& ~WS_SIZEBOX & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX);

可惜Win11用不了......,目前只看到有一种办法就是更改windows的终端,未发现其他固定控制台大小的方法。

三、颜色

1. cmd 命令

第一种改变输出颜色的方法,就是利用cmd命令改变全部颜色

color 后面的参数就是要修改的颜色

system("color a");              ^

部分参数

颜色
0 黑色
1 蓝色
2 绿色
3 Aqua
4 红色
5 紫色
6 黄色
7 白色
8 灰色
9 淡蓝色
a 浅绿色
b 淡蓝绿色
c 淡红色
d 淡紫色
e 淡黄色
F 亮白色

2. 直接printf颜色

这种方法虽然格式不是很好写,但是如果我们封装为函数就非常方便,并且因为printf输出,可以实现局部颜色改变,做控制台游戏的应该知道这有多重要hh(

void printf_red(const char *s)
{printf("\033[0m\033[1;31m%s\033[0m", s);
}void printf_green(const char *s)
{printf("\033[0m\033[1;32m%s\033[0m", s);
}void printf_yellow(const char *s)
{printf("\033[0m\033[1;33m%s\033[0m", s);
}//......void printf_cyan(const char *s)
{printf("\033[0m\033[1;36m%s\033[0m", s);
}

具体参考该文章

四、控制台

1. 标题

把下面的title改为想要的标题即可

SetConsoleTitle("title");

或者使用Windows的API更改标题

SetConsoleTitleA("test"); 

先记录这些,有用到的再继续更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/846879.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高性能计算-NEON-图像旋转

1. 对512*512 png 四通道图像顺时针旋转90度 思路: 像素分块,对块内转置;再水平镜像。图像库使用 stb img 2. 代码 #include <stdio.h> #include <arm_neon.h>#include <stdlib.h> #define STB_IMAGE_IMPLEMENTATION #include "./stb/stb_image.h&quo…

使用自定义 MSBuild Task 阻止 git 的大文件提交

一个自定义 MSBuild Task 的实际案例NuGet Gallery | Jgrass.MSBuild.GitTask 前言 在 .NET 项目自定义 MSBuild Task 中提到,可以使用自定义 MSBuild Task 来实现自定义功能。 这里介绍实现的 git 提交大文件提交拦截功能。 引入 nuget 包之后,设置好要拦截的大小,内置的 L…

ElasticSearch学习笔记

ES7.x和ES8.x的学习笔记1.ElasticSearch概述 1.1 ElasticSearch是什么 Elaticsearch,简称为 ES,ES 是一个开源的高扩展的分布式全文搜索引擎,是整个Elastic Stack 技术栈的核心。它可以近乎实时的存储、检索数据;本身扩展性很好,可以扩展到上 百台服务器,处理PB级别的数…

不死的魔女与灾厄的少年

传闻......森林的深处里住着一位不死的魔女森林的深处,住着一位魔女。 她已经活了几十个世纪,每代王国的历史书籍中都有她的出现。 人们称她为: “不死的魔女” 寂静了百年的森林,在某一天,闯入了一个不速之客,他倒在了魔女的屋子前。 那是一个浑身染血的少年,不着片缕,…

地址冲突检测(DAD)

地址冲突检测(DAD) 目录地址冲突检测(DAD)一、前言二、免费ARP报文实验拓扑报文分析 一、前言 公网: public,互联网可以访问 ,地址必须唯一 私网:RFC1918隔离公网,安全复用 优点:地址段重叠使用 缺点:地址冲突 IPV6唯一本地地址 = IPV6私网地址,提供global id二、免…

2025年昆明理工大学MBA研究生招生人数

--昆工MBA考研、管理与经济学院、125100工商管理、125602项目管理、199管理类综合能力、F009 政治、F008政治+项目管理概论

ybt2.5章AC自动机题解

算法理解 即在字典树上跑kmp T1: 根据这个结论我自己手搓了一个AC自动机上去,喜提TLE 我是如何操作的呢? 我当时的想法是这样的:我们把字典树从根到该节点形成的链看成是一个模式串与文本串进行匹配,然后就用一个dfs来传递j就可以解决了 然后我打开书一看到这幅图,立马就不…

了解checksec显示的各种参数和保护

Arch:内核(32位/64位) RELRO 在Linux系统安全领域数据可以写的存储区就会是攻击的目标,尤其是存储函数指针的区域。所以在安全防护的角度来说尽量减少可写的存储区域对安全会有极大的好处. GCC, GNU linker以及Glibc-dynamic linker一起配合实现了一种叫做relro的技术: rea…

20222325 2024-2025-1 《网络与系统攻防技术》实验八实验报告

1.实验内容 (1)Web前端HTML 能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML (2)Web前端javascipt 理解JavaScript的基本功能,理解DOM 在(1)的基础上,编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎+输入…

【C++】关于 Visual Studio 的使用技巧(保姆级教程)

目录fliter 视图输出文件位置设置查看预处理结果将目标文件转换为可读的汇编自定义程序入口调试时查看变量在内存中的具体值查看代码的反汇编 fliter 视图 visual studio默认是filter视图(中文为筛选器)项目下的是filter而非硬盘目录里实际的文件夹,这时新建的也是filter想要…

Linux: Centos7 Cannot find a valid baseurl for repo: base/7/x86_64 解决方案

问题背景 执行yum update出现如下报错排查虚拟机是否联网 ping -c 4 www.baidu.com 可以看到网络链接没有问题解决方案 原因是国外的镜像源有问题,换成国内的即可。 备份原有的镜像源 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 下…