控制台绘制登陆框(四) 实现简单的字符输入

一功能说明

1 实现用户名输入框,密码输入框可以输入字符,删除字符,通过按下左右键移动光标,输入的字符不能超过20个字符
2 实现简单的登陆验证:当用户将光标切换到login按钮上时,按下回车键可以验证用户输入的用户名密码是否正确

二 效果展示



三代码
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <windows.h>
#define KEY_TAB 9
#define BACKGROUND_BlACK 0
#define FOREGROUND_BLACK 0
#define BACKGROUND_WHITE 255
#define KEY_DELETE  224+83
#define KEY_UP      224+72
#define KEY_LEFT      224+75
#define KEY_DOWN      224+80
#define KEY_RIGHT     224+77
#define KEY_BACKSPACE  8
#define KEY_ENTER 13
using namespace std;
typedef struct myinput{
	int height;
	int width;
	int bgColor;
	int fgColor;
	int startPosY;
	int startPosX;
	int curPosY;//当前字符所在的行
	int curPoxX;//当前字符所在的列
	string str; //输入的字符
}MYINPUT;


typedef struct mybutton{
	int height;
	int width;
	int bgColor;
	int fgColor;
	int startPosY;
	int startPosX;
	string str;
}MYBUTTON;
/**
function: 将字符输出到缓冲区
@param
ch:        要输入的字符
posLine :   字符所在行的位置
posColumn:  字符所在列的位置
charInfoAarray:缓冲区数组的内容
**/
void WriteCharToBuffer(CHAR_INFO ch, int posLine, int posColumn, CHAR_INFO * charInfoAarray)
{
	charInfoAarray[posLine * 80 + posColumn] = ch;
}
/***
function:将缓冲区的字符输出到控制台
@param
startPosRow:显示区域起始点的行号
startPosColumn:显示区域起始点的列号
height:显示区域高
width:显示区域宽
charInfoAarray:缓冲区数组的内容
***/
void OutPutToConsole(int startPosRow, int startPosColumn, int height, int width, CHAR_INFO * charInfoAarray)
{
	HANDLE hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
	COORD dwBufferSize = { 80, 25 };//固定值(控制台窗口固定的属性值)
	COORD dwBufferCoord = { startPosColumn, startPosRow };//缓冲区左上角的起始位置
	SMALL_RECT rect = { startPosColumn, startPosRow, startPosColumn + width - 1, startPosRow + height - 1 };//显示多大的缓冲区:
	WriteConsoleOutput(hConsoleOutput, charInfoAarray, dwBufferSize, dwBufferCoord, &rect);
}


/**
function :在控制台输出文本
@param
text:要输出的文本
row:输出文本的行数
column:输出文本的列数
startPosRow: 第一个字符所在行数
startPosColumn: 第一个字符所在列数
bgColor: 背景色
fgColor;前景色


**/
void drawText(string text, int row, int column, int startPosRow, int startPosColumn, int bgColor, int fgColor)
{
	int  i = 0;
	CHAR_INFO CharInfo;
	CharInfo.Attributes = bgColor | fgColor;
	CHAR_INFO  charInfoArray[80 * 25];
	for (i = 0; i < text.length(); i++)
	{
		CharInfo.Char.AsciiChar = text[i];
		WriteCharToBuffer(CharInfo, startPosRow, startPosColumn + i, charInfoArray);
	}
	OutPutToConsole(startPosRow, startPosColumn, row, column, charInfoArray);
}
/**
function 画矩形
@param
height:矩形的高
width:矩形的宽
startPosRow:矩形左上角纵坐标的位置
startPosColumn:矩形左上角横坐标的位置
bgColor:背景色
fgColor:前景色
**/
void drawRect(int height, int width, int leftPosY, int leftPosX, int bgColor, int fgColor)
{
	int  i = 0, j = 0;
	CHAR_INFO CharInfo;
	CharInfo.Attributes = bgColor | fgColor;
	CHAR_INFO  charInfoAarray[80 * 25];
	for (i = leftPosY; i < leftPosY + height; i++)
	{
		for (j = leftPosX; j < leftPosX + width; j++)
		{
			CharInfo.Char.AsciiChar = ' ';
			WriteCharToBuffer(CharInfo, i, j, charInfoAarray);
		}


	}


	OutPutToConsole(leftPosY, leftPosX, height, width, charInfoAarray);
}


/**
隐藏光标
**/
void HideCursor()
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO CursorInfo;
	GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息
	CursorInfo.bVisible = false; //隐藏控制台光标
	SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态
}


