【自制C/C++小项目JuLongEditor】使用Windows控制台API来制作一个简单的文本编辑器

news2024/11/23 12:43:18

2023年8月22日,周二下午

昨天花了一个下午和晚上来制作的,

实现了一些基本的功能,

但由于代码只有130行,所以存在很多不足之处


GitHub:GitHub - JuLongZhiLu/JuLongEditor: C/C++小项目,使用Windows控制台API来制作一个简单的文本编辑器,只有130行代码


#include <windows.h>
#include <conio.h>
using namespace std;

//设置编辑器的能容纳的文本大小,最多10行80列
const int MAX_ROWS = 10;
const int MAX_COLS = 80;

CHAR_INFO buffer[MAX_ROWS][MAX_COLS];//二维字符数组,用来构成文本
COORD cursorPos;//专门坐标位置的数据结构
CONSOLE_SCREEN_BUFFER_INFO csbi;//控制台屏幕缓冲区信息

//初始化二维字符数组
void initBuffer() {
	for (int i = 0; i < MAX_ROWS; i++) {
		for (int j = 0; j < MAX_COLS; j++) {
			buffer[i][j].Char.AsciiChar = ' ';
			buffer[i][j].Attributes = FOREGROUND_BLUE;
		}
	}
}

//初始化坐标数据结构
void initCursor() {
	cursorPos.X = 0;
	cursorPos.Y = 0;
}

//把构成文本的二维数组打印到控制台
void drawBuffer(HANDLE console) {
	SMALL_RECT rect;
	rect.Top = 0;
	rect.Left = 0;
	rect.Bottom = MAX_ROWS - 1;
	rect.Right = MAX_COLS - 1;

	WriteConsoleOutputA(console, (CHAR_INFO*)buffer, { MAX_COLS, MAX_ROWS }, { 0, 0 }, &rect);
}

//处理键盘按键
void ProcessKeys(int key, HANDLE console) {
	if (key == 0 || key == 224) {  //如果是方向键和删除键
		key = _getch();
		switch (key) {
		case 72: // 上
			if (cursorPos.Y != 0)
				cursorPos.Y--;
			SetConsoleCursorPosition(console, cursorPos);//移动光标到指定位置
			break;
		case 80: // 下
			cursorPos.Y++;
			SetConsoleCursorPosition(console, cursorPos);//移动光标到指定位置
			break;
		case 75: // 左
			if (cursorPos.X != 0)
				cursorPos.X--;
			if (cursorPos.Y != 0 && cursorPos.X == 0)
				cursorPos.Y--;
			SetConsoleCursorPosition(console, cursorPos);
			break;
		case 77: // 右
			if (cursorPos.X != MAX_COLS)//如果一行的字符数没超过最大列数,那么光标就右移一位
				cursorPos.X++;
			else
			{
				cursorPos.X = 0;//如果超过了,就换行
				cursorPos.Y++;
			}
			SetConsoleCursorPosition(console, cursorPos);
			break;
		case 83: //删除键
			buffer[cursorPos.Y][cursorPos.X - 1].Char.AsciiChar = ' ';
			buffer[cursorPos.Y][cursorPos.X - 1].Attributes = FOREGROUND_BLUE;
			if (cursorPos.X != 0)
				cursorPos.X--;
			if (cursorPos.Y != 0 && cursorPos.X == 0)
				cursorPos.Y--;
			SetConsoleCursorPosition(console, cursorPos);
			drawBuffer(console);
			break;
		}
	}
	else if (key == 13) {//如果是换行键
		cursorPos.X = 0;
		cursorPos.Y++;
		SetConsoleCursorPosition(console, cursorPos);	//在输出设备上定位光标
	}
	else if (key == 8) {  // 如果是回退键(Backspace键)
		buffer[cursorPos.Y][cursorPos.X - 1].Char.AsciiChar = ' ';
		buffer[cursorPos.Y][cursorPos.X - 1].Attributes = FOREGROUND_BLUE;
		if (cursorPos.X != 0)
			cursorPos.X--;
		if (cursorPos.Y != 0 && cursorPos.X == 0)
			cursorPos.Y--;
		SetConsoleCursorPosition(console, cursorPos);
		drawBuffer(console);
	}
	else {//如果是输入文本
		buffer[cursorPos.Y][cursorPos.X].Char.AsciiChar = (char)key;
		buffer[cursorPos.Y][cursorPos.X].Attributes = FOREGROUND_BLUE;
		drawBuffer(console);
		cursorPos.X++;
		SetConsoleCursorPosition(console, cursorPos);
		drawBuffer(console);
	}
}

