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

来源:互联网 发布:淘宝怎样报名天天特价 编辑:程序博客网 时间:2024/06/04 19:53

一功能说明

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 13using 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: 将字符输出到缓冲区@paramch:        要输入的字符posLine :   字符所在行的位置posColumn:  字符所在列的位置charInfoAarray:缓冲区数组的内容**/void WriteCharToBuffer(CHAR_INFO ch, int posLine, int posColumn, CHAR_INFO * charInfoAarray){charInfoAarray[posLine * 80 + posColumn] = ch;}/***function:将缓冲区的字符输出到控制台@paramstartPosRow:显示区域起始点的行号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 :在控制台输出文本@paramtext:要输出的文本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 画矩形@paramheight:矩形的高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);//设置控制台光标状态}/**输入字符@paramInputControl:输入控件的指针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
原创粉丝点击