WIN32部分知识介绍

 🌈前言:此篇博客是为下一篇的《贪吃蛇》的做的前戏工作,这篇会讲到贪吃蛇所用到的一些工具以及函数。

首先在讲WIN32的内容时我们想了解一下他的基本概念:

Windows 这个多作业系统除了协调应⽤程序的执⾏、分配内存、管理资源之外, 它同时也是⼀个很⼤ 的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程序达到开启 视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤程序,所以便 称之为 Application Programming Interface,简称 API 函数。WIN32 API也就是Microsoft Windows 32位平台的应⽤程序编程接⼝。

目录

💫一.控制台程序​编辑

 ✈️二.控制台屏幕上的坐标COORD

 =͟͟͞͞🏀三.GetStdHandle

 🔎四.GetConsoleCursorInfo和CONSOLE_CURSOR_INFO

🚀五.SetConsoleCursorInfo  

🛸六.SetConsoleCursorPosition  

​编辑 🥎七.GetAsyncKeyState  

🍓八.宽字符的使用

 1.前景

 2.本地化

3.类项 

4.setlocale函数  


💫一.控制台程序

看到这个我们是不是绝大很熟悉,没错这就是我们写代码经常使用的控制台。

我们可以在电脑上搜索cmd可以打开我们的控制台

并且我们可以在里面输入mode con cols= lines= 来调整它的行高和列宽。

就向这样就可以调整我们的行高和列宽。

那么我们在做一些程序的时候想把控制台右上角的标题改一下需要怎么做呢?

可以使用title 名称的方式来改变。 

那么在我们的c语言中怎么能将他们改变呢?

这是就需要用到我们的system函数,前面我们也可能接触过他。它的库函数是《stdlib.h》。

#include<stdlib.h>
int main()
{system("mode con cols=100 lines=30");system("title 贪吃蛇");system("pause");printf("hello world!");return 0;
}

同意可以实现相同的效果。

 ✈️二.控制台屏幕上的坐标COORD

COORD 是Windows API中定义的⼀个结构体,表⽰⼀个字符在控制台屏幕上的坐标
typedef struct _COORD {SHORT X;SHORT Y;
} COORD, *PCOORD;
给坐标赋值:
 COORD pos = { 30, 10 };

 =͟͟͞͞🏀三.GetStdHandle

GetStdHandle是⼀个Windows API函数。它⽤于从⼀个特定的标准设备(标准输⼊、标准输出或标准错误)中取得⼀个句柄(⽤来标识不同设备的数值),使⽤这个句柄可以操作设备。

这个函数可以获取到当前使用设备的控制信息。并且配合其他函数可以实现对光标以及光标位置大小的修改。

会返回过来一个HANDLE的参数

HANDLE GetStdHandle(DWORD nStdHandle);
HANDLE handle= NULL;
handle = GetStdHandle(STD_OUTPUT_HANDLE);

 🔎四.GetConsoleCursorInfo和CONSOLE_CURSOR_INFO

