基于MFC的实时数据动态显示界面设计_聂斐

合集下载

MFC读写.txt文件时进度条显示实时进度

MFC读写.txt文件时进度条显示实时进度

MFC读写.txt⽂件时进度条显⽰实时进度 整体实现⽅式:先获得⽂件长度,然后⽤每次读取的长度,计算出完成的百分⽐,⽤百分⽐的值设置进度条。

⼀、MFC进度条 Progress Control 相关函数1. create() ——创建Progress Control 针对不是通过资源⽂件上拖拉进度条控件⽣成的进度条,需要⽤此函数创建⼀个。

2. SetRange() —— 设置进度条范围 设置进度条的起始值和终⽌值。

(不管拖拽还是创建都要设置此,在初始化中)3. SetPos() —— 设置当前值 设置进度条的当前位置(值)。

4. OffSetPos() —— 偏移⼀段位置 移动进度条⼀段距离(动态移动,如果不做延时,默认速度移动)5. SetStep() —— 设置步长 设置进度条偏移⼀次的长度,⼀般与StepIt搭配使⽤6. StepIt() —— 更新步长位置 按照步长来更新位置。

7.GetPos() —— 得到当前值 获得进度条当前值。

⼆、⽰例 1. ⾸先在初始化函数中设置范围和当前初始值CProgressCtrl* pProg = (CProgressCtrl*)GetDlgItem(IDC_PROGRESS);pProg->SetRange(0, 100);pProg->SetPos(0); 2. 获取⽬标txt⽂件的总⾏数while(!feof(fOpenFile)) {if(fgets(szBuf, sizeof(szBuf) - 1, fOpenFile)) {nRowOfTotalNum++;}}nRowOfTotalNum++;fseek(fOpenFile, 0, SEEK_SET); 这⾥,读取完总⾏数后,要将⽂件指针指向⽂件头。

3. 获取当前读取进度的⾏数,计算出完成的百分⽐,⽤百分⽐的值设置进度条。

fRowOfCurrentNum = nRowOfCurrentNum;fRowOfTotalNum = nRowOfTotalNum;fProPos = (fRowOfCurrentNum / fRowOfTotalNum) * 100.00;nProPos = fProPos;cProFileCtl.SetPos(nProPos); PS:SetPos()只能接受int型变量,⽽计算后的进度⼜要使⽤Float类型进⾏保存计算,所以这⾥要特别注意各个变量之间计算时的类型转换问题,否则会⼀直出现Pos为0⽽进度条始终没有反应的情况。

基于MFC的图形界面程序设计与用户交互研究

基于MFC的图形界面程序设计与用户交互研究

基于MFC的图形界面程序设计与用户交互研究一、引言在当今信息技术高速发展的时代,图形界面程序设计已经成为软件开发中不可或缺的一部分。

MFC(Microsoft Foundation Class)作为Windows平台下的一种应用程序框架,为开发人员提供了丰富的工具和库,使得图形界面程序设计变得更加高效和便捷。

本文将探讨基于MFC的图形界面程序设计以及用户交互的研究。

二、MFC简介MFC是由微软公司开发的一套C++类库,旨在简化Windows应用程序的开发过程。

通过MFC,开发人员可以利用预先定义好的类和函数来创建各种窗口、对话框、控件等,从而实现丰富多彩的图形界面。

MFC提供了一种基于消息传递机制的事件处理方式,开发人员可以通过重载相应的消息处理函数来响应用户操作。

三、图形界面程序设计1. 界面布局在MFC中,界面布局通常通过资源编辑器来实现。

开发人员可以在资源编辑器中添加控件、设置属性、调整位置和大小等操作,从而设计出符合需求的界面布局。

通过拖拽和调整控件,可以轻松实现各种复杂的界面效果。

2. 控件设计MFC提供了丰富多样的控件供开发人员使用,如按钮、文本框、列表框、组合框等。

开发人员可以根据实际需求选择合适的控件,并设置相应的属性和事件处理函数。

通过控件之间的组合和嵌套,可以构建出直观友好的用户界面。

