注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

gmd20的个人空间

// 编程和生活

 
 
 

日志

 
 

vc编程 控制台里面光标的移动控制和命令提示符下面限制只能输入数字  

2013-03-01 12:40:08|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


#include <stdio.h>
#include <windows.h>

BOOL get_cursor (int &x, int &y)
{
HANDLE hStdout;
CONSOLE_SCREEN_BUFFER_INFO info;
hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if ( hStdout ==INVALID_HANDLE_VALUE) {
return FALSE;
}

if (!GetConsoleScreenBufferInfo (hStdout, &info)) {
return FALSE;
}
x = info.dwCursorPosition.X;
y = info.dwCursorPosition.Y;

return TRUE;
}
BOOL set_cursor (int x, int y)
{
HANDLE hStdout;
COORD coord = {x, y};

hStdout = GetStdHandle(STD_OUTPUT_HANDLE);
if ( hStdout ==INVALID_HANDLE_VALUE) {
return FALSE;
}

return SetConsoleCursorPosition(hStdout, coord);
}

int ReadConsoleNumber
(
HANDLE hConsoleInput,
LPVOID lpBuffer,
DWORD nNumberOfCharsToRead,
LPDWORD lpNumberOfCharsRead,
PCONSOLE_READCONSOLE_CONTROL pInputControl
)
{
char * buf = (char *) lpBuffer;
int len = 0;

int x, y;
get_cursor(x,y);
HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE);

INPUT_RECORD irInBuf[1];
DWORD cNumRead = 0;
DWORD cNumWritten = 0;

while (1) {
ReadConsoleInput(hConsoleInput,irInBuf,1, &cNumRead);

if (cNumRead && irInBuf[0].EventType == KEY_EVENT && irInBuf[0].Event.KeyEvent.bKeyDown == 0 ) {
if (irInBuf[0].Event.KeyEvent.uChar.AsciiChar >='0' &&
irInBuf[0].Event.KeyEvent.uChar.AsciiChar <='9' ) {
buf[len++] = irInBuf[0].Event.KeyEvent.uChar.AsciiChar;
set_cursor(x,y);
WriteConsole(hStdout,buf,len,&cNumWritten,NULL);
COORD coord = {x + len, y};
FillConsoleOutputCharacter(hStdout,' ' , 20,coord, &cNumWritten);
}

if (irInBuf[0].Event.KeyEvent.wVirtualKeyCode == VK_DELETE ||
irInBuf[0].Event.KeyEvent.wVirtualKeyCode == VK_BACK)
{
if (len > 0) {
len--;
}
set_cursor(x,y);
WriteConsole(hStdout,buf,len,&cNumWritten,NULL);
COORD coord = {x + len, y};
FillConsoleOutputCharacter(hStdout,' ' , 20,coord, &cNumWritten);
}

if (irInBuf[0].Event.KeyEvent.wVirtualKeyCode == VK_RETURN ||
irInBuf[0].Event.KeyEvent.wVirtualKeyCode == VK_SPACE) {
buf[len] = '\0';
*lpNumberOfCharsRead = len;
return 1;
}
}
}
return 0;
}


bool input_credit_score ( int & credit, int &score)
{
HANDLE hStdin;
hStdin = GetStdHandle(STD_INPUT_HANDLE);

char buffer[128];
DWORD bufferRead =0;

//SetConsoleMode(hStdin,ENABLE_ECHO_INPUT | ENABLE_LINE_INPUT);
int x,y;
if (!get_cursor(x,y)) {
return false;
}
set_cursor(4, y+1);

ReadConsoleNumber(hStdin,buffer,128, &bufferRead, NULL);
//ReadConsole(hStdin,buffer,128, &bufferRead, NULL);
if (bufferRead) {
credit = atoi(buffer);
FlushConsoleInputBuffer(hStdin);
int x,y;
if (! get_cursor(x,y)) {
return false;
}
//set_cursor(16, y - 1);
set_cursor(16, y);
} else {
return false;
}

ReadConsoleNumber(hStdin,buffer,128, &bufferRead, NULL);
//ReadConsole(hStdin,buffer,128, &bufferRead,NULL);
if (bufferRead) {
score = atoi(buffer);
FlushConsoleInputBuffer(hStdin);
} else {
return false;
}

return true;
}


int main (int, char**)
{
printf("输入学分和成绩\n 学分 成绩\n");
int credit[3],score[3];


for (int i=0; i< 3; i++) {
input_credit_score(credit[i], score[i]);
}

printf ("\n");
for (int i=0; i< 3; i++) {
printf("%d,%d\n", credit[i], score[i]);
}

int ddddddd;
cin >> ddddddd;
cout << ddddddd;
return 0;

}



函数参考 http://msdn.microsoft.com/zh-cn/library/windows/desktop/ms682073(v=vs.85).aspx

ReadConsoleInput  可以直接处理按键和鼠标事件,不过处理起来比较麻烦,ReadConsole高层次一点,会自己处理del等键盘事件,等到enter建才返回值,不用关心字符回显等细节,使用比较方便。
  评论这张
 
阅读(692)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017