# SuperManager **Repository Path**: SnowNation/super-manager ## Basic Information - **Project Name**: SuperManager - **Description**: No description available - **Primary Language**: Unknown - **License**: LGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-11-02 - **Last Updated**: 2025-02-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # SuperManager ## **一、** **实验内容** 结合之前学习的C、C++编程语言,以小组为单位自主开发一款软件,题目自拟。 ## **二、** **实验要求** 在该项目中我负责记账的功能。 ### **I)** **项目主要内容** 一款名为Time is Money的个人财务和时间管理类软件。其中主要内容包含,时间管理:ddl提醒、任务甘特图、课程表,以及财务管理:日常记账和消费分析。 ### **II)** **需求分析** 现在市面上的个人记账类软件首先便是广告多,用户大多希望一个纯净的软件环境。其次是消费类型分类复杂,不够直观,界面也不够简洁。最后便是缺少一个冲动消费标记,用于标记那些“不理性”的消费。所以,我需要设计一个简洁干净的界面,有着直观的分类按钮,以及一个用于标记是否为冲动消费的开关。 ### **III)** **概要设计** 设计一个界面,在界面最上方为消费类型选择按钮,种类不多,但要齐全。中间为金额数字输入框。旁边有是否冲动消费的选择按钮。同时页面最下方有记账和返回按钮。为了提高交互感,为鼠标设置点击特效,为按钮设置动效。为了保证应用关闭后数据不会丢失,提供文件的写入(bill.txt)。 ### **IV)** **详细设计与实现** 为了设计GUI,我使用了一个C/C++为基础的图形库EasyX,导入后即可使用。该页面主要有三件事情构成:布局、按钮、输入框。 首先是布局。页面中的元素我都写成了类,一个按钮类,一个文本框类,在调用的时候直接调用,并传入相应参数即可。为了与整个应用相统一,画布使用尺寸1024*768,为了与按钮贴图相适应,按钮尺寸156*62。背景我们小组统一绘制了一张图片,直接在最下层loadimage和putimage即可。按钮和输入框直接调用并传入相应位置参数即可。我的初版设计图如下,因为当时我们组尚未画出背景以及按钮贴图,所以按钮尺寸与最终结构有一些出入。 ![img](file:///C:/Users/DAVIDZ~1/AppData/Local/Temp/msohtmlclip1/01/clip_image002.gif) 其次是按钮的设计。我创建了一个名为Button的类。其中的参数有:按钮大小、坐标、按钮文字、按钮样式、按钮文字样式、flag用于标记按钮是否被选中以及按钮贴图。Button(int x_1, int x_2, int y_1, int y_2, const char* _text)为带参数的构造函数,传入按钮对角的坐标以及按钮文字。void Reset(int x_1, int x_2, int y_1, int y_2, const char* _text)为重新设置参数。void loadImage()为加载按钮背景图片。其中我们为按钮设计了两个图片,白色版和黑色版,黑色版为未选中按钮,白色版为选中状态。所以,若选中按钮则输出白色版,未选中则输出黑色版。用void ReverseFlag()来切换选中和未选中状态。另外,还有一个函数bool button_judge(int x, int y)用于判断鼠位置是否于按钮上,为后续相关动效做支持。 最后是文本框。我为文本框建立一个名为TextBox的类。因为EasyX库中没有文本框,所以我需要自己设计并界面中画出文本框,在画文本框时调用函数void Draw()即可。首先是利用图形画出一个文本框的框,之后利用定时显示和不显示白色竖线来实现输入光标的闪烁。之后是关于文字的处理以及光标的位置的处理。当程序读取的用户键盘输入时,char Input()判断其是否为数字或者小数点或者BackSpace,如果是的话调用void Append(char c)函数将该字符添加到文本最后,同时记录字符串长度定位光标位置,然后打印整个字符串的文本。 另外是一些细节,分别是鼠标点击特效、数据记录以及按钮动效。 鼠标点击特效的实现函数为void cursorClickEffect(int x, int y)。原理是在鼠标点击位置周围依次画出反色的、从内至外依次变大的圆圈,再依次擦除。 数据记录采用的格式yyyy/mm/dd c 000.00 x。其中yyyy/mm/dd为日期,直接从系统获取从1970至今过了多少秒,然后计算出当天日期,写入文件bill.txt。然后c为消费类型,用从0到9共10个数字表示各个类型。000.00即为金额,直接写入。x为0或1,表示是否为冲动消费。这些数据在判断按下“记一笔”按钮后统一一次性写入一组,然后换行。使用该数据格式便于小组其他成员对于数据进行读取和分析。 在“记一笔”与“返回”两个按钮处我加入了动效,当鼠标放上时,将有黑色按钮转换为白色按钮。具体实现即利用不断调用button_judge(int x, int y)函数,判断鼠标是否在按钮上停留,若鼠标在,则输出白色按钮,若不在,则输出黑色按钮。 ### **V)** **系统测试** ![图形用户界面 描述已自动生成](file:///C:/Users/DAVIDZ~1/AppData/Local/Temp/msohtmlclip1/01/clip_image004.gif) ![图形用户界面 描述已自动生成](file:///C:/Users/DAVIDZ~1/AppData/Local/Temp/msohtmlclip1/01/clip_image006.gif) ![图形用户界面 描述已自动生成](file:///C:/Users/DAVIDZ~1/AppData/Local/Temp/msohtmlclip1/01/clip_image008.gif) ![文本 描述已自动生成](file:///C:/Users/DAVIDZ~1/AppData/Local/Temp/msohtmlclip1/01/clip_image010.gif) 测试结果一一切正常。鼠标及按钮动效可以显示,数据成功写入文档。 ### **VI)** **问题分析和解决** 首先是出现画面闪烁的问题。发现是批量绘图的时机错误,更改FlushBatchDraw()的位置即可解决。其次是文字输出超出文本框的情况,之后对于输入字符长度添加判断和限制即解决。最后是缺少数据的删除,因为该界面并没有数据的展示,所以更难以准确删除数据,于是并未添加删除数据的操作,如需删除数据,直接打卡文本文件删除或修改相应数据即可。