说来好玩,作为直系专业的计算机科学与技术专业,我们学习进度比其他专业慢,跨度比其他专业小。偏偏课程要求却比其他专业高。
于是乎,期末答辩就要求我们写一个包含2000行代码的C语言程序。我选择搭配easyx包,用图形函数来制作一个笔记本应用。
本来想就做一个和Windows自带记事本一样的程序,结果做出来之后发现过于简单,根本不需要2000行,随机跟换思路。
查询市面上已有的笔记本设计,我决定做一款带有瀑布流,可以变换界面颜色,并且可以自己选择页面颜色、字体颜色,并实时更新的笔记本。
做出来后的布局就如上图所示,其实最基本的设想中是没有那个星星作软件介绍也没有那个悬浮球按钮。但后面为了补代码行数,你就会和我一样无所不用其极了。我才不会说我在里面添加了几百行无效代码呢,哈哈哈。
上面的功能模块图是最后赶出来应付老师的,倒不是说我真的是按他来做的,但这不影响我用它来说明我的记事本功能。
说实话,我认为我笔记本的最主要的就是界面,不同的模块方块大小,在图片上显现出瀑布流的格式,只可惜C语言的模块化让代码大大简化,一个功能一个函数就解决成功。
所以我先写出我是如何在C语言里面利用Easyx实现瀑布流的吧。
其实记事本的输入和输出都很好解决,利用fopen()等文件I/O函数就可以直接对文本进行操作,但要实现如图中所示的同时打开多个文件,我们就需要进行如下操作
//储存文件内容的结构体
typedef struct String
{
TCHAR * Data;
int Txt_LEN;
struct String *Next;
}LNode;
我们建立一个结构体,到后面再利用结构体建立单链表,这样我们就可以不断增加文件的数量,而不会搞混文件。并且把文件的增减变为链表的增减。
//储存不同文件信息
typedef struct Fileinf
{
char * Path;//存储文件地址
TCHAR * Title;//标题
long LineSize;//记录文件中,文字数
LNode * Head;//文件的头指针
}F_Inf;
//这是打开文件保存的相关信息
//////////////////////////////////////////////////////
#include
#include
#include
#include
#include
#include
#include
#include
#include
其中定义了大量的鼠标函数来占代码行数,也通过不同的鼠标函数来进行界面的变换。
//////////////////////////////////////////////////////
// 主函数,两个循环使得一直在主界面
int main(int argc, char const *argv[])
{
F_Inf * f;
f = InitFILE();
Initgra();
//pho();
while (true)
{
Initgra();
while (true)
{
showscreen(f);
MOUSEMOUSE(f);
Sleep(20);
}
}
closegraph();
return 0;
}
//主函数如上所示,通过循环使得界面不断更新,由鼠标函数判断是否进入另外一个界面
由于后面有两千行,我就不一一放上来了。
放几段代码阐明一下功能:
//////////////////////////////////////////////////////
// 选择自体颜射的鼠标函数
int MOUSEMOUSE3()
{
MOUSEMSG m; // 定义鼠标消息
while (MouseHit()) // 检查是否有鼠标消息
{
m = GetMouseMsg();
for (int i = 1; i < 8; i++)
{
if (m.x > (i - 1) * 60 + 20 && m.x < (i) * 60 + 20) // 设置
{
if (m.uMsg == WM_LBUTTONDOWN)
{
switch (i)
{
case 1:
settextcolor(WHITE);
return 1;
case 2:
settextcolor(RGB(160, 204, 229));
return 1;
case 3:
settextcolor(RGB(0, 204, 255));//基佬
return 1;
case 4:
settextcolor(RGB(204, 155, 255));
return 1;
case 5:
settextcolor(RGB(204, 205, 255));
return 1;
case 6:
settextcolor(RGB(255, 255, 0));
return 1;
case 7:
settextcolor(BLACK);
return 1;
}
}
}
}
}
return 0;
}
//////////////////////////////////////////////////////
// 字体大小和字体
int MOUSEMOUSE4()
{
wchar_t character[32];
MOUSEMSG m; // 定义鼠标消息
while (MouseHit()) // 检查是否有鼠标消息
{
m = GetMouseMsg();
for (int i = 1; i < 8; i++)
{
if (m.x > (i - 1) * 60 + 20 && m.x < (i) * 60 + 20) // 设置
{
if (m.uMsg == WM_LBUTTONDOWN)
{
InputBox(character, 32, L"请输入你想要的字体");
switch (i)
{
case 1:
settextstyle((7 - i) * 10, 0, character);
cleardevice();
FlushBatchDraw();
return 1;
case 2:
settextstyle((7 - i) * 10, 0, character);
cleardevice();
FlushBatchDraw();
return 1;
case 3:
settextstyle((7 - i) * 10, 0, character);
cleardevice();
FlushBatchDraw();
return 1;
case 4:
settextstyle((7 - i) * 10, 0, character);
cleardevice();
FlushBatchDraw();
return 1;
case 5:
settextstyle((7 - i) * 10, 0, character);
cleardevice();
FlushBatchDraw();
return 1;
case 6:
settextstyle((7 - i) * 10, 0, character);
cleardevice();
FlushBatchDraw();
return 1;
case 7:
settextstyle((7 - i) * 10, 0, character);
cleardevice();
FlushBatchDraw();
return 1;
}
}
}
}
}
return 0;
}
其他大多大同小异。
至于瀑布流的制作方法,只需要利用文件的大小,设定你建立的半透明长方体的长宽即可,具体函数大多直接调用。
下面把我程序报告中的套话放上来:
做文本编辑器这一课程设计题目时,自己还比较害怕是制作向 windows 系统中记事
本一样的程序。看了任务书之后自己有了些欣慰,任务书上要求是对输入的信息进行操作,这是我们经常练习的内容,虽然是比平时练习的更为难,更有深度,但自己毕竟知道该向什么方向去努力,自己应该如何去编写这个程序。所以自己在整个课程设计过程中还是比较轻松的,编写过程中遇到,的困难及问题都通过查阅资料、向老师提问得以解决。这都是基于对课题有一个明确的了解,清楚向什么方向去写。所以本次课程设计自己最大的体会就是不管写什么程序。
自己首先得对这个问题要分析透彻,要知道自己要干什么,然后才能让自己干什么。
我相信自己能更加努力,在这条路上会走的更远。