3. 图形绘制除了基本控件外,MFC还支持图形绘制功能,开发人员可以通过GDI(Graphics Device Interface)绘制各种图形元素,如直线、矩形、椭圆等。

利用GDI提供的API函数,可以实现自定义绘图效果,为用户呈现更加生动和具有吸引力的界面。

四、用户交互研究1. 事件处理在图形界面程序中,用户交互是至关重要的一环。

MFC通过消息映射表和消息处理函数来实现事件处理机制,当用户进行操作时,系统会发送相应的消息给程序,并由消息处理函数进行响应。

开发人员可以根据不同消息类型编写相应的处理逻辑,实现与用户的有效交互。

可视化编程入门mfc

可视化编程入门mfc

*
一个应用程序的执行就像一场舞台演出。应用程序对象是幕后人员(导演、剧务等),它们负责安排并指挥“演员”(窗口)上场,准备和调度各种演出“资源”(如菜单、工具栏、图标等)。从操作系统来看,具有“法人”地位的是应用程序对象而非窗口对象,应用程序可以占有CPU时间和内存空间,还可拥有演出所需的“资源”。
2.基于Microsoft MFC的编程方法
*
MFC是一个很大的类层次体系(MFC6.0中包含了200多个类),它由一个称为CObject的类作为根基类,其他类大部分从该类派生而来,其整个类体系可大致划分为: ■基类 ■应用程序框架类。 包括:应用程序类、命令类、文档/视窗类、框架窗口类、文档模板类等 ■可视对象类。 包括:窗口类、对话框类、控件类等 ■绘图类。 包括:绘图工具类、设备描述表类等。 ■简单数据类型类 ■通用类 包括:数组类、类表类、映像类 ■文件和数据库类 包括:文件I/O类、ODBC类、ADO类 ■Internet和网络工作类 包括:Win32 Internet类、Windows Socket类等 ■对象链接和嵌入(OLE, Object Lingking and Embedding)类 ■调试和异常类
*
冯耀霖
202X
VC++的可视化编程 入 门
本课程简要介绍Windows应用程序的形式和在VC++集成开发环境下使用MFC编写Windows应用程序的基本方法,以使同学们对面向对象的可视化(Visual)程序设计建立一个初步的概念并掌握一些基本方法,为深入学习和使用VC++和其他可视化编程工具打下基础。
*
当在对象上发生了某个事件并发出了相应的消息后,接收者对象就要响应并处理该消息。每个需要响应的消息要求对应一个处理该消息的程序——事件驱动程序。响应消息就是启动相应的事件驱动程序。Visual Studio中将响应消息的过程称为消息映射。

MFC动态菜单全攻略

MFC动态菜单全攻略

做一个MFC程序的时候碰到一个需求。

就是需要根据定制情况,动态生成菜单,菜单的具体结构和信息是之前不知道的(因此不能利用工具构造),点击不同类型的菜单会触发特定的一类事件(需要动态绑定事件)。

这种需求实际是蛮不BT的,很多场合下都可能会有,用C#写了个Demo花了不到半个小时。

但转到MFC下来写,就费尽周折。

其实这个问题代表了在MFC中动态创建资源绑定事件的一般性问题,所以总结一下。

动态创建菜单需要先了解CMenu类。

通常我们利用工具绘制一个菜单,每一个菜单项下都可以视为有一个CMenu类。

它们联系在一起,形成树状。

典型的一个菜单对应过来是如下图这个样子:如上,CMenu可以分成三种,一个是Popup(黄色),一个是Separator(灰色),一个是Item(红色)。

前两种都是没有ID信息的,Popup有一个指针,指向其SubMenu;Item保存各种信息有ID可以响应事件;Separator,恩,基本是一穷二白的。

CMenu的CreateMenu方法可以创建一个菜单资源,用DeleteMenu(包含所有子菜单)或DestoryMenu可以销毁菜单资源,用AppendMenu可以添加一个菜单。

