C++控制台界面库_实例1: 写日记

日记用txt文件保存。

示例代码:

// shili2.cpp : 定义控制台应用程序的入口点。
//

#include “stdafx.h”
#include “console.h”
#pragma comment(lib,“console.lib”)
#include <direct.h>
#include <io.h>
#include <time.h>

#include
using namespace std;

int circulation=1;
int interface_num=0;

char aircraft_name[20];
int aircraft_initial_year;
#define WRITE 0
#define LOOK 1
int State=10;
char *data_path=“D:\MyLog”;

void Initial(); // 0
void MainInterface(); // 1
void Answer(); // 2

bool Leap_year(int year);
void Cut_apart(const char *result0,int *year,int *month,int *day);
int Valid(int year,int month,int day);

extern COORD mouse;

int main()
{
Screen screen;
screen.SetTitle(“示例2”);
screen.ShowOrHideCursor(0);

Event event;
event.AddMouseMode();

Initial();

while(circulation)
{
    screen.Clear_screen();

	switch(interface_num)
	{
	case 0:
		MainInterface();
		break;		
	case 1:		
		Answer();
		break;		      
	}
} 

event.RestoreMode();
//screen.Pause();
screen.Close_handle();
return 0;

}

void Initial()
{
Screen screen;
screen.SetSize(80,25);
screen.SetTitle(“日记”);

//生成数据文件
	
_mkdir(data_path);

File file;
file.HideFileOrFolder(data_path);

_chdir(data_path);

FILE *fp;
char *plane_name="作者姓名.txt";

if(_access(plane_name,0)==-1)
{		
	screen.MoveCursorTo(12,10);
	screen.Write("请输入作者姓名:");
	Textbox textbox1=Textbox(27,10,20);
    char *name=textbox1.InputString(true);

	screen.MoveCursorTo(12,11);
	screen.Write("请输入初始年份:");
	Textbox textbox2=Textbox(27,11,10);
	char *initial_y=textbox2.InputString(true);

	fopen_s(&fp,plane_name,"w");
	fprintf(fp,"%s %s\n",name,initial_y);
	fclose(fp);
}

if(_access("pass.dat",0)==-1)
{		
	screen.MoveCursorTo(12,13);
	screen.Write("请设置密码:");
	Textbox textbox1=Textbox(27,13,20);
    char *pass=textbox1.InputString(true);
	
	fopen_s(&fp,"pass.dat","w");
	fprintf(fp,"%s",pass);
	fclose(fp);

	screen.Clear_screen();
}

char pass1[20];
fopen_s(&fp,"pass.dat","r");	
fscanf_s(fp,"%s",pass1,20);	
fclose(fp);

screen.MoveCursorTo(12,10);
screen.Write("请输入密码:");
Textbox textbox1=Textbox(27,10,20);
char *pass=NULL;
int times=0;

while(1)
{
	pass=textbox1.InputString(false);

	if(strcmp(pass,pass1)!=0)
	{			
		times++;
		if(times==3)
		{
			circulation=0;
			break; 
		}
	}
	else
	{			
		break;
	}
}	

}

void MainInterface()
{
Screen screen;
screen.SetSize(80,25);
screen.SetTitle(“日记”);

Form form;
SMALL_RECT rc={10,1,61,16};
form.form_color_num=4;
form.DrawBox(rc);
form.DrawSeparatorBar_H(12,rc.Left,rc.Right);

Button Write_button=Button(34,5,"填写");
Write_button.button_color_num=3;
Write_button.Display_button();

Button Look_button=Button(34,9,"查阅");
Look_button.button_color_num=3;
Look_button.Display_button();	

Button Modify_button=Button(18,14,"修改密码");
Modify_button.button_color_num=2;
Modify_button.Display_button();

Button EXIT_button=Button(45,14,"退出程序");
EXIT_button.button_color_num=2;
EXIT_button.Display_button();	
	
Event event;

while(1)
{
	event.ReadEvent(); 
	if(event.Mouse_Event())
	{
		if(EXIT_button.MousePosition_At_button()
			&&event.Left_Button_Pressed())
		{
			circulation=0;
			return; 
		}
					
		if(Write_button.MousePosition_At_button()
			&&event.Left_Button_Pressed())
		{
			State=WRITE;
			interface_num=1;
			break;
		}

		if(Look_button.MousePosition_At_button()
			&&event.Left_Button_Pressed())
		{
			State=LOOK;
			interface_num=1;
			break;
		}
					
		if(Modify_button.MousePosition_At_button()
			&&event.Left_Button_Pressed())
		{
			Window window=Window(11,18,50,5);

			screen.MoveCursorTo(12,20);
			screen.Write("请设置新密码:");
			Textbox textbox1=Textbox(27,20,20);
			char *pass=textbox1.InputString(true);

			_chdir(data_path);

            FILE *fp;
			fopen_s(&fp,"pass.dat","w");
			fprintf(fp,"%s",pass);
			fclose(fp);

			window.Clear_window();
		}
	}

	if(event.Key_Event()&&event.Key_Down())
	{
		char ch=event.Get_ch(); 
		WORD vk=event.Get_vk();

		if(ch=='q'||vk==VK_ESCAPE)
		{
			circulation=0;
			return; 
		}
	}
}

}

