Vitacy.Tan'Blog

真正的快乐,来自于内心的平静!

统计

留言簿(1)

常用链接

阅读排行榜

评论排行榜

自己动手制作控制台定位函数

转载:http://topic.csdn.net/t/20061102/23/5129585.html
自己动手制作控制台定位函数  
   
  大家一定都用过TC供给大家的光标定位,创建方框等函数,在我们眼里很神秘,现在我们就自己动手来制作。  
   
  一.   光标定位  
   
  首先我们通过MCDN可以找到这样一个函数SetConsoleCursorPosition(),这个就是VC++提供的光标的定位函数,它的原形为  
   
  BOOL     SetConsoleCursorPosition(  
   
      HANDLE     hConsoleOutput,      
   
  COORD     dwCursorPosition  
   
  );  
   
  BOOL   :是一种类型(Boolean   variable布尔变量),返回‘   真   ’or‘   假   ’;  
   
  HANDLE     hConsoleOutput,     为输出设备的句柄,和int、char一样是一种类型  
   
  COORD     dwCursorPosition,为光标的位置  
   
  接下来我们所要做的就是获得输出设备的句柄和设置光标的位置。  
   
  1.   获得输出设备的句柄  
   
  要获得输出设备的句柄就要用到函数GetStdHandle(),它的原形为:  
   
  HANDLE   GetStdHandle(  
   
      DWORD   nStdHandle       //   input,   output,   or   error   device  
   
  );  
   
  nStdHandle一共有3个值为STD_INPUT_HANDLE     输入设备句柄,   STD_OUTPUT_HANDLE     输出设备句柄,STD_ERROR_HANDLE   错误句柄  
   
  所以我们要获得输出设备的句柄就要先定义个句柄然后将获得的输出设备的句柄赋值给所定义的句柄。如:HANDLE       hCon       =       GetStdHandle(STD_OUTPUT_HANDLE);    
   
  2.   设置光标的位置  
   
  COORD的原形为:  
   
  typedef   struct   _COORD    
   
  {   //   coord.    
   
          SHORT   X;             //   horizontal   coordinate    
   
          SHORT   Y;             //   vertical   coordinate    
   
  }   COORD;  
   
  Typedef的含义就是把一种类型定义成另一种名字  
   
  e.g  
   
  typedef   int   zhengxing;  
   
  zhengxing   nA;   //等同于int   nA;  
   
  从这里大家可以发现COORD为一个结构体类型,他含有X,Y两个元素,所以我们就应该先定义一个COORD的结构体变量,然后对其元素进行赋值就可以完成对光标的设置。  
   
  这样一个完整的光标定位函数我们就可以写出来了。如下:  
   
  void   goxy(int   nX,   int   nY)  
   
  {  
   
          HANDLE       hCon;//定义一个句柄  
   
          hCon   =   GetStdHandle(STD_OUTPUT_HANDLE);       //获得输出设备的句柄  
   
          COORD       setps;   //定义结构体变量  
   
          setps.X   =   nX;        
   
          setps.Y   =   nY;    
   
          SetConsoleCursorPosition(hCon,setps);     //定位  
   
  }  
   
  再调用时,我们只需输入他的坐标就可以进行光标的定位了。  
   
  二.制作方框  
   
  大家现在都可以打印一个任意边长的方框,只是无法将所打印的方框在屏幕的其他地方打印出来,我们现在有了光标的定位函数,只需在打印每个点的时候将光标定位到你想要的地方,就可以实现制作方框了。下面是我写的一个制作方框的函数,大家可以参考下:  
   
  void   frame(int   x,   int   y,   int   width,   int   height)  
   
  {  
   
          for(int   nI   =   0;   nI   <   height;   nI++)     //行数  
   
          {  
   
                  for(int   nJ   =   0;   nJ   <   width*2;   nJ   +=   2)   //列数,width*2中文符号占两位  
   
                  {  
   
                          goxy(x   +   nJ,   y   +   nI);   //调用我们前面的函数进行光标的定位  
   
                          if(nI   ==   0   ||   nJ   ==   width*2   -   2   ||   nJ   ==   0   ||   nI   ==   height   -   1)   //只打印四个边  
   
                          {  
   
                                  if(nI   ==   0   &&   nJ   ==   0   )   //左上的拐角  
   
                                  {  
   
                                          printf("┏");  
   
                                  }  
   
                                  else   if(nI   ==   0   &&   nJ   ==   width   *   2   -   2)  
   
                                  {  
   
                                                  printf("┓");//右上的拐角  
   
                                  }  
   
                                  else   if(nI   ==   height   -   1   &&   nJ   ==   0)  
   
                                  {  
   
                                          printf("┗");//左下的拐角  
   
                                  }  
   
                                  else   if(nI   ==   height   -   1   &&   nJ   ==   width*2   -   2)  
   
                                  {  
   
                                          printf("┛");//右下的拐角  
   
                                  }  
   
                                  else   if(nI   ==   0   ||   nI   ==   height   -   1)  
   
                                  {  
   
                                          printf("━");        
   
                                  }  
   
                                  else  
   
                                  {  
   
                                          printf("┃");  
   
                                  }  
   
                          }  
   
                  }  
   
                  printf("\n");  
   
          }  
   
  }  
   
  如果大家还想在方框上打印出标题,只需要在方框打印结束后,调用光标定位,定位到适当的位置进行打印,将两个函数封装成一个函数就可以实现了。我们还可以通过函数的重载实现输入不同的参数打印不同的方框,如方框的颜色,文本的颜色等等;  
   
     
   
  三.其他的设置  
   
  1.文本颜色  
   
  函数的原形  
   
  BOOL   SetConsoleTextAttribute(  
   
      HANDLE   hConsoleOutput,     //   控制台的句柄  
   
      WORD   wAttributes                 //文本和背景的颜色(0--15)  
   
  );  
   
     
   
  e.g  
   
  HANDLE       hCon       =       GetStdHandle(STD_OUTPUT_HANDLE);  
   
  SetConsoleTextAttribute(hCon,       10);设置成绿色,一共有0--15种颜色  
   
     
   
  2.   执行清屏命令  
   
  这个函数比起书上的用空格来清除方框内容的方法要简单多了  
   
  BOOL   FillConsoleOutputCharacter(  
   
      HANDLE   hConsoleOutput,     //   handle   to   screen   buffer  
   
      TCHAR   cCharacter,               //   character   to   write   要写入的字符  
   
      DWORD   nLength,                     //   number   of   character   cells   to   write   to写入多少个单元  
   
      COORD   dwWriteCoord,           //   x-   and   y-coordinates   of   first   cell   起始的单元  
   
      LPDWORD   lpNumberOfCharsWritten    
   
                                                      //   pointer   to   number   of   cells   written   to  
   
  );  
   
     
   
  e.g  
   
  DWORD       nBytesWrite;    
   
  CONSOLE_SCREEN_BUFFER_INFO       ConInfo;       //定义一个控制台的信息变量  
   
  HANDLE       hCon       =       GetStdHandle(STD_OUTPUT_HANDLE);   //获得输出设备的句柄  
   
  GetConsoleScreenBufferInfo(hCon,       &       ConInfo);//获得控制台的信息  
   
  CurPos.X       =       ConInfo.srWindow.Left;     //屏幕最左边的X坐标  
   
  CurPos.Y       =       ConInfo.srWindow.Top;     //屏幕最上边的Y坐标  
   
  FillConsoleOutputCharacter(hCon,   0x20,   ConInfo.dwSize.X*ConInfo.dwSize.Y,   CurPos,   &   nBytesWrite);    
   
  0x20为空格,为16进制的ASC码值,ConInfo.dwSize.X*ConInfo.dwSize.Y为清除的范围  
   
  四.总结  
   
  对于控制台的设置还有很多,比如控制台的标题设置等等,在MSDN上都有很详细的说明。通过以上的介绍大家都可以做出自己的光标定位函数,在自己的设计中应用。别人能写出来的,我们一样能做出来,就向我们经常听到的那样“没有做不出来的,只有想不到的”   
   

posted on 2007-07-04 21:35 Vitacy.Tan 阅读(339) 评论(0)  编辑 收藏 引用


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理