控制台绘制登陆框(四) 实现简单的字符输入
2017-01-06 17:25
393 查看
一功能说明
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_ c9b4 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; } } }
相关文章推荐
- Java实现在控制台中输入字符
- MyBatis整合spring、spring MVC实现简单登陆,并在控制台添加sql语句打印
- Java从控制台接受输入字符的简单方法
- @V@ java代码笔记2010-06-12:java控制台输入各类型类实现;以及判断输入字符串里面是否有数字的两种方法:方法1:转换成字符数组;方法2:正则表达式。
- 编写了一个服务器端的程序实现在客户端输入字符然后在控制台上显示,直到输入"END"为止,让你写出客户端的程序;
- 基础学习:控制台接收输入字符与重定向输出流实现程序日志两例子的编程
- JS判断非空至少输入两个字符的简单实现方法
- goLang实现一个控制台的输入和输出(最简单的那种)
- js实现一个简单登陆框
- openLaszlo简单登陆窗口实现
- 用Cache简单的实现单点登陆
- 用AJAX实现google输入自动完成的简单模拟
- 用C语言实现简单密码输入(初稿)
- 一个简单的登陆页面实现
- ASP简单实现数字字符混合验证码
- Linux设备驱动程序学习笔记4——简单的字符设备实现
- 简单实现从控制台记录密码的类
- 用AJAX实现google输入自动完成的简单模拟
- asp.net内实现在密码输入框内按回车就登陆的功能
- 用AJAX实现google输入自动完成的简单模拟