GetConsoleCursorInfo 这个函数的作用就是检索有关指定控制台屏幕缓冲区的光标⼤⼩和可⻅性的信息。
CONSOLE_CURSOR_INFO这个结构体,包含有关控制台光标的信息。
typedef struct _CONSOLE_CURSOR_INFO {DWORD dwSize;BOOL bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
dwSize,由光标填充的字符单元格的百分⽐。 此值介于1到100之间。 光标外观会变化,范围从完
全填充单元格到单元底部的⽔平线条。
bVisible,游标的可⻅性。 如果光标可⻅,则此成员为true反之则是false。
GetConsoleCursorInfo和 CONSOLE_CURSOR_INFO配合使用可以控制光标的大小以及显现。

🚀五.SetConsoleCursorInfo  

设置指定控制台屏幕缓冲区的光标的⼤⼩和可⻅性。
经过上述获得设备信息以及光标信息可以用此函数设置的光标大小和可见性。
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO CurInfor;GetConsoleCursorInfo(handle, &CurInfor);CurInfor.bVisible = false;SetConsoleCursorInfo(handle, &CurInfor);

可以看到我们的光标信息以及被隐藏。

🛸六.SetConsoleCursorPosition  

设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD类型的pos中,调⽤SetConsoleCursorPosition函数将光标位置设置到指定的位置。
BOOL WINAPI SetConsoleCursorPosition(HANDLE hConsoleOutput, COORD pos);
//获得设备句柄
HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
//根据句柄设置光标的位置
COORD pos={20,5};
SetConsoleCursorPosition(handle, pos);

根据pos的数值对光标位置进行调整。

我们可以将上述代码分装成一个setpos函数,参数为x,y。

x代表控制台以右上角黑框部分顶点为原点两条边为横纵坐标的横坐标,y则代表纵坐标。

 🥎七.GetAsyncKeyState  

 获取按键情况,GetAsyncKeyState的函数原型如下:

SHORT GetAsyncKeyState(int vKey
);
GetAsyncKeyState 的返回值是short类型,在上⼀次调⽤ GetAsyncKeyState 函数后,如果
返回的16位的short数据中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬 起;如果最低位被置为1则说明,该按键被按过,否则为0。
如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1.

我们可以用宏定义将他包装起来,将返回值与0x1按位与则可以得到是否按过此键位。

#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 )

🍓八.宽字符的使用

 1.前景

这⾥简单的讲⼀下C语⾔的国际化特性相关的知识,过去C语⾔并不适合⾮英语国家(地区)使⽤。

C语⾔最初假定字符都是但⾃⼰的。但是这些假定并不是在世界的任何地⽅都适⽤。
C语⾔字符默认是采⽤ASCII编码的,ASCII字符集采⽤的是单字节编码,且只使⽤了单字节中的低7 位,最⾼位是没有使⽤的,可表⽰为0xxxxxxxx;可以看到,ASCII字符集共包含128个字符,在英语 国家中,128个字符是基本够⽤的,但是,在其他国家语⾔中,⽐如,在法语中,字⺟上⽅有注⾳符 号,它就⽆法⽤ ASCII 码表⽰。于是,⼀些欧洲国家就决定,利⽤字节中闲置的最⾼位编⼊新的符 号。⽐如,法语中的é的编码为130(⼆进制10000010)。这样⼀来,这些欧洲国家使⽤的编码体 系,可以表⽰最多256个符号。但是,这⾥⼜出现了新的问题。不同的国家有不同的字⺟,因此,哪 怕它们都使⽤256个符号的编码⽅式,代表的字⺟却不⼀样。⽐如,130在法语编码中代表了é,在希 伯来语编码中却代表了字⺟Gimel 

 

后来为了使C语⾔适应国际化,C语⾔的标准中不断加⼊了国际化的⽀持。⽐如:加⼊和宽字符的类型 wchar_t 和宽字符的输⼊和输出函数,加⼊和<locale.h>头⽂件,其中提供了允许程序员针对特定 地区(通常是国家或者说某种特定语⾔的地理区域)调整程序⾏为的函数。

 2.<locale.h>本地化

<locale.h>提供的函数⽤于控制C标准库中对于不同的地区会产⽣不⼀样⾏为的部分。
在标准可以中,依赖地区的部分有以下⼏项:
数字量的格式
货币量的格式
字符集
⽇期和时间的表⽰形式

3.类项 

通过修改地区,程序可以改变它的⾏为来适应世界的不同区域。但地区的改变可能会影响库的许多部 分,其中⼀部分可能是我们不希望修改的。所以C语⾔⽀持针对不同的类项进⾏修改,下⾯的⼀个宏, 指定⼀个类项:
LC_COLLATE(影响字符串比较函数strcoll()和strfrm())
LC_CTYPE(影响处理函数的行为)
LC_MONETARY(影响货币格式)
LC_NUMERIC(影响printf的数字格式)
LC_TIME(影响时间格式strftime()和wcsftime())
LC_ALL - 针对所有类项修改

4.setlocale函数  

char* setlocale (int category, const char* locale);
setlocale 函数⽤于修改当前地区,可以针对⼀个类项修改,也可以针对所有类项。
setlocale 的第⼀个参数可以是前⾯说明的类项中的⼀个,那么每次只会影响⼀个类项,如果第⼀个参 数是LC_ALL,就会影响所有的类项。
C标准给第⼆个参数仅定义了2种可能取值:"C"和" "。
在任意程序执⾏开始,都会隐藏式执⾏调⽤:
setlocale(LC_ALL, "C");
当地区设置为"C"时,库函数按正常⽅式执⾏,⼩数点是⼀个点。
当程序运⾏起来后想改变地区,就只能显⽰调⽤setlocale函数。⽤" "作为第2个参数,调⽤setlocale 函数就可以切换到本地模式,这种模式下程序会适应本地环境。⽐如:切换到我们的本地模式后就⽀ 持宽字符(汉字)的输出等。
 setlocale(LC_ALL, " ");//切换到本地环境

 我们可以用wchar_t ch=L'●'来创建宽字符的变量。

用wprintf来打印。

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

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

相关文章

vscode插件-TONGYILingma

通义灵码&#xff0c;是一款基于通义大模型的智能编码辅助工具&#xff0c;提供行级/函数级实时续写、自然语言生成代码、单元测试生成、代码注释生成、代码解释、研发智能问答、异常报错排查等能力&#xff0c;并针对阿里云 SDK/API 的使用场景调优&#xff0c;为开发者带来高…

react-beautiful-dnd组件报Unable to find draggable with id

一、问题现象 项目中使用react-beautiful-dnd组件实现可拖拽&#xff0c;但拖了1次后可能会出现拖拽异常&#xff08;元素拖不动&#xff09;&#xff0c;打开控制台会发现有报错 二、解决方案 给Draggable组件和其下方的div添加了key就正常了,以下是我自己简单写的一个dem…

磁盘无法访问?别慌,这里有解决之道!

电脑中&#xff0c;那块储存着重要文件与数据的磁盘&#xff0c;突然之间无法访问&#xff0c;是不是让你感到惊慌失措&#xff1f;面对这样的突发状况&#xff0c;很多人可能会感到手足无措。但别担心&#xff0c;本文将为你解析磁盘无法访问的原因&#xff0c;并提供实用的数…

期刊《Computers Security》简介

官网截图 方式 同时支持订阅和OA 范围 latest issue Volume 140 In progress (May 2024) This issue is in progress but contains articles that are final and fully citable. 本期内没有image encryption相关论文。 Volume 139 April 2024 本期内没有image encryptio…

论文学习——一种新的具有分层响应系统的动态多目标优化算法

论文题目&#xff1a;A Novel Dynamic Multiobjective Optimization Algorithm With Hierarchical Response System 一种新的具有分层响应系统的动态多目标优化算法&#xff08;Han Li , Zidong Wang , Fellow, IEEE, Chengbo Lan, Peishu Wu , and Nianyin Zeng , Member, IE…

基于Java的在线课程教学系统(Vue.js+SpringBoot)

目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2.3 课时管理模块2.4 课程交互模块2.5 系统基础模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示4.1 管理后台4.2 用户网页 五、样例代码5.1 新增课程类型5.2 网站登录5.3 课…

阿里云服务器多少钱1月?2024年最新版报价

阿里云服务器一个月多少钱&#xff1f;最便宜5元1个月。阿里云轻量应用服务器2核2G3M配置61元一年&#xff0c;折合5元一个月&#xff0c;2核4G服务器30元3个月&#xff0c;2核2G3M带宽服务器99元12个月&#xff0c;轻量应用服务器2核4G4M带宽165元12个月&#xff0c;4核16G服务…

【物理排序】(最小交换环 | 大体量表排序 | 泛型算法)

设想一下&#xff0c;如果待排元素不是一个简单的整数&#xff0c;而是一个庞大的结构体&#xff0c;移动元素的时间不能忽略不计。 元素需要频繁互换&#xff0c;那么移动这些元素的时间将会非常长久&#xff0c;效率很低 typedef very_large_item {int comparable;Tp very_…

【MySQL | 第四篇】区分SQL语句的书写和执行顺序

文章目录 4.区分SQL语句的书写和执行顺序4.1书写顺序4.2执行顺序4.3总结4.4扩充&#xff1a;辨别having与where的异同&#xff1f;4.5聚合查询 4.区分SQL语句的书写和执行顺序 注意&#xff1a;SQL 语句的书写顺序与执行顺序不是一致的 4.1书写顺序 SELECT <字段名> …

点赞功能真的有必要上 Redis 吗?(Mongo、MySQL、Redis、MQ 实测性能对比)

目录 一、你会怎么设计一个点赞功能&#xff1f; 1.1、点赞实现思路 1.2、点赞功能设计 1.2.1、MySQL 单表 1.2.2、单表 MySQL 关联表 1.2.3、MySQL 关联表 mq 1.2.4、redis mq 1.2.5、mongodb 关联文档 二、性能测试 2.1、前置说明 2.2、10 万数据准备 一、你会…

【C++】三大特性之继承

1 继承的概念及定义 1.1 继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展、增加功能&#xff0c;这样产生新的类&#xff0c;称派生类&#xff08;或子类&#xff09;。而被继承的…

Java宝典-抽象类和接口

目录 1. 抽象类1.1 抽象类的概念1.2 抽象类的语法1.3 抽象类的特点 2. 接口2.1 接口的概念2.2 接口的语法2.3 接口的特点2.4 实现多个接口2.5 接口的继承 3. 接口使用案例 铁汁们好,今天我们学习抽象类和接口~ 1. 抽象类 1.1 抽象类的概念 什么是抽象类?在面向对象中,如果一…

Google浏览器122.下载驱动

打开网址&#xff1a;Chrome for Testing availability (googlechromelabs.github.io) 选择stable 选择对应的驱动就行

flink重温笔记(十四): flink 高级特性和新特性(3)——数据类型及 Avro 序列化

Flink学习笔记 前言&#xff1a;今天是学习 flink 的第 14 天啦&#xff01;学习了 flink 高级特性和新特性之数据类型及 avro 序列化&#xff0c;主要是解决大数据领域数据规范化写入和规范化读取的问题&#xff0c;avro 数据结构可以节约存储空间&#xff0c;本文中结合企业真…

开源向量数据库介绍

在开源矢量数据库的世界里&#xff0c;有些名字因其性能、灵活性和健壮性而脱颖而出。 1. Milvus Milvus 由 Zilliz 推出&#xff0c;是一款高度可定制的开源矢量数据库&#xff0c;在处理大规模数据方面大放异彩。由于其出色的可扩展性&#xff0c;当你需要处理大量数据时&a…

判断链表回文

题目&#xff1a; //方法一&#xff0c;空间复杂度O(n) class Solution { public:bool isPalindrome(ListNode* head) {vector<int> nums; //放进数组后用双指针判断ListNode* cur head;while(cur){nums.emplace_back(cur->val);cur cur->next;}for(int i0…

力扣同类题:重排链表

很明显做过一次 class Solution { public:void reorderList(ListNode* head) {if(!head||!head->next)return;ListNode *fasthead,*lowhead;ListNode *prenullptr,*curnullptr,*nextnullptr;while(fast->next!nullptr){fastfast->next;if(fast->next)fastfast->…

深入理解操作系统Operator System(2)

目录 操作系统对上的管理 系统调用接口 用户操作接口&#xff08;库函数&#xff09; 系统调用和库函数的概念 结构层次示意图 总结 为什么要有操作系统❓ 上次主要介绍了操作系统的"管理"和操作系统对下的管理。本篇主要是对上的管理。 操作系统对上的管理 …

04-ESP32S3-GPIO

ESP32S3-IDF GPIO GPIO简介 ESP32S3提供了多达45个物理GPIO管脚&#xff0c;这些管脚不仅可以作为通用的输入输出接口&#xff0c;还可以连接到内部外设信号。通过GPIO交换矩阵、IO MUX和RTC IO MUX&#xff0c;可以灵活地配置外设模块的输入信号来源于任何GPIO管脚&#xff0…