基于MFC的交通图导航系统

目 录
1 设计任务 1
2 需求分析 3
3 概要设计 4
3.1抽象数据类型定义 …4
3.2 总体设计. 4
3.3用户界面设计…5
3.4存储结构 6
3.5关键算法…8

4 详细设计与算法 11
5 测试结果 51
6 课程设计总结 57
参考文献 57
附录 58

2 需求分析
本演示程序是在Visual Studio环境中编写,完成交通图导航系统的各项功能。
导航系统的基本功能有:实现地图的模拟,向地图中添加、删除、修改、查找地点信息、路线信息,查找起点和终点之间的最优路径。

1、 地图信息:保存在文件中,包括各个地区的基本信息,路线信息等
2、 交通工具信息:包括运行时间信息、交通工具信息,例如:起始时间、结束时间信息等
3、 程序所能达到的功能:向地图中添加、删除、修改、查找地点信息、路线信息,查找起点和终点之间的最优路径
4、 测试数据:
1) 调试程序后会弹出一个窗口,进行选择“管理”模式还是“用户”模式。
2) 首先选择“用户”模式,然后进行登录进入界面。
3) 初始界面显示为有17个城市的地图,两城市之间有交通来往的有连线,并且连线上有两城市之间火车和汽车行驶的距离(前者为火车,后者为汽车)(为了更好区分,两者数值相差较大)。
4) 任选起点(可选17个城市,以天津为例)、终点(可选17个城市,以南京为例)和类型(目前有火车、汽车两种方式),点击查询。
5) 地图中会出现从起点(天津)途径某些城市到终点(南京)的连线(红色)。
6) 地图上面会显示乘坐火车/汽车走过的距离(路程长度)。
7) 右上角还可以查询“班次信息”,管理者模式可以添加和删除。
8) 查询完两城市之间的信息后,可以重新选择起点、终点和类型,进行另外两城市之间的信息查询。
9)点击右上角关闭按钮即可退出程序。

#include "pch.h"
#include "Canvas.h"

int Canvas::s_gdiplus_conter;
Gdiplus::GdiplusStartupInput Canvas::s_gdiplus_input;
ULONG_PTR Canvas::s_gdiplus_token;

Canvas::Canvas() : m_wnd(NULL), m_idc(0), m_fps(0), m_current(0) {
    startup();
}

Canvas::~Canvas() {
    shutdown();
}

void Canvas::init(Engine* engine, CWnd* wnd, int idc) {
    m_engine = engine;
    m_wnd = wnd;
    m_idc = idc;
}

void Canvas::update() {
    countFPS();
    paintBuffer();
}

void Canvas::paintBuffer() {
    //获取需要绘图的控件窗口
    CWnd* cwnd = m_wnd->GetDlgItem(m_idc);
    //获取控件窗口的DC
    CDC* dc = cwnd->GetDC();

    CRect rect;
    //得到控件的客户区大小
    cwnd->GetClientRect(&rect);

    //创建一个缓冲DC(双缓冲加速绘图效果)
    CDC memdc;
    //将缓冲DC设置成与窗口DC兼容模式
    memdc.CreateCompatibleDC(dc);

    //设置一个缓存位图
    CBitmap bitmap;
    bitmap.CreateCompatibleBitmap(dc, rect.Width(), rect.Height());
    memdc.SelectObject(&bitmap);

    //使用GDI+绘图
    Gdiplus::Graphics graphics(memdc.GetSafeHdc());
    //提高绘制质量
    graphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias);
    graphics.SetCompositingQuality(Gdiplus::CompositingQualityHighQuality);
    graphics.SetTextRenderingHint(Gdiplus::TextRenderingHintAntiAliasGridFit);

    Gdiplus::SolidBrush bgcolor(Gdiplus::Color(0xf0, 0xf8, 0xff));
    //绘制背景色
    graphics.FillRectangle(&bgcolor, rect.left, rect.top, rect.Width(), rect.Height());
    updateSprites(graphics);
    graphics.ReleaseHDC(memdc.GetSafeHdc());

    //将缓冲DC数据写入窗口DC
    dc->BitBlt(0, 0, rect.Width(), rect.Height(), &memdc, 0, 0, SRCCOPY);
    //使控件失效重绘
    //cwnd->Invalidate();
    //cwnd->UpdateWindow();
}

void Canvas::updateSprites(Gdiplus::Graphics& graphics) {
    m_engine->update(graphics);
}

void Canvas::countFPS() {
    time_t current = time(NULL);
    if (m_current == current) {
        ++m_fps;
    } else {
        m_engine->countFPS(m_fps);
        m_fps = 1;
        m_current = current;
    }
}

void Canvas::startup() {
    if (s_gdiplus_conter == 0) {
        Gdiplus::GdiplusStartup(&s_gdiplus_token, &s_gdiplus_input, NULL);
    }
    ++s_gdiplus_conter;
}

void Canvas::shutdown() {
    --s_gdiplus_conter;
    if (s_gdiplus_conter == 0) {
        Gdiplus::GdiplusShutdown(s_gdiplus_token);
    }
}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值