C++ 设置控制台文本属性画一个DOS时代的字符窗口

简介: C++ 设置控制台文本属性画一个DOS时代的字符窗口

<windows.h>库函数:SetConsoleCursorPosition() 设置控制台光标位置;SetConsoleTextAttribute() 设置控制台文本属性,主要用它来设置颜色。用这两个函数在控制台屏幕上画2个在DOS时代可算得上比较洋气的字符窗口 ^_^


#include <iostream>
#include <windows.h> 
using namespace std;
struct winRect {
   LONG left=0; 
   LONG top=0; 
   LONG width=30;
   LONG height=3;
   SHORT foreColor=14;
   SHORT bgColor=1;
   string sTitle="";
};
void gotoXY(short x, short y)
{ //设置光标位置,坐标从左上角(0,0)起始
    COORD position = {x, y};
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(hConsole, position);
}
void setColor(unsigned short foreColor=7,unsigned short bgColor=0) 
{ //设置输出文本的前景色和背景色 
  HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    foreColor%=16; bgColor%=16;
  SetConsoleTextAttribute(hConsole,foreColor|bgColor*16);
}
string rept(string s, int i) 
{ 
  string t="";
  for(int j=0;j<i;j++) t+=s;
  return t;
}
int paintWin(winRect w)
{
  int top,bottom,x=w.left,y=w.top;
  bool bT=(w.sTitle!="");
  bottom=w.top+w.height;
  setColor(w.foreColor,w.bgColor);
  string a="━",b=" ";
  w.height=w.height>2?w.height:3;
  w.height=bT?w.height+2:w.height;
  w.width=w.width>5?w.width:6;
  w.width=w.width%2==1?w.width+1:w.width;
  top=y;
  gotoXY(x,y++);
  cout<<"┏"<<rept(a,w.width/2-2)<<"┓";
  for (int i=0;i<w.height-2;i++){
    gotoXY(x,y++);
    cout<<"┃"<<rept(b,w.width-4)<<"┃";    
  }
  gotoXY(x,y++);  
  cout<<"┗"<<rept(a,w.width/2-2)<<"┛";
  bottom=y;
  gotoXY(x+2,top+1);
  if (bT) {
    gotoXY(x,w.top+2);  
    cout<<"┣"<<rept(a,w.width/2-2)<<"┫";
    gotoXY(x+2,w.top+1);
    cout<<w.sTitle.substr(0,w.width-4); 
    gotoXY(x+2,top+3);
  }
  return bottom;
}
int main(void)
{
  int ymax;
  char s[20];
  char t[]="字符窗口测试";
  SetConsoleTitle(t);
  winRect w;
  w.bgColor = 3;
  w.foreColor = 11;
  w.width = 20;
  w.height = 6; 
  ymax=paintWin(w);
  cout<<"hello, window!";
  winRect win;
  win.left = 24;
  win.top = 10;
  win.sTitle = "标题:123456789012345678901234567890"; //如标题太长,随窗口宽度截短 
  ymax=paintWin(win);
  cout<<"abcdefghijklmnopqrstuvwxyz"; //正文长度未作处理,要注意不能超过 窗口宽度-4 
  setColor();
  gotoXY(0,ymax);
  return 0;
}



执行结果如下:

20210201211915213.png


目录
相关文章
如何设置控制台由底部展示改为右侧位置
这篇文章介绍了如何在Sublime Text编辑器中将控制台从底部展示改为右侧位置,通过使用Package Control来安装相关的插件来实现界面布局的调整。
|
传感器 算法 C++
C++ PCL 设置法向量的方向
C++ PCL 设置法向量的方向
387 0
|
编译器 C++
VS Code设置C++编译器路径
VS Code设置C++编译器路径
1097 0
|
定位技术 C++ Windows
第一人称射击游戏 C++控制台版(未完成)
第一人称射击游戏 C++控制台版(未完成)
242 0
第一人称射击游戏 C++控制台版(未完成)
|
Linux UED iOS开发
Python colorama 设置控制台、命令行输出彩色文字
Python colorama 设置控制台、命令行输出彩色文字
312 0
|
程序员 API 对象存储
技术心得记录:控制台——对窗口句柄的操作
技术心得记录:控制台——对窗口句柄的操作
252 0
|
网络安全
阿里云8888端口设置安全组,宝塔控制台显示链接失败
阿里云8888端口设置安全组,宝塔控制台显示链接失败
195 0
俄罗斯方块 C++控制台版
俄罗斯方块 C++控制台版
280 0
java实战项目超市管理系统控制台版
java实战项目超市管理系统控制台版
252 0
|
Java
【Java开发指南 | 第二十篇】Java流之控制台
【Java开发指南 | 第二十篇】Java流之控制台
280 2