佛山某大学,大一期末课程设计,老师给了一个芝加哥的公共自行车站点信息,要求我们根据这些站点信息做一个自行车管理系统,对于功能的最低要求是能够查询站点,能够在地图上显示站点,并能够在两个站点之间画出一条路径。
做此课程设计之前压根没碰过MFC,所以做此课程设计期间很难熬,做的功能也很简单,发这篇文章只是为了记录一下自己的学习过程,请各位大佬勿喷!!!
1.登录
程序首先设计了用户登录界面,用户只有输入正确的用户名和密码之后才能进入程序。
增加一个对话框并关联上一个类,在初始化时显示登录对话框。
2.UI设计本程序的UI设计如上图所示,本界面的UI设计不算困难,为了更直观,我用了两个Group Box控件,在两个控件里再放上其他控件用于显示站点的信息。在两个Group Box下面,计算起始站点和目标站点之间的距离。
3.系统的查找功能方案设计及实现
考虑到部分用户只知道站点的ID而不知道站点名称,部分用户只知道站点名称而不知道站点ID,于是本程序提供了两种查找方式--按站点ID查找和按站点名称查找,用户可在站点ID下拉框里选择站点ID,也可以在站点名称下拉框里选择站点名称,无论按哪种方式查找,程序都会自动匹配站点的其他信息并显示在Group Box里。此外,当且仅当起始站点和目标站点都选定时,才会计算两站点之间的距离。对于“显示站点”按钮,程序运行时默认是没有显示站点的,用户单击了“显示站点”按钮,各站点会在地图上显示出来,同时,按钮的文字会变为“隐藏站点”。若用户再次单击“隐藏站点”按钮,各站点会在地图上消失,同时,按钮的文字会变为“显示站点”。
通过变量操作控件。程序首先给各个控件关联上变量。在用户通过下拉框选定站点时,通过控件的变量获取控件的索引值,通过索引值获取站点的各种信息并将信息显示在相应的位置。对于“显示站点按钮”,用户单击时,通过计算每个站点的经纬度位置,加上地图左上角和右下角的经纬度位置并结合地图的宽度和高度,可算出站点在地图上的坐标。用户单击“隐藏站点”按钮时,将所有站点一并擦除。
选定起始站点 和目标站点后,单击确定按钮,程序会自动再地图上画出一条路径,同时将两站点涂成实心红点,不管有没有显示站点程序都能够画出路径。通过不断单击确定按钮,可以在选定的起点之间画出多条不同的路径。当然,也可以在选定的站点之间画出若干条路径后,重新选择起始站点和目标站点(只改其中一个站点或者两个站点都改,效果一样),再点击确定按钮,程序会在重新选定的按钮之间画出路径,同样,也可以画多条路径。
用户单击确定按钮,程序通过控件的索引值获取站点的信息,得出站点在地图上的坐标,将其涂红,并通过随机数生成随机坐标,从而生成路径,每次单击确定按钮获得的随机数不同,所画出的路径就会不同。
4.部分源代码
//选择了起始站点ID,自动匹配起始站点名称,并显示该站点的总车位和可用车位,以及站点地址和状态
void C城市公共自行车运营可视化数据监控系统Dlg::OnCbnSelchangeCombo1()
{
// TODO: 在此添加控件通知处理程序代码
int index;
index = m_startID.GetCurSel();
m_startName.SetCurSel(index);
//记下起始站点信息
startStation = station[index];
//计算两站点之间的距离,有两个点才能计算距离
haveStartStation = true;
if (haveEndStation == true)
CalculateDistance();
//站点地址和状态
CString str3;
CString str4;
str3 = station[index].Address.c_str();
str4 = station[index].Status.c_str();
m_Address.SetWindowTextW(str3);
m_Status.SetWindowTextW(str4);
//站点总车位和可用车位
CString str1;
CString str2;
str1 = station[index].TotalDocks.c_str();
str2 = station[index].DocksInService.c_str();
m_TotalDocks.SetWindowTextW(str1);
m_DocksInService.SetWindowTextW(str2);
}