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

本文为转载文档,源文档地址: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.  

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值