void Answer()
{
Screen screen;
screen.SetSize(130,35);

//  获得今年今月今日

time_t t;
struct tm now;
t=time(NULL);
localtime_s(&now,&t);
int This_year=1900+now.tm_year;
int This_month=1+now.tm_mon;
int Today=now.tm_mday;

//  生成目录

_chdir(data_path);

FILE *fp;
char *plane_name="作者姓名.txt";
fopen_s(&fp,plane_name,"r");	
fscanf_s(fp,"%s %d",aircraft_name,20,&aircraft_initial_year);	
fclose(fp);

screen.SetTitle(aircraft_name);

_mkdir(aircraft_name);
_chdir(aircraft_name);

int year;
for(year=aircraft_initial_year;year<=This_year;year++)
{
    char year1[10];
	sprintf_s(year1,10,"%d",year);
    _mkdir(year1);
}

//  显示标题	

char Title[60];
year=This_year;
sprintf_s(Title,60,"%s%d年的日记",aircraft_name,year);
screen.text_color_num=6;
screen.DisplayText((screen.wide-(int)strlen(Title))/2,2,Title);

//  显示状态

screen.SetTextColor(6);

if(State==WRITE)
{
	screen.MoveCursorTo(3,3);
	screen.Write("填写");
}
if(State==LOOK)
{
	screen.MoveCursorTo(3,3);
	screen.Write("查阅");
}

//  画表格

int left=0,top=4,column=32,line=13,Form_wide=4,Form_high=2;
Form form;
form.form_color_num=6;
form.DrawForm(0,top,32,13,4,2);

SMALL_RECT rc={left,top,column*Form_wide+1+rc.Left,line*Form_high+rc.Top};

// 月 1-12,日 1-31

COORD pos;
    
screen.SetTextColor(3);

int day=1;
for(pos.X=rc.Left+4+2,pos.Y=rc.Top+1;day<32;pos.X+=4,day++)
{
	screen.MoveCursorTo(pos);
	screen.Write(day);		
}

int month=1;
for(pos.X=rc.Left+2,pos.Y=rc.Top+3;month<13;pos.Y+=2,month++)
{
	screen.MoveCursorTo(pos);
	screen.Write(month);		
}

// 标注今天

pos.Y=This_month*2+(rc.Top+1);
pos.X=Today*4+(rc.Left+1)+1;
screen.Character_color_num=3;
screen.DisplayCharacter(pos,'T',1);

//标注无效日期

int month1[5]={2,4,6,9,11};//||month==6||month==9||month==11)
int day1[3]={29,30,31};

screen.Character_color_num=9;

if(!Leap_year(year))
{
  pos.Y=month1[0]*2+(rc.Top+1);      
  pos.X=day1[0]*4+(rc.Left+1)+1;
  screen.DisplayCharacter(pos,'N',1);
}

pos.Y=month1[0]*2+(rc.Top+1);
pos.X=day1[1]*4+(rc.Left+1)+1;
screen.DisplayCharacter(pos,'N',1);

for(int i=0;i<5;i++)
{
	pos.Y=month1[i]*2+(rc.Top+1);
	pos.X=day1[2]*4+(rc.Left+1)+1;
	screen.DisplayCharacter(pos,'N',1);
}
	
// 标注今年已有记录

char Work_path[MAX_PATH];

year=This_year;
sprintf_s(Work_path,MAX_PATH,"%s\\%s\\%d",data_path,aircraft_name,year);
   
screen.Character_color_num=5;

LinkedList_string Mresult;
PNode_string temp1;

Mresult.CreateFromDirectory(Work_path,"\\*.txt",false);
	
temp1=Mresult.head;
while(temp1!=NULL)
{
	Cut_apart(temp1->name,&year,&month,&day);

	pos.Y=month*2+(rc.Top+1); 
	pos.X=day*4+(rc.Left+1)+2;
	screen.DisplayCharacter(pos,'*',1);

	temp1=temp1->next;
}

//

Textbox date_textbox=Textbox(55,33,20);
date_textbox.textbox_textcolor_num=3;

Button RETURN_button=Button(122,3,"[返回]");
RETURN_button.Display_button();	

Button PrevYear_button=Button(0,32,"【上一年】");
PrevYear_button.Display_button();
Button NextYear_button=Button(120,32,"【下一年】");
NextYear_button.Display_button();

Event event;   

while(1)
{
	event.ReadEvent(); 
	if(event.Mouse_Event())
	{
		event.Get_mouse_position();
		if(mouse.X>rc.Left+4&&mouse.X<rc.Right&&mouse.Y>rc.Top+2&&mouse.Y<rc.Bottom)         //
		{				
			//
			if((mouse.Y-(rc.Top+1))%2==0)
			{
				month=(mouse.Y-(rc.Top+1))/2;
				day=(mouse.X-(rc.Left+1))/4;

				if(Valid(year,month,day))
				{
					char date[30];
					sprintf_s(date,30,"%d 年 %02d 月 %02d 日",year,month,day);
					date_textbox.DisplayString_textbox(date);

					//     填写

					if(State==WRITE)
					{
						if (event.Left_Button_Pressed() && event.Double_Click()) /* 鼠标左键双击 */
						{    
							_chdir(Work_path);

							char filename[20];
							sprintf_s(filename,20,"%d%02d%02d.txt",year,month,day); 
							if(_access(filename,0)==-1)
							{
								FILE *fp;
								fopen_s(&fp,filename,"a");
								fclose(fp);
							}								

							//打开记事本文件

							char notepad[40]="notepad.exe "; 
							strcat_s(notepad,40,filename);

							STARTUPINFO si;
							PROCESS_INFORMATION pi;
							ZeroMemory(&si,sizeof(si));  //此参数必须清零

							BOOL flag=CreateProcess(NULL,(LPSTR)notepad,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi);
							if(flag==FALSE)
							{
								printf("Error= %d",GetLastError());
							}

							WaitForSingleObject(pi.hProcess,INFINITE); //等待notepad.exe 运行完成,在给定的时间内未完成也退出。

							//

							event.FlushInputBuffer();

							File file;
							if(file.File_is_empty(filename))
							{
								DeleteFile(filename);
							}
							else
							{
								pos.Y=month*2+(rc.Top+1); 
								pos.X=day*4+(rc.Left+1)+2;
								screen.DisplayCharacter(pos,'*',1);

								Mresult.AddNodeAtTail(filename);
							}

						}
					}

					//   查阅

					if(State==LOOK)
					{
						if (event.Left_Button_Pressed()) /* 鼠标左键按下 */
						{							 
							_chdir(Work_path);

							char filename[20];
							sprintf_s(filename,20,"%d%02d%02d.txt",year,month,day);
							if(_access( filename,0)==0) 
							{
								//  获取所选文件在链表中的索引

								int index=0;									

								temp1=Mresult.head;
								while(temp1!=NULL)
								{
									if(strcmp(temp1->name,filename)==0)break;
									temp1=temp1->next;
									index++;
								}

								//

								char date[20];									
								Cut_apart(Mresult.NodeString(index),&year,&month,&day);
								sprintf_s(date,20,"%d年%02d月%02d日",year,month,day);

								Window window1=Window(0,0,130,35);
								window1.GetText_window();
								window1.Clear_window();
								window1.AddWindowWithinBorder();

								Form form;
								form.DrawSeparatorBar_H(4,window1.cx0,window1.cx0+window1.wide-1);
								form.DrawSeparatorBar_H(30,window1.cx0,window1.cx0+window1.wide-1);

								Textbox textbox=Textbox(window1.cx0+2,window1.cy0+2,window1.wide-4);
								textbox.text_position=1;
								Window window2=Window(window1.cx0+2,window1.cy0+5,window1.wide-4,25);
								//window2.Paint_window(1);

								textbox.DisplayString_textbox(date);
								window2.DisplayFileEx_SinglePageWindow(Mresult.NodeString(index));

								Button Prev_button=Button(window1.cx0+10,window1.cy0+window1.heigh-3,"上一条");
								Prev_button.Display_button();
								Button Next_button=Button(window1.cx0+25,window1.cy0+window1.heigh-3,"下一条");
								Next_button.Display_button();

								Button Cancel_button=Button(window1.cx0+50,window1.cy0+window1.heigh-3,"取消");
								Cancel_button.Display_button();

								Event event;

								while(1)
								{
									event.ReadEvent();
									if(event.Mouse_Event())
									{
										if(Prev_button.MousePosition_At_button()&&event.Left_Button_Pressed())
										{
											if(index>0)
											{													
												index--;
												Cut_apart(Mresult.NodeString(index),&year,&month,&day);
												sprintf_s(date,20,"%d年%02d月%02d日",year,month,day);

												textbox.DisplayString_textbox(date);
												window2.Clear_window();
												window2.DisplayFileEx_SinglePageWindow(Mresult.NodeString(index));
											}
										}

										if(Next_button.MousePosition_At_button()&&event.Left_Button_Pressed())
										{
											if(index<Mresult.Length()-1)
											{
												index++;
												Cut_apart(Mresult.NodeString(index),&year,&month,&day);
												sprintf_s(date,20,"%d年%02d月%02d日",year,month,day);

												textbox.DisplayString_textbox(date);
												window2.Clear_window();
												window2.DisplayFileEx_SinglePageWindow(Mresult.NodeString(index));
											}
										}

										if(Cancel_button.MousePosition_At_button()&&event.Left_Button_Pressed())
										{
											break;
										}
									}
								}

								event.zero();
								window1.PutText_window();
							}

						}
					}

				}
				else	date_textbox.Clear_textbox();					
			}
			else date_textbox.Clear_textbox();
		}
		else date_textbox.Clear_textbox();
		
		if(PrevYear_button.MousePosition_At_button()&&event.Left_Button_Pressed())
		{
			if(year>aircraft_initial_year)
			{					
				screen.Character_color_num=9;

				temp1=Mresult.head;
				while(temp1!=NULL)
				{
					Cut_apart(temp1->name,&year,&month,&day);

					pos.Y=month*2+(rc.Top+1); 
					pos.X=day*4+(rc.Left+1)+2;
					screen.DisplayCharacter(pos,' ',1);

					temp1=temp1->next;
				}
				
				// 新的一年

				year--;

				sprintf_s(Title,60,"%s%d年的日记",aircraft_name,year);
				screen.DisplayText((screen.wide-(int)strlen(Title))/2,2,Title);

				// 2月29日

				pos.Y=2*2+(rc.Top+1);                  
				pos.X=29*4+(rc.Left+1)+1;

				if(Leap_year(year))
				{						 
					screen.DisplayCharacter(pos,' ',1);
				}
				else
				{
					screen.DisplayCharacter(pos,'N',1);
				}

				//					

				sprintf_s(Work_path,MAX_PATH,"%s\\%s\\%d",data_path,aircraft_name,year);
				Mresult.CreateFromDirectory(Work_path,"\\*.txt",false);

				screen.Character_color_num=5;
				
				temp1=Mresult.head;
				while(temp1!=NULL)
				{
					Cut_apart(temp1->name,&year,&month,&day);

					pos.Y=month*2+(rc.Top+1); 
					pos.X=day*4+(rc.Left+1)+2;
					screen.DisplayCharacter(pos,'*',1);

					temp1=temp1->next;
				}
			}
		}

		if(NextYear_button.MousePosition_At_button()&&event.Left_Button_Pressed())
		{
			if(year<This_year)
			{	
				screen.Character_color_num=9;

				temp1=Mresult.head;
				while(temp1!=NULL)
				{
					Cut_apart(temp1->name,&year,&month,&day);

					pos.Y=month*2+(rc.Top+1); 
					pos.X=day*4+(rc.Left+1)+2;
					screen.DisplayCharacter(pos,' ',1);

					temp1=temp1->next;
				}
				
                // 新的一年

				year++;

				sprintf_s(Title,60,"%s%d年的日记",aircraft_name,year);
				screen.DisplayText((screen.wide-(int)strlen(Title))/2,2,Title);

				// 2月29日

				pos.Y=2*2+(rc.Top+1);                  
				pos.X=29*4+(rc.Left+1)+1;

				if(Leap_year(year))
				{						 
					screen.DisplayCharacter(pos,' ',1);
				}
				else
				{
					screen.DisplayCharacter(pos,'N',1);
				}

				//					

				sprintf_s(Work_path,MAX_PATH,"%s\\%s\\%d",data_path,aircraft_name,year);
				Mresult.CreateFromDirectory(Work_path,"\\*.txt",false);

				screen.Character_color_num=5;
				
				temp1=Mresult.head;
				while(temp1!=NULL)
				{
					Cut_apart(temp1->name,&year,&month,&day);

					pos.Y=month*2+(rc.Top+1); 
					pos.X=day*4+(rc.Left+1)+2;
					screen.DisplayCharacter(pos,'*',1);

					temp1=temp1->next;
				}
			}
		}

		if(RETURN_button.MousePosition_At_button()
			&&event.Left_Button_Pressed())
		{
			Mresult.DeleteLb();
							
			interface_num=0;
			return; 
		}
	}	
}

}

