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来安装相关的插件来实现界面布局的调整。
|
Java
问题2:IDEA控制台输出中文乱码以及出现错误(编码 GBK 的不可映射字符 (0xB0))的解决办法
问题2:IDEA控制台输出中文乱码以及出现错误(编码 GBK 的不可映射字符 (0xB0))的解决办法
1996 4
|
编译器 C++ 开发者
C++一分钟之-属性(attributes)与属性语法
【7月更文挑战第3天】C++的属性(attributes)自C++11起允许附加编译器指令,如`[[nodiscard]]`和`[[maybe_unused]]`,影响优化和警告。注意属性放置、兼容性和适度使用,以确保代码清晰和可移植。示例展示了如何使用属性来提示编译器处理返回值和未使用变量,以及利用编译器扩展进行自动清理。属性是提升代码质量的工具,但应谨慎使用。
413 13
|
编译器 程序员 C++
C++一分钟之-属性(attributed)与属性语法
【6月更文挑战第28天】C++的属性为代码添加元数据,帮助编译器理解意图。C++11引入属性语法`[[attribute]]`,但支持取决于编译器。常见属性如`nodiscard`提示检查返回值,`maybe_unused`防止未使用警告。问题包括兼容性、过度依赖和误用。使用属性时需谨慎,确保团队共识,适时更新以适应C++新特性。通过示例展示了`nodiscard`和`likely/unlikely`的用法,强调正确使用属性能提升代码质量和性能。
270 13
|
安全 编译器 C++
C++一分钟之-C++中的属性命名空间
【7月更文挑战第22天】C++11引入属性作为元数据,虽无内置属性命名空间,但可通过自定义属性与命名空间组合实现类似效果。例如,创建`perf`命名空间存放`slow`和`fast`属性来标记函数性能。正确使用属性需注意位置、避免重复和确保与实现一致,以提升代码可读性和编译器理解。通过模拟属性命名空间,可以更有效地管理和使用属性。
150 1
|
编译器 数据安全/隐私保护 C++
C++一分钟之-属性友元与访问控制
【7月更文挑战第9天】C++中的友元机制允许非成员函数或类访问私有和保护成员,打破了封装性。友元需在类内声明,常见的错误包括忘记声明、过度使用及误解友元的非继承性。要避免错误,应明确声明友元,限制其使用,并理解其局限。示例展示了如何声明和使用友元函数来访问私有数据。谨慎使用友元以保持代码的健壮性和可维护性。
206 1
|
Linux UED iOS开发
Python colorama 设置控制台、命令行输出彩色文字
Python colorama 设置控制台、命令行输出彩色文字
215 0
|
定位技术 C++ Windows
第一人称射击游戏 C++控制台版(未完成)
第一人称射击游戏 C++控制台版(未完成)
173 0
第一人称射击游戏 C++控制台版(未完成)
|
C++
C++程序中的派生类成员访问属性
C++程序中的派生类成员访问属性
197 1
|
程序员 API 对象存储
技术心得记录:控制台——对窗口句柄的操作
技术心得记录:控制台——对窗口句柄的操作
158 0