/**
显示光标
**/
void ShowCursor()
{
	HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
	CONSOLE_CURSOR_INFO CursorInfo;
	GetConsoleCursorInfo(handle, &CursorInfo);//获取控制台光标信息
	CursorInfo.bVisible = true; //隐藏控制台光标
	SetConsoleCursorInfo(handle, &CursorInfo);//设置控制台光标状态
}


/**
输入字符
@param
InputControl:输入控件的指针
ch :输入的字符


**/
void InputChar(MYINPUT * InputControl, char ch)
{
	InputControl->str.insert(InputControl->str.begin() + (InputControl->curPoxX - InputControl->startPosX), ch);
	COORD cursorPos = { 0, 0 };//光标所在的位置
	drawText(InputControl->str, InputControl->height, InputControl->str.length(), InputControl->startPosY, InputControl->startPosX, BACKGROUND_BlACK, FOREGROUND_RED);
	InputControl->curPoxX = InputControl->curPoxX + 1;
	cursorPos = { InputControl->curPoxX, InputControl->curPosY };
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPos);
}
/**
function:删除字符
**/
void DelChar(MYINPUT * InputControl)
{
	COORD cursorPos = { 0, 0 };//光标所在的位置
	InputControl->str.erase(InputControl->str.begin() + (InputControl->curPoxX - InputControl->startPosX - 1), InputControl->str.begin() + (InputControl->curPoxX - InputControl->startPosX));
	drawText(InputControl->str, InputControl->height, InputControl->str.length(), InputControl->startPosY, InputControl->startPosX, BACKGROUND_BlACK, FOREGROUND_RED);
	InputControl->curPoxX = InputControl->curPoxX - 1;
	cursorPos = { InputControl->curPoxX, InputControl->curPosY };
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPos);
}
/**
function:登陆验证
**/
void login(MYINPUT * USERNAME, MYINPUT * PASSWORD)
{
	if (!USERNAME->str.compare("test") && !PASSWORD->str.compare("123456"))
	{
		system("cls");
		drawText("login success!", 1, 14, 11, 25, FOREGROUND_RED, BACKGROUND_BlACK);//在指定位置输入PASSWORD字符串
	}
	else
	{
		system("cls");
		drawText("usrname or password is error!", 1, 29, 11, 25, FOREGROUND_RED, BACKGROUND_BlACK);//在指定位置输入PASSWORD字符串
	}
}
void main()
{




	string strUserName = "USERNAME";
	string strPassword = "PASSWORD";
	COORD cursorPos = { 0, 0 };//光标所在的位置
	int key = 0;//接收键盘输入
	int i = 1;
	MYINPUT InputUserName;
	MYINPUT InputPassWord;
	MYBUTTON btnLogin;
	drawText(strUserName, 1, 8, 9, 25, FOREGROUND_RED, BACKGROUND_BlACK);//在指定位置输入USERNAME字符串
	drawText(strPassword, 1, 8, 11, 25, FOREGROUND_RED, BACKGROUND_BlACK);//在指定位置输入PASSWORD字符串


	InputUserName.height = 1;
	InputUserName.width = 20;
	InputUserName.bgColor = BACKGROUND_WHITE;
	InputUserName.fgColor = FOREGROUND_RED;
	InputUserName.startPosX = 35;
	InputUserName.startPosY = 9;
	InputUserName.curPosY = InputUserName.startPosY;
	InputUserName.curPoxX = InputUserName.startPosX;
	drawRect(InputUserName.height, InputUserName.width, InputUserName.startPosY, InputUserName.startPosX, InputUserName.bgColor, InputUserName.fgColor);


	InputPassWord.height = 1;
	InputPassWord.width = 20;
	InputPassWord.bgColor = BACKGROUND_WHITE;
	InputPassWord.fgColor = FOREGROUND_RED;
	InputPassWord.startPosX = 35;
	InputPassWord.startPosY = 11;
	InputPassWord.curPosY = InputPassWord.startPosY;
	InputPassWord.curPoxX = InputPassWord.startPosX;
	drawRect(InputPassWord.height, InputPassWord.width, InputPassWord.startPosY, InputPassWord.startPosX, InputPassWord.bgColor, InputPassWord.fgColor);


	btnLogin.str = "LOGIN";
	btnLogin.bgColor = BACKGROUND_GREEN;
	btnLogin.fgColor = FOREGROUND_RED;
	btnLogin.height = 3;
	btnLogin.width = 10;
	btnLogin.startPosX = 35;
	btnLogin.startPosY = 14;
	drawRect(btnLogin.height, btnLogin.width, btnLogin.startPosY, btnLogin.startPosX, btnLogin.bgColor, btnLogin.fgColor);
	drawText(btnLogin.str, btnLogin.height / 2, btnLogin.str.length(), btnLogin.startPosY + (btnLogin.height / 2), btnLogin.startPosX + (btnLogin.width - btnLogin.str.length()) / 2, btnLogin.bgColor, btnLogin.fgColor);//在指定位置输入LOGIN字符串


	cursorPos = { InputUserName.startPosX, InputUserName.startPosY };
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPos);



	while (1)
	{
		key = _getch();
		if (key == 224)
		{
			key = key + _getch();
		}
		else if (key == 0)
		{
			key = 1000 + _getch();
		}
		switch (key)
		{
		case KEY_TAB:

			i = i + 1;
			if (i % 3 == 1)
			{
				//绘制button按钮,改变颜色
				btnLogin.bgColor = BACKGROUND_GREEN;
				drawRect(btnLogin.height, btnLogin.width, btnLogin.startPosY, btnLogin.startPosX, btnLogin.bgColor, btnLogin.fgColor);
				drawText(btnLogin.str, btnLogin.height / 2, btnLogin.str.length(), btnLogin.startPosY + (btnLogin.height / 2), btnLogin.startPosX + (btnLogin.width - btnLogin.str.length()) / 2, btnLogin.bgColor, btnLogin.fgColor);//在指定位置输入LOGIN字符串

				ShowCursor();
				cursorPos = { InputUserName.startPosX, InputUserName.startPosY };
				SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPos);

				//i = i + 1;

			}
			else if (i % 3 == 2)
			{
				cursorPos = { InputPassWord.startPosX, InputPassWord.startPosY };
				SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPos);
				//i = i + 1;
			}
			else if (i % 3 == 0)
			{
				cursorPos = { btnLogin.startPosX, btnLogin.startPosY };
				SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPos);
				//i = 0;
				HideCursor();
				//绘制button按钮,改变颜色
				btnLogin.bgColor = BACKGROUND_BLUE;
				drawRect(btnLogin.height, btnLogin.width, btnLogin.startPosY, btnLogin.startPosX, btnLogin.bgColor, btnLogin.fgColor);
				drawText(btnLogin.str, btnLogin.height / 2, btnLogin.str.length(), btnLogin.startPosY + (btnLogin.height / 2), btnLogin.startPosX + (btnLogin.width - btnLogin.str.length()) / 2, btnLogin.bgColor, btnLogin.fgColor);//在指定位置输入LOGIN字符串
			}
			break;
		case KEY_LEFT:
			if (i % 3 == 1)
			{
				InputUserName.curPoxX = InputUserName.curPoxX - 1;
				cursorPos = { InputUserName.curPoxX, InputUserName.curPosY };
				SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPos);
			}
			else if (i % 3 == 2)
			{
				InputPassWord.curPoxX = InputPassWord.curPoxX - 1;
				cursorPos = { InputPassWord.curPoxX, InputPassWord.curPosY };
				SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPos);
			}
			else if (i % 3 == 0)
			{
			}
			break;
		case KEY_RIGHT:
			if (i % 3 == 1)
			{
				InputUserName.curPoxX = InputUserName.curPoxX + 1;
				cursorPos = { InputUserName.curPoxX, InputUserName.curPosY };
				SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPos);
			}
			else if (i % 3 == 2)
			{
				InputPassWord.curPoxX = InputPassWord.curPoxX + 1;
				cursorPos = { InputPassWord.curPoxX, InputPassWord.curPosY };
				SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPos);
			}
			else if (i % 3 == 0)
			{
			}
			break;
		case KEY_BACKSPACE:
			if (i % 3 == 1)
			{
				if (InputUserName.str.length() > 0)//没有输入字符则无法删除
				{
					drawRect(InputUserName.height, InputUserName.width, InputUserName.startPosY, InputUserName.startPosX, InputUserName.bgColor, InputUserName.fgColor);
					DelChar(&InputUserName);
				}
			}
			else if (i % 3 == 2)
			{
				if (InputPassWord.str.length() > 0)//没有输入字符则无法删除
				{
					drawRect(InputPassWord.height, InputPassWord.width, InputPassWord.startPosY, InputPassWord.startPosX, InputPassWord.bgColor, InputPassWord.fgColor);
					DelChar(&InputPassWord);
				}

			}
			else if (i % 3 == 0)
			{
			}
			else
			{


			}
			break;
		case KEY_UP:
			i = i + 2;
			if (i % 3 == 1)
			{
				cursorPos = { InputUserName.startPosX, InputUserName.startPosY };
				SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPos);
			}
			else if (i % 3 == 2)
			{
				//绘制button按钮,改变颜色
				btnLogin.bgColor = BACKGROUND_GREEN;
				drawRect(btnLogin.height, btnLogin.width, btnLogin.startPosY, btnLogin.startPosX, btnLogin.bgColor, btnLogin.fgColor);
				drawText(btnLogin.str, btnLogin.height / 2, btnLogin.str.length(), btnLogin.startPosY + (btnLogin.height / 2), btnLogin.startPosX + (btnLogin.width - btnLogin.str.length()) / 2, btnLogin.bgColor, btnLogin.fgColor);//在指定位置输入LOGIN字符串


				ShowCursor();


				cursorPos = { InputPassWord.startPosX, InputPassWord.startPosY };
				SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPos);
			}
			else if (i % 3 == 0)
			{
				cursorPos = { btnLogin.startPosX, btnLogin.startPosY };
				SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPos);
				//i = 0;
				HideCursor();
				//绘制button按钮,改变颜色
				btnLogin.bgColor = BACKGROUND_BLUE;
				drawRect(btnLogin.height, btnLogin.width, btnLogin.startPosY, btnLogin.startPosX, btnLogin.bgColor, btnLogin.fgColor);
				drawText(btnLogin.str, btnLogin.height / 2, btnLogin.str.length(), btnLogin.startPosY + (btnLogin.height / 2), btnLogin.startPosX + (btnLogin.width - btnLogin.str.length()) / 2, btnLogin.bgColor, btnLogin.fgColor);//在指定位置输入LOGIN字符串
			}
			else
			{


			}
			break;
		case KEY_DOWN://相当于TAB切换
			i = i + 1;
			if (i % 3 == 1)
			{
				//绘制button按钮,改变颜色
				btnLogin.bgColor = BACKGROUND_GREEN;
				drawRect(btnLogin.height, btnLogin.width, btnLogin.startPosY, btnLogin.startPosX, btnLogin.bgColor, btnLogin.fgColor);
				drawText(btnLogin.str, btnLogin.height / 2, btnLogin.str.length(), btnLogin.startPosY + (btnLogin.height / 2), btnLogin.startPosX + (btnLogin.width - btnLogin.str.length()) / 2, btnLogin.bgColor, btnLogin.fgColor);//在指定位置输入LOGIN字符串


				ShowCursor();
				cursorPos = { InputUserName.startPosX, InputUserName.startPosY };
				SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPos);
			}
			else if (i % 3 == 2)
			{
				cursorPos = { InputPassWord.startPosX, InputPassWord.startPosY };
				SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPos);
			}
			else if (i % 3 == 0)
			{
				cursorPos = { btnLogin.startPosX, btnLogin.startPosY };
				SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), cursorPos);
				//i = 0;
				HideCursor();
				//绘制button按钮,改变颜色
				btnLogin.bgColor = BACKGROUND_BLUE;
				drawRect(btnLogin.height, btnLogin.width, btnLogin.startPosY, btnLogin.startPosX, btnLogin.bgColor, btnLogin.fgColor);
				drawText(btnLogin.str, btnLogin.height / 2, btnLogin.str.length(), btnLogin.startPosY + (btnLogin.height / 2), btnLogin.startPosX + (btnLogin.width - btnLogin.str.length()) / 2, btnLogin.bgColor, btnLogin.fgColor);//在指定位置输入LOGIN字符串
			}
			else
			{


			}
			break;
		case KEY_ENTER:
			if (i % 3 == 0)//如果是登陆按钮则响应回车键
			{
				login(&InputUserName, &InputPassWord);
			}
			break;
		default:

			if (i % 3 == 1)
			{
				if (InputUserName.str.length() < 20)
				{
					InputChar(&InputUserName, key);
				}

			}
			else if (i % 3 == 2)
			{
				if (InputUserName.str.length() < 20)
				{
					InputChar(&InputPassWord, key);
				}

			}
			else if (i % 3 == 0)
			{
			}
			break;
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值