了解这些内容,就可以开工了,现实现上图所示的MainSubMenu1下菜单的动态创建,代码如下:// 假设在ChildFrm中,调用该方法获得当前的主菜单指针CMenu* mainMenu = AfxGetMainWnd()->GetMenu();CMenu* subMenu = NULL;// 遍历主菜单下的各级菜单寻找名为MainSubMenu1的菜单intmenuCount = mainMenu->GetMenuItemCount();for(inti = 0; i<menuCount; i++){CStringmenuName;if(mainMenu->GetMenuStringA(i, menuName, MF_BYPOSITION) &&menuName == "&MainSubMenu1"){drawingMenu = mainMenu->GetSubMenu(i);break;}}// 移除原有的菜单项int subMenu1Count = subMenu->GetMenuItemCount();for(inti = subMenu1Count - 1; i>= 0; i--){subMenu->DeleteMenu(i, MF_BYPOSITION);}// 动态添加Item菜单项for(inti = 0; i< 2; i++){CString message = "";subMenu->AppendMenuA(MF_STRING, ID_BEGIN + i,message.Format("SubSubMenu%i", i);}// 添加分隔符subMenu->AppendMenuA(MF_SEPARATOR);// 添加弹出式子菜单CMenu * popupMenu = new CMenu();popupMenu->CreateMenu();for(inti = 0; i< 2; i++){CString message = "";popupMenu->AppendMenuA(MF_STRING, ID_BEGIN + 2 + i, message.Format("PopupSubMenu%i", i));}subMenu->AppendMenuA(MF_POPUP, (UINT_PTR)popupMenu->operator HMENU(), "PopupMenu");有几个需要注意的地方,一个是主菜单的指针获得,可以参考《MFC框架各部分指针获取方式》一文。

基于MFC控件STATIC显示图片数据

基于MFC控件STATIC显示图片数据