void input(HANDLE console) {

	while (true)
	{
		GetConsoleScreenBufferInfo(console, &csbi);	//获取屏幕缓冲的光标位置,然后把当前光标位置赋给COORD
		cursorPos.X = csbi.dwCursorPosition.X;			//得到坐标x的值
		cursorPos.Y = csbi.dwCursorPosition.Y;			//y值

		if (_kbhit()) {
			int key = _getch();
			ProcessKeys(key, console);
		}
	}
}

int main() {
	initBuffer();
	initCursor();
	HANDLE console = GetStdHandle(STD_OUTPUT_HANDLE);
	input(console);
}

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

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

相关文章

Hlang-从零开始编写一个vscode代码提示插件

文章目录 前言Hlang适配实现语法提示package.json配置编写提示语法配置语法高亮执行打包前言 通过一段时间的努力,Hlang是开发完毕了,但是我们还需要为它提供一个IDE。那么从零开发显然是不可取的,这会大大加大开发难度。但是我们可以基于vscode这个神奇的物质。所以我们只…

STM32驱动MAX30102心率血氧传感器(OLED显示)

STM32驱动MAX30102心率血氧传感器&#xff08;OLED显示&#xff09; 简介电气参数系统框图接线代码结果总结 简介 MAX30102是一个集成的脉搏血氧仪和心率监测仪模块。它包括内部led&#xff0c;光电探测器&#xff0c;光学元件&#xff0c;和低噪声电子与环境光排斥。MAX30102…

《三国》时期,谁才是优秀的项目经理

大家好&#xff0c;我是老原。 上一次细读三国&#xff0c;还是在老原高中的时候&#xff0c;当时只觉得他们神仙打架&#xff0c;谋略过人。 现在毕业也快10年&#xff0c;重读三国&#xff0c;我又有了新的一些发现——关于管理者。 金无赤足&#xff0c;人无完人。《三国…

stm32片内读写项目总结(多字节读写tongxindu)

1.flash操作驱动程序 a头文件 #ifndef FLASH_H #define FLASH_H #include “stm32f4xx.h” #define BOARD_NUM_ADDR 0x0800C000 #define STM32_FLASH_BASE 0x08000000 //STM32 FLASH的起始地址 #define FLASH_WAITETIME 50000 //FLASH等待超时时间 //FLASH 扇区的起始地址…

wazuh环境配置及漏洞复现

wazuh环境配置 案例复现 wazuh环境配置 1.进入官网下载OVA启动软件 Virtual Machine (OVA) - Installation alternatives (wazuh.com) 2.进入VMware像配置其他虚拟机一样进行配置即可 3.上面会有提示&#xff1a;账号为&#xff0c;wazuh-user&#xff1b;密码&#xff0c;wa…

Vue实现Excel表格中按钮增加小数位数,减少小数位数功能,多用于处理金融数据

效果图 <template><div><el-button click"increaseDecimals">A按钮</el-button><el-button click"roundNumber">B按钮</el-button><el-table :data"tableData" border><el-table-column v-for&q…

绿盾客户端字体库文件被加密了,预览不了

环境: 绿盾客户端7.0 Win10 专业版 问题描述: 绿盾客户端字体库文件被加密了,预览不了 预览不了 解决方案 1.打开控制台 2.进入规则中心 3.找到对应的操作员类型 4.选择自定义程序 5.右键新建程序,填最开始获得的程序名,可执行程序选择本地程序,我本地没有这个…

410随身WiFi刷完openwrt后作玩具nas/bt机

简单流程介绍&#xff1a;机子wifi模式改为客户端&#xff0c;添加ipv6&#xff0c;开放需要的端口&#xff0c;切换USB工作模式&#xff0c;挂载usb储存&#xff0c;安装qb/aria2之类软件 前提就是刷好openwrt了&#xff0c;教程话题里有 注意opemwrt的操作要及时保存并应用&a…

openGauss学习笔记-47 openGauss 高级数据管理-权限

文章目录 openGauss学习笔记-47 openGauss 高级数据管理-权限47.1 语法格式47.2 参数说明47.3 示例 openGauss学习笔记-47 openGauss 高级数据管理-权限 数据库对象创建后&#xff0c;进行对象创建的用户就是该对象的所有者。数据库安装后的默认情况下&#xff0c;未开启三权分…

