控制台界面控制(六):边框

news/2024/7/7 9:28:07

本文为转载文档,源文档地址:http://blog.csdn.net/bnb45/article/details/7997603

 

 

效果

 

 

[cpp] view plaincopy

  1. #include "MyConsole.h"  
  2. #include <stdio.h>  
  3.   
  4. int main()  
  5. {  
  6.     CMyConsole myConsole;  
  7.   
  8.     SMALL_RECT rc = {5, 5, 20, 20};  
  9.     myConsole.DrawBox(rc);  
  10.   
  11.     system("pause");  
  12.     return 0;  
  13. }  

相关信息

边框并不是用线条画出来的,实际上控制台好像还不能画线条。边框的制作是用字符堆集起来的,有的字符是一条横线,有的是一条折线。把它们按照矩形的顺序摆放,就画出框了。原理有点像下面一幅图(草泥马の鄙视):

┏┛┻━━━━┛┻┓
┃       ┃
┃    ━   ┃
┃ ┳┛  ┗┳   ┃
┃       ┃
┃    ┻      ┃
┃       ┃
┗━┓   ┏━┛
  ┃   ┃
  ┃   ┃
  ┃   ┗━━━━┓
  ┃          ┣┓
  ┃             ┏┛
  ┗━┓┓┏━━┳┓┏━┛
       ┃┫┫     ┃┫┫
    ┗┻┛     ┗┻┛

千里马常有,而伯乐不常有,因而伯乐相比千里马更为珍贵(扯远了Orz)。线条状的字符不是都可以找得到,用得出来。在Unicode编码下,我就不知道哪个字符编码代表线条,就算是使用ASCII有时候也无法正常显示。其原因在于,为了扩展原本短小精悍的字符集,微软使用了代码页。不同代码页可以显示各种字符(同时也意味着不能显示各种字符),比如使用437 DOS不能显示中文;而使用936简体中文则无法画出边框。控制台设置代码页的函数是:SetConsoleOutputCP。

 

代码页(Code page)说明
1258越南文
1257波罗的海文
1256阿拉伯文
1255希伯来文
1254土耳其语
1253希腊文
1252拉丁文(ANSI)
1251斯拉夫文
1250中欧文
950繁体中文
949韩文
936简体中文
932日文
874泰文
850使用多种语言(MS-DOS拉丁文)
437MS-DOS美语/英语

 

画边框函数

 

[cpp] view plaincopy

  1. // ---- 画边框 ---- 第二个参数为true,则画双线边框  
  2. void CMyConsole::DrawBox(SMALL_RECT rc, bool bDouble)  
  3. {  
  4.     char    chBox[6];               // 边框线字符  
  5.     COORD   pos;  
  6.   
  7.     // -- 设置代码页 -- 在437代码页中,以下字符编码才会代表线条字符  
  8.     SetConsoleOutputCP(437);  
  9.   
  10.     if (bDouble)        // 双线的字符  
  11.     {  
  12.         chBox[0] = (char)0xc9;      // 左上角点  
  13.         chBox[1] = (char)0xbb;      // 右上角点  
  14.         chBox[2] = (char)0xc8;      // 左下角点  
  15.         chBox[3] = (char)0xbc;      // 右下角点  
  16.         chBox[4] = (char)0xcd;      // 水平  
  17.         chBox[5] = (char)0xba;      // 坚直  
  18.     }  
  19.     else  
  20.     {  
  21.         chBox[0] = (char)0xda;      // 左上角点  
  22.         chBox[1] = (char)0xbf;      // 右上角点  
  23.         chBox[2] = (char)0xc0;      // 左下角点  
  24.         chBox[3] = (char)0xd9;      // 右下角点  
  25.         chBox[4] = (char)0xc4;      // 水平  
  26.         chBox[5] = (char)0xb3;      // 坚直  
  27.     }  
  28.   
  29.     // -- 画上下边界  
  30.     for (pos.X = rc.Left; pos.X <= rc.Right; ++pos.X)  
  31.     {  
  32.         if (pos.X == rc.Left)  
  33.         {  
  34.             pos.Y = rc.Top;         // 设置坐标 -> 左上角  
  35.   
  36.             // -- 复制一段文本到缓冲区中  
  37.             // @param   HANDLE      [in]  句柄  
  38.             // @param   LPCTSTR     [in]  文本指针  
  39.             // @param   DWORD       [in]  文本的长度  
  40.             // @param   COORD       [in]  开始的坐标  
  41.             // @param   LPDWORD     [out] 接收已写入的字符数量  
  42.             WriteConsoleOutputCharacter(hOut, &chBox[0], 1, pos, NULL);  
  43.   
  44.             pos.Y = rc.Bottom;      // 设置坐标 -> 左下角  
  45.             WriteConsoleOutputCharacter(hOut, &chBox[2], 1, pos, NULL);  
  46.         }  
  47.         else if (pos.X == rc.Right)  
  48.         {  
  49.             pos.Y = rc.Top;         // 设置坐标 -> 右上角  
  50.             WriteConsoleOutputCharacter(hOut, &chBox[1], 1, pos, NULL);  
  51.   
  52.             pos.Y = rc.Bottom;      // 设置坐标 -> 右下角  
  53.             WriteConsoleOutputCharacter(hOut, &chBox[3], 1, pos, NULL);  
  54.         }  
  55.         else  
  56.         {  
  57.             pos.Y = rc.Top;         // 上水平线  
  58.             WriteConsoleOutputCharacter(hOut, &chBox[4], 1, pos, NULL);  
  59.             pos.Y = rc.Bottom;      // 下水平线  
  60.             WriteConsoleOutputCharacter(hOut, &chBox[4], 1, pos, NULL);  
  61.         }  
  62.     }  
  63.   
  64.     // -- 画左右边界  
  65.     for (pos.Y = rc.Top+1; pos.Y < rc.Bottom; ++pos.Y)  
  66.     {  
  67.         pos.X = rc.Left;    // 画左边线条  
  68.         WriteConsoleOutputCharacter(hOut, &chBox[5], 1, pos, NULL);  
  69.         pos.X = rc.Right;   // 画右边线条  
  70.         WriteConsoleOutputCharacter(hOut, &chBox[5], 1, pos, NULL);  
  71.     }  
  72. }  
  73.  

 