if(m_pict.LoadPicture(pathName.GetBuffer(pathName.GetLength())))
{
// 防止有透明图片,消除已有的图片信息 CPaintDC dc(this); // device context for painting CRect rc; GetDlgItem(IDC_MY_PIC)->GetWindowRect(&rc); dc.FillSolidRect(rc, RGB(0, 0, 0)); Invalidate(); } } } } 3. 给 父 窗 口 增 加 ON_WM_DRAWITEM 消 息 映 射 函 数 在 OnDrawItem ( int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)消息映射函数里面绘制控件 void CDlgpicDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: Add your message handler code here and/or call default if(nIDCtl == IDC_MY_PIC) { if ( m_pict.m_pic) { RECT rect; TRACE(“--hell-- test---”); HWND hwnd = ::GetDlgItem(this->GetSafeHwnd(), IDC_MY_PIC); HDC hDC = ::GetDC(::GetDlgItem(this->GetSafeHwnd(),IDC_MY_PIC));
基于MFC控件STATIC显示图片数据
1.
在 OnInitDialog 中加入

mfc界面设计教程

mfc界面设计教程

mfc界面设计教程MFC(Microsoft Foundation Classes)是一套用于开发Windows平台上图形用户界面(GUI)的C++类库。

MFC界面设计是开发Windows应用程序中不可或缺的一部分。

本文将向您介绍一些MFC界面设计的基本原则和技巧,帮助您创建出具有吸引力和用户友好的应用程序界面。

首先,设计一个清晰的用户界面是至关重要的。

您需要确保您的应用程序界面布局简洁明了,易于导航。

使用适当的菜单和工具栏来组织您的功能,使用户能够方便地找到和使用这些功能。

避免界面过于拥挤或混乱,这会给用户带来困惑和不满。

其次,选择合适的颜色和字体可以提升您应用程序界面的外观。

一般来说,最好选择与您应用程序主题相关的颜色,并确保文字清晰可读。

避免使用太多花哨的字体或颜色,这可能会让用户感到眼花缭乱。

另外,为您的界面添加一些可视化元素也是一个不错的选择。

例如,您可以使用图标来表示不同的功能或操作,这有助于用户更快地识别和理解这些内容。

您还可以考虑使用一些动画效果或过渡效果来吸引用户的注意力,但要确保这些效果不会分散用户的注意力或降低应用程序的性能。

此外,考虑到用户的反馈是很重要的。

您可以通过使用弹出窗口、对话框或状态栏来向用户显示相关的提示信息,告知他们当前的操作状态或发生的错误。

提供适当的错误处理机制也非常重要,以便用户能够轻松地解决问题或进行必要的更正。

最后,测试是一个不可忽视的环节。

在设计和开发过程中,您应该经常测试您的界面,以确保它在不同屏幕分辨率和操作系统上都能够正常显示和工作。

同时,您还应该进行用户体验测试,以了解用户对您设计的界面的感受和反馈,并根据需要进行相应的修改和改进。

总结起来,MFC界面设计需要注意清晰布局、合适的颜色和字体、可视化元素、合理的反馈机制以及充分的测试。

通过遵循这些原则和技巧,您可以创建出用户友好和吸引人的应用程序界面。

希望本文对您的MFC界面设计有所帮助!。

基于MFC与OpenGL的可视化机械仿真设计系统

基于MFC与OpenGL的可视化机械仿真设计系统

基于MFC与OpenGL的可视化机械仿真设计系统程飞【摘要】The general visual mechanical design system is more demandingof hardware and the motion simulation generally does not respond to quantitative data input. In light of this, this paper researches on a mechanical design system that is not much demanding of hardware and can respond in real time to quantitative data input in motion simulations. The system is based on the Microsoft foundation Class Library (MFC) and the open Graphics Library (OpenGL) and computer software development. Development examples show: compared to large CAD software programs, the system is of a faster drawing function, and it is capable of calculating and visualizing component data under different conditions of precision. It can achieve rapid design and development of mechanical parts. The paper also gives an example of visualized system development of disc cam mechanisms.%通用可视化机械设计系统对硬件要求高,其仿真运动模拟一般不响应定量数据输入。

MFC程序的界面设计

MFC程序的界面设计

实验一 MFC程序的界面设计一、实验目的和要求1、熟悉Visual C++编程环境。

2、掌握常用客户区鼠标消息的用法。

二、实验内容编程实现下图1.1所示界面,要求:在客户区点击鼠标左键、右键时弹出消息框显示当前鼠标坐标。

在客户区按下字符键时弹出消息框显示当前按下的字符。

利用应用程序向导建立基于单文档/视图结构的应用程序,查看框架程序中各类的结构。

图1.1 实验二程序运行界面三、实验步骤1. 新建工程新建一个工程,工程名称为Mouse,工程类型为MFC AppWizard(exe),应用程序类型为单文档/视图结构,最终会得到一个框架程序。

2. 定义鼠标消息处理函数选择“查看”菜单下的“建立类向导”菜单项,调出如图1.2所示的类向导界面。

图1.2 ClassWizard界面由于对客户区鼠标消息的处理封装在视图类中,所以在图1.2所示的界面中,Class name选择CMouseView,Object IDs选择CMouseView,Messages选择WM_LBUTTONDOWN,然后单击Add Function按钮,添加消息WM_LBUTTONDOWN的处理函数,最后单击Edit Code按钮,进入该函数的代码编辑区,,如图1.3所示。

图1.3 鼠标消息处理函数代码编辑界面在如图1.3所示的鼠标消息处理函数中添加下列代码,捕捉鼠标当前坐标。

void CMouseView::OnLButtonDown(UINT nFlags, CPoint point){// TODO: Add your message handler code here and/or call defaultMessageBox("you have pressed the left button",”Mouse”,MB_YESNOCANCEL|MB_ICONWARNING);CView::OnLButtonDown(nFlags, point);}在图1.2所示的界面中,用同样的方法添加消息WM_RBUTTONDOWN的处理函数,在该函数中添加下列代码。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

NIE Fei, YIN Xing-hui (Computer and Information College, Hohai University, Nanjing 211100, China)
Abstract: In order to carry out a real-time observation upon a large number of changing data in the astronomical observations, this paper designs a dynamic display interface for real-time monitoring solar burst based on MFC. We used a linked list to store the real time updated data, while plotting a graph. Coordinate axes are reset according to the changes of the data before drawing, so that the data’s fluctuation can be displayed dynamically. This design has been realized in the real-time monitoring system for solar burst. The experiment and application show that this system has good performance and achieve the design requirement. Key words: MFC; real-time data; dynamic displaying; interface design
-136-
聂 斐, 等 基于 MFC 的实时数据动态显示界面设计
Vidar Berger 编写的 clPlot 类可以画实时曲线 , 派 生于 CWnd 类。 但是并不能满足本系统的要求,本文进行了修改,加以改 进,进而实现了实时数据的动态显示。 2.2 实现步骤与方法
不同于 Jan Vidar Berger 所写的 clPlot 类,本文在 serie 类 的 成 员 变 量 中 构 建 了 一 个 CList 类 的 对 象 m_valuelist。 CList 类 支 持 可 访 问 顺 序 或 按 值 排 列 的 非 独 一 对 象 的 有 序 链 表 [6]。 用这样一个链表,来存放实时监测的数据。 该数据为一个结 构体。 定义如下:
收 稿 日 期 :2013-02-18
稿 件 编 号 :201302033
来 完 成 这 样 的 工 作 。 MFC 中 没 有 直 接 提 供 这 样 的 类 [5],Jan
基 金 项 目 :国 家 自 然 科 学 基 金 资 助 (11173010;10978006)
作者简介:聂 斐(1986—),男,安徽淮南人,硕士研究生。 研究方向:信号检测与处理。
应用要求。
关键词: MFC; 实时数据; 动态显示; 界面设计
中图分类号: TP311
文献标识码: A
文 章 编 号 :1674-6236(2013)10-0136-03
Design of real-time data dynamic displaying interface based on MFC
typedef struct _value{ double dValue; CTime ValueTime; }value; 以 X 轴(横坐标)为时间轴,Y 轴(纵坐标)为太阳温度。 在 界面上,我们显示的是一分钟内的温度曲线。 由于下位机设 定的采样速率为一秒钟采集一个数据,传到上位机上,一分 钟内为 60 个数据。 那么,我们就将链表元素的个数设定为 60 个。 每接收到一个新的数据,则添加在链表的尾部。 如果接收 到的数据超过 60 个了,则将链表的头元素 去掉 。 这 样 ,就使 得链表的元素个数始终为 60 个, 并且 是最 新 的 60 个数 据 。 这样即可以保证观测数据的实时性。 另外,在添加新数据之 后,我们 还 要 判断 其 幅 值的 大 小 ,即 value 结 构 体 中的 成 员 变 量 dValue。 我们要把链表中所有数据的幅值的最大值和最小 值,作为设定 Y 轴(纵坐标)标尺的依据。 这样,坐标幅度就会 根据数据幅值的变化而变化,绘制出的曲线图总是会占据整 个坐标平面,即使数据幅值突降至某个小的幅度波动,曲线 图也不会“挤”在一起,极大方便了使用人员的观测。 添加新数据使用的是 clPlot 类的 AddPoint()函数,该函数 调用 serie 类的成员函数 AddPoint()。 在 serie::AddPoint()中, 将新接收的数据添加入链表中。 本文定义了两个全局变量 m_max 和 m_min, 用 来 存 放 Y 轴 坐 标 标 尺 的 最 大 值 和 最 小 值。 这两个值如何得到呢? 先找出链表中数据幅值的最大值 和最小值,将它们作差,得到一个差值。 m_max 即为链表中数 据 幅 值 的 最 大 值 加 上 差 值 的 1%;m_min 即 为 链 表 中 数 据 幅 值的最小值减去差值的 1%。 那么将 m_max 和 m_min 作为参 数 , 在 clPlot::AddPoint () 调 用 函 数 SetLYRange () 时 , 传 递 进 去,来设定 Y 轴的坐标标尺。 根据新数据添加的时间,调用函 数 SetBXRange(),设 定 X 轴 标 尺 。 最 后 调 用 函 数 Invalidate (), 该函数的作用是让窗口的整个客户区无效 , 当下一个 WM_PAINT 消 息 发生 时 ,窗 口就 会 重 绘[7]。 这 样 ,每 添加 一 个 新的数据,就重新画一次曲线图,即达到实时显示的效果。 设计流程图如图 1 所示。 关键代码如下: void serie::AddPoint(CTime &valuetime , double &y) { value tempvalue; tempvalue.ValueTime = valu幅值较小的地方。 这种曲线极不便于观测者实时观
2 界面设计与实现
看与监测。 本文在界面设计时,不仅实时监测数据绘制曲线, 2.1 总体目标
而且坐标幅度也根据实测数据在动态变化,非常利于观测者
软件界面的开发依托微软公司推出的 Visual C++ 6.0 为
第 21 卷 第 10 期 Vol.21 No.10
电子设计工程 Electronic Design Engineering
2013 年 5 月 May. 2013
基于 MFC 的实时数据动态显示界面设计
聂 斐, 殷兴辉 (河海大学 计算机与信息学院, 江苏 南京 211100)
摘要: 为 了 方 便 在 天 文 观 测 时 对 大 量 变 化 的 数 据 进 行 实 时 监 测 , 提 出 了 一 种 基 于 MFC 的 太 阳 爆 发 实 时 监 测 动 态
在工 业 控 制和 测 量 探测 等 领 域中 ,对 于 一 些 时 刻 变 化 的 公 司 为 了 简 化 程 序 员 的 开 发 工 作 所 开 发 的 一 套 C++类 的 集
物理量(如:温度,压力,速度等),我们常常要进行实时地监 合,是一套面向对象的函数库,以类的方式提供给用户使用。
测 。 这 就 需要 在 测 量测 试 的 仪器 仪 表 或控 制 系 统 的 界 面 上 , 可 以用 它 来 编写 Windows 应 用 程序 ,该 类 的集 合 是 按 层 次 结
-137-
《电子设计工程》2013 年第 10 期
时期,太阳温度在大约 45 000 度左右波动。 但是由于 浮 动 相 对较小,看不出具体的范围。 等到爆发活动结束,太阳温度大
幅下降。 可是由于非动态显示的局限性,在图 2(b)上几乎看 不出太阳温度值,更看不清楚波动范围。
图 2 非动态显示 Fig. 2 Non-dynamic displaying 图 3 为动态显示。 由图 3(a)可以清晰的反映出太阳温度 800 度 )波 动 ,坐 标 标 尺 幅 值 也 跟 随 变 化 ,如 图 3(c),曲 线 图 浮动在 45 000-45 500 度。 在 14 点 13 分的时候,太阳爆发活 也 跟 随 动 态 变 化 ,不 似 图 2 那 样 压 缩 在 一 起 ,无 法 看 清 波 动 动 结 束 ,如 图 3(b),太 阳 温 度 突 降 至 较 小 的 幅 值 范 围 (300~ 的范围。 非常便于使用者观测。
图 1 设计流程图 Fig. 1 Flow chart of design tempvalue.dValue = y; m_valuelist.AddTail(tempvalue); m_lend++; if(m_lend > clPlot::m_lMaxDataPrSerie) { m_valuelist.RemoveHead(); m_lbegin++; } POSITION pos=m_valuelist.GetHeadPosition(); double a[100]; int k=0; while(pos ! = NULL) { value valuetemp = m_valuelist.GetAt(pos); m_valuelist.GetNext(pos); a[k]=valuetemp.dValue; k++; } double max=a[0]; double min=a[0]; for(int i=1;i<k;i++) { if(a[i]>max) max=a[i]; if(a[i]<min) min=a[i]; } m_max=max+(max-min)/100; m_min=min-(max-min)/100; } 2.3 实验结果 图 2 为非动态显示。 由图 2(a)可以看到,太阳处于爆发
相关文档
最新文档