5、Spring_DI注解开发

DI 注解开发 1.目前面临问题 建立 mapper public interface EmployeeMapper {void save(); }建立 mapper 实现类 Repository public class EmployeeMapperImpl implements EmployeeMapper {public void save(){System.out.println("保存员工信息");} }建立 service …

档案开发:增加查询和打卡按钮

档案开发&#xff1a;增加查询和打卡按钮 和单据开发的不同点 没有单据类型不是右击–>特性–>单据主表/单据子表&#xff0c;而是右击–>特性–>选择想要的接口访问器类型是NCVO不需要映射不是项目右键–>新建–>其他–>主子表单据结点&#xff0c;而是…

怕封店吗?来看看这份亚马逊测评宝典吧!

测评&#xff0c;一直是跨境电商亚马逊行业常谈论的话题&#xff0c;因为它是获取销量最快的方法之一&#xff0c;但对于测评&#xff0c;跨境电商亚马逊平台也是深恶痛绝&#xff0c;严厉打击测评行为&#xff0c;但不少的卖家仍旧喜欢铤而走险&#xff0c;做测评去提高店铺的…

Python打印七夕礼物

参考&#xff1a; python写七夕硬核礼物&#xff01; - 周旋机器视觉的文章 - 知乎 https://zhuanlan.zhihu.com/p/196451223 # -*- coding:utf-8 -*-# 导入opencv和openpyxl import openpyxl import cv2 as cv import numpy as np from openpyxl import load_workbook from o…

组织机构代码,注册号,纳税人识别号有什么区别?海关备案是什么?

组织机构代码&#xff0c;注册号&#xff0c;纳税人识别号有什么区别&#xff1f; 之前写过关于企业信用代码的文章&#xff0c;今天来讲一下企业的三证合一。三证合一指的是将识别号&#xff0c;注册号&#xff0c;组织机构代码三者共用一个号的说法。 但是&#xff0c;你看…

群英荟萃,决战渝城 | 第七届集创赛“加速科技杯”总决赛圆满落幕!

8月20-22日&#xff0c;第七届全国大学生集成电路创新创业大赛全国总决赛在重庆举办&#xff0c;“加速科技杯”中有26支优秀队伍从四百多支报名队伍中脱颖而出&#xff0c;获得总决赛各项大奖&#xff0c;取得了优异的成绩&#xff01;大赛同期举办的还有集创赛嘉年华、人才对…

python 项目打包器pyinstaller实践

在创建了独立应用&#xff08;自包含该应用的依赖包&#xff09;之后&#xff0c;还可以使用 PyInstaller 将 Python 程序生成可直接运行的程序&#xff0c;这个程序就可以被分发到对应的 Windows 或 Mac OS X 平台上运行。 安装 PyInstalle Python 默认并不包含 PyInstaller…

高隔音活动隔断墙是一种设计用于隔离声音、提供隐私和创建灵活空间的分隔墙

高隔音活动隔断墙是一种设计用于隔离声音、提供隐私和创建灵活空间的分隔墙。这种隔断墙通常在需要随时改变房间布局的场合&#xff0c;如酒店、会议中心、展览厅、办公室等地使用。 以下是有关高隔音活动隔断墙的一些重要特点和优势&#xff1a; 1. 隔音性能&#xff1a;高隔音…

Protobuf在IDEA中的插件安装教程

&#x1f337;&#x1f341; 博主猫头虎 带您 Go to New World.✨&#x1f341; &#x1f984; 博客首页——猫头虎的博客&#x1f390; &#x1f433;《面试题大全专栏》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &a…

【中危】Apache Ivy<2.5.2 存在XXE漏洞 (CVE-2022-46751)

漏洞描述 Apache Ivy 是一个管理基于 ANT 项目依赖关系的开源工具&#xff0c;文档类型定义(DTD)是一种文档类型定义语言,它用于定义XML文档中所包含的元素以及元素之间的关系。 Apache Ivy 2.5.2之前版本中&#xff0c;当解析自身配置、Ivy 文件或 Apache Maven 的 POM 文件…

改变住宅区空气质量,你一定要知道!

在现代城市生活中&#xff0c;住宅区的环境质量对居民的健康和舒适感起着至关重要的作用。扬尘颗粒和噪声不仅直接影响人们的日常生活&#xff0c;还可能对居民的健康和生活品质造成持续的影响。 在不断提升环保意识的同时&#xff0c;政府、社区和居民也将共同努力&#xff0c…