bool Leap_year(int year)
{
if((year%40&&year%100!=0)||(year%4000))return true;
else return false;
}

void Cut_apart(const char *result0,int *year,int *month,int *day)
{
string temp(result0);

*year=atoi(temp.substr(0,4).c_str());
*month=atoi(temp.substr(4,2).c_str());
*day=atoi(temp.substr(6,2).c_str());

}

int Valid(int year,int month,int day)
{
if(month1||month3||month5||month7||month8||month10||month12)
{
if(day<=31)return 1; else return 0;
}
else if(month
2)
{
if((year%40&&year%100!=0)||(year%4000))
{
if(day<=29)return 1; else return 0;
}
else
{
if(day<=28)return 1; else return 0;
}
}
else if(month4||month6||month9||month11)
{
if(day<=30)return 1; else return 0;
}
else return 0;
}

运行效果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

这是第三版,增加了大量关于键盘缓冲区操作和输入、输出操作的知识讲解,并修改了多处前两版中文字、语句错误的地方。 前两个版本由于我等级不够无法删除,此处留下前两版的地址,希望对大家有用。 第一版:http://download.csdn.net/source/3056070 第二版:http://download.csdn.net/source/3332359 以下为第三版本的目录: C/C++控制台界面编程(V 3) 1 目录 - 1 - 第一部分 控制台界面编程预备知识 1 1) Visual Studio 2005中控制台程序的类型 1 2) 转义字符及格式化输入、输出 1 a) 制表符\t 2 b) 回退字符\b 4 c) ASCII码表 6 d) 以%开头的格式控制符 9 e) 数据流的格式设置 10 3) C和C++的输入、输出操作 12 a) stdio.h中的常用输入、输出函数 13 b) basic_stream中的输入、输出操作 13 4) 键盘缓冲区处理 15 5) 关于C/C++中的字符串拼接问题 17 6) 怎样从控制台复制粘贴文字 18 7) 将批处理bat转换为exe程序 18 8) 在Visual Studio 2005中设置控制台程序的图标 18 9) 重定向控制台程序的输出 19 第二部分 控制台界面编程详解 20 1) 概述 20 2) 控制台文本窗口编程的一般控制步骤 21 3) 控制台窗口操作函数 21 4) 文本属性操作 25 5) 文本输出 28 6) 文本操作示例 28 7) 滚动和移动 34 8) 光标操作 36 9) 读取键盘信息 37 10) 读取鼠标信息 44 11) 结束语 46 第三部分 附录 1 1) 分数等级划分工具 1 a) controlio.h文件 1 b) Main.c文件 5 2) 简易俄罗斯方块 6 a) 代码Main.c文件 7 3) 模拟实现可用鼠标、键盘控制的菜单和窗口 11 这是第三版,增加了大量关于键盘缓冲区操作和输入、输出操作的知识讲解,并修改了多处前两版中文字、语句错误的地方。 前两个版本由于我等级不够无法删除,此处留下前两版的地址,希望对大家有用。 第一版:http://download.csdn.net/source/3056070 第二版:http://download.csdn.net/source/3332359
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值