闲来无聊,写了一个小时候看到其他软件经常出现的字符界面。
实现了一定的通用性,字体居中等等;逻辑上没什么难度,本来是C语言写的,由于太过无聊,又改成C++了
#include<iostream>
#include<windows.h>
#include<String.h>
#include<time.h>
#pragma comment(lib,"user32.lib")
using namespace std;
class UI{
void Pos(int x,int y);
public:
void setTime();
void surface(int x,int y,int start_x ,int start_y,WORD color);
void Information(int x,int y,string str,string author,string data,int start_x,int start_y,WORD color);
};
void UI::Pos(int x, int y){
COORD pos;
HANDLE hOutput;
pos.X = x;
pos.Y = y;
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput, pos);
}
void UI::surface(int x,int y,int start_x =0,int start_y =0,WORD color=FOREGROUND_RED){
CONSOLE_SCREEN_BUFFER_INFO csbi;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hConsole, &csbi);
start_x+=csbi.dwCursorPosition.X;
start_y+=csbi.dwCursorPosition.Y;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
int sign_y = 0;
Pos(start_x,start_y+sign_y);//start
for(int i =0 ; i < x+2 ; i++){
cout << "|";
}
sign_y++;
for(int j=start_y+sign_y;j<y+start_y;j++){
Pos(start_x,j);
cout << "||";
Pos(x+start_x,j);
cout << "||";
}
sign_y+=y;
Pos(start_x,start_y+sign_y-1);
for(int i =0 ; i <= x+1 ; i++){
cout << "|";
}
sign_y++;
Pos(start_x,start_y+sign_y);
}
void UI::Information(int x,int y,string str,string author="",string data="",int start_x=0,int start_y=0,WORD color=FOREGROUND_GREEN){
CONSOLE_SCREEN_BUFFER_INFO csbi;
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleScreenBufferInfo(hConsole, &csbi);
start_x+=csbi.dwCursorPosition.X;
start_y+=csbi.dwCursorPosition.Y;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color);
int sign_y = 0;
Pos(start_x,start_y+sign_y);//start
for(int i =0 ; i < x+2 ; i++){
cout << "|";
}
sign_y++;
for(int k=0;k<3;k++){
Pos(start_x,start_y+k+sign_y);
cout << "||";
Pos(start_x+x,start_y+k+sign_y);
cout << "||";
}
sign_y+=3;
if((x-str.length())/2<0||(x-str.length())/2>x/2){
str = "错误!字符长度过长!";
}
Pos(x/2-(str.length()/2),start_y+2);
cout << str;
Pos(start_x,start_y+sign_y);
for(int i =0 ; i < x+2 ; i++){
cout << "|";
}
sign_y++;
for(int k=0;k<3;k++){
Pos(start_x,start_y+k+sign_y);
cout << "||";
Pos(start_x+x,start_y+k+sign_y);
cout << "||";
}
sign_y++;
Pos(start_x+x-6-author.length(),start_y+sign_y);//署名
cout << "作者:" << author;
sign_y++;
Pos(start_x+x-13-author.length(),start_y+sign_y);//日期
cout << "日期:" << data ;
sign_y++;
Pos(start_x,start_y+sign_y);
for(int i =0 ; i < x+2 ; i++){
cout << "|";
}
sign_y++;
Pos(start_x,start_y+sign_y);
}
void UI::setTime(){
time_t now;
struct tm *tm_now;
time(&now);
tm_now = localtime(&now);
Pos(90,20);
cout <<tm_now->tm_year+1900 << "年" << tm_now->tm_mon+1 << "月" << tm_now->tm_mday << "日" ;
Pos(92,21);
cout << tm_now->tm_hour<< "时" << tm_now->tm_min << "分" << tm_now->tm_sec << "秒";
Pos(90,30);
}
int main(){
SetConsoleTitle("测试程序");
UI ui;
ui.Information(80,30,"爱我中华","拉阿鲁","2018年7月30日");
ui.surface(80,30,0,0);
while(true){
ui.setTime();
Sleep(1000);
}
return 0;
}