http://www.niftyadmin.cn/n/3656341.html

相关文章

控制台界面控制(七):移动文本

本文为转载文档&#xff0c;原文链接&#xff1a;http://blog.csdn.net/bnb45/article/details/8034597 控制文本的移动&#xff0c;可以取代清屏再重绘操作。如果用来做文本编辑器的滚动条是很合适的&#xff0c;也许也可以用在俄罗斯方块上面。控制台使用一个函数把某个区域内…

[winform入门级好书]c# Windows Forms程序设计

书名&#xff1a;c# Windows Forms程序设计作者&#xff1a;Erik Brown[美]译者&#xff1a;朱毓斌、吴飞出版社&#xff1a;清华大学出版社售价&#xff1a;78元个人书评&#xff1a;本书操作步骤详细&#xff0c;完全可以与step by step级的书相媲美&#xff0c;而且涉及了许…

控制台界面控制(八):光标设置

本文为转载文档&#xff0c;源文档链接&#xff1a;http://blog.csdn.net/bnb45/article/details/8034641 光标的作用在于提醒使用者&#xff0c;你的输入将会在这个位置出现。目前对于光标的操作只有一个&#xff0c;移动光标&#xff0c;改变输出的位置。有时候光标在那里一闪…

Python脚本小工具之文件与内容搜索

目录 一、前言 二、代码 三、结果 一、前言 ​日常工作中&#xff0c;经常需要在指定路径下查找指定类型的文件&#xff0c;或者是指定内容的查找&#xff0c;在window环境中&#xff0c;即可以使用一些工具如notepad或everything&#xff0c;也可以使用python脚本。但在l…

[翻译]脚本引擎实现 - 第四部分 符号表和文法树

原文地址&#xff1a;http://www.flipcode.com/articles/scripting_issue04.shtml 作者&#xff1a;Jan Niestadt译者&#xff1a;Tony Qu介绍既然我们在上两部分中做了一些有益的事&#xff0c;我们就需要把我们从程序的数据结构中收集的数据保存起来&#xff0c;这就是我们接…

关于VS2005中的Code Snippets Manager的问题及解决

Code Snippets Manager是VS2005专门用来管理代码块智能感知的工具。然而&#xff0c;使用它并没有预想中的那么顺利&#xff0c;特别是在做过多次目录添加和删除之后&#xff0c;可能出现添加在列表中的目录无法在智能感知列表中显示出来的情况&#xff1b;甚至会出现列表当中明…

控制台界面控制(九):读取键盘操作

本文为转载文档&#xff0c;原文链接为&#xff1a;http://blog.csdn.net/bnb45/article/details/8035346 读取键盘操作指的是&#xff0c;当我们输入什么的时候&#xff0c;控制台可以通过函数截获&#xff0c;这时候可以在里面写下要进行的操作。因为键盘的操作是连续的&…

[翻译]脚本引擎实现 - 第三部分 解析器

原文地址&#xff1a;http://www.flipcode.com/articles/scripting_issue03.shtml 作者&#xff1a;Jan Niestadt译者&#xff1a;Tony Qu介绍第二部分的程序运行得很好&#xff0c;它把程序转换为符号(token)&#xff0c;所有的关键字、操作符、标点符号、标识符和常数都马上被…