当前位置:文档之家› mfc设计报告

mfc设计报告

计算机窗口技术课程设计报告

一.设计目的:

1.了解Windows编程的基础知识,掌握MFC应用程序的基本知识;

2.基本掌握面向对象程序设计的基本思路和方法;

3.掌握用VC++开发应用程序的的一般步骤和方法;

二.设计要求:

1.采用SDI或者MDI框架构建应用程序

2.至少包含有一个类似于参数设置的输入对话框,提供用户选择不同的参数,程序并能根据该参数的不同,演示不同的效果;

3.状态栏至少有1-2种以上的提示功能,譬如提示当前串口的状态,提示用户当前的菜单项操作,提示当前的文件目录;

4.状态栏中至少包含一个进度条,用以提示某项操作的进度,具体是哪项操作,可以自定;(

5.菜单栏至少要包含1项带图标演示功能的子菜单项;

6.动态显示应用程序的图标,图标可自行绘制,或在网站上下载;

7.工具栏中至少包含1个自定义的工具按钮,该工具按钮的图标要求自定义;

8.视图区要求至少切割1次,譬如切割为1行2列,切割后的视图,至少有一个是派生于CFormView类;

9.生于CFormView类的视图对象上,至少放置1-2个以上的控件,譬如按钮控件,并且在点击该按钮控件后,能够有相应的操作,不允许是空的;譬如放置一个编辑框或者静态文本框按钮,用来显示或接受当前的某种数据或者状态,譬如用来获取用户需要发送给串口的数据,并显示实际发送成功的字节数;

10.视图对象至少包含一个派生于普通CView类,用于绘制串口采集得到数据,或者自定义用随机数产生的一些列波形图;

11.能够保存并打开波形图文件;

12.加入多线程处理,实现数据采集处理线程与主线程的分开,保证程序的良好界面响应;

三.基本思路:

建立一个单文档的应用程序,先将主视图切割成三块,其中一块的相对应的类CControlForm的基类为CFormView,另外两块的基类为CView;在CControlForm中拖入一些控件,在这些控件中相对应的函数中写入相应代码实现视图CDisplayView的中文字的旋转、文字颜色的变化、背景色的变化、文字大小的变化等操作,在CPictureView中作出文字文字旋转速度变化的坐标图;工具栏、菜单栏所对应的类中加入一些成员函数,也可实现对CDisplayView及CPictureView中的一些操作。

四、主要步骤:

1.建立工程:使用MFC AppWizard【exe】建立一个单文档应用程序,取名为CXZJ_22,

建立过程中均选用默认设置。

2.分割视图:

①添加两个MFC类, CDisplayView、CPictureView,基类为CView。

②添加一个对话框资源,将其属性中的style项改为child,ID默认为IDD_DIALOG1.

③添加一个MFC类CControlForm,基类为CFormView,对话框ID为上面默认的IDD_DIALOG1。

④创建一个切分类MySplitter,基类为CSplitterWnd(默认基类选项中无此类,可以先选择CFrameWnd类,生成后再修改为CSplitterWnd类)。

⑤在框架类Cmainframe的头文件中,添加2个MySplitter的变量(因为下面要进行两次切分操作m_wndSplitter,m_wndSplitter2)。

⑥重写框架类CMainframe的OnCreateClient函数,代码如下:

//第一次静态切分CreateStatic,一行两列

if (!m_wndSplitter.CreateStatic(this,1,2))

return FALSE;

if(!m_wndSplitter.CreateView(0,0,RUNTIME_CLASS(CControlForm),CSize(400,10 0),pContext)||!m_wndSplitter2.CreateStatic(&m_wndSplitter,1,2,WS_CHILD|WS_VI SIBLE,m_wndSplitter.IdFromRowCol(0,1))||!m_wndSplitter2.CreateView(0,0, RUNTIME_CLASS(CDisplayView),CSize(350,240),pContext)||!m_wndSplitter2.Cre ateView(0,1,RUNTIME_CLASS(CPictureView), CSize(100, 100), pContext))

{

m_wndSplitter.DestroyWindow();

return FALSE;

}

return TRUE;

// return CFrameWnd::OnCreateClient(lpcs, pContext); //注释掉原有的响应函数⑦在Mainfrm.h中添加以上三个视图类的头文件及一个分割类的头文件:

#include "ControlForm.h"

#include "MySplitter.h"

#include"DisplayView.h"

#include"PictureView.h"

⑧将CMySplitter的构造函数与析构函数改为public属性。

分割后效果如下图所示:分割后的视图从左到右依次对应为CControlForm类、C DisplayView类、CPictureView类。

3.CDisplayview类中文字旋转的实现:

①利用ClassWizard类向导为CDisplayView类生成消息WM_CREA TE的消息处理函数,通过设置定时器在指定的时间间隔向窗口发送WM_TIMER消息。

SetTimer(1,200,NULL); // 启动定时器

②在文件DisplayView.cpp开始位置定义一个用户自定义消息:

#define WM_MYMESSAGE WM_USER+1

利用ClassWizard为CDisplayView类生成消息WM_TIME的消息处理函数:SendMessage(WM_MYMESSAGE);

③在类CDisplayView的定义中声明自定义消息处理函数:

afx_msg LRESULT OnMyMessage(WPARAM wParam, LPARAM lParam); 在文件DisplayView.cpp消息映射BEGIN_MESSAGE_MAP 和END_MESSAGE_MAP之间添加自定义消息映射宏:

ON_MESSAGE(WM_MYMESSAGE,OnMyMessage)

④在类CDisplayView的定义中声明一个private属性、int型的成员变量m_dEscapement,它表示文本显示角度,并在类CDisplayView的构造函数中初始化:m_dEscapement=0;

⑤利用ClassWizard为CDisplayView类生成消息WM_DESTROY的消息处理函数,在销毁已创建的定时器:KillTimer(1);

⑥在文件DisplayView.cpp中手工添加自定义消息处理函数实现代码,完成以动画形式旋转显示一行文本的功能。

LRESULT CDisplayView::OnMyMessage(WPARAM wParam,LPARAM lParam) {

CClientDC dc(this);

m_dEacapement=(m_dEacapement+100)%3600;

CFont fontRotate;

fontRotate.CreateFont(30,0,m_dEacapement,0,0,0,0,0,0,0,0,0,0,0);

CFont *pOldFont=dc.SelectObject(&fontRotate);

CRect rClient;

GetClientRect(rClient);

dc.FillSolidRect(&rClient,RGB(255,255,255));

dc.TextOut(rClient.right/2,rClient.bottom/2,"谢臻杰");

dc.SelectObject(pOldFont);

return 0;

}

https://www.doczj.com/doc/be16659306.html,ontrolForm中对控件的使用:

①为ID为IDD_DIALOG1的对话框资源添加如图所示的控件:

②要实现这些控件对CDisplayView类的操作,中间就必须有个“桥梁”,这就要用到指针了,在CControlForm类中通过CDisplayView类的指针访问其中的变量,从而使的CDisplayView中产生相应的效果,当然也可以通过文档类作为“桥梁”,将变量传到文档类,然后再由文档类传到CDisplayView,下面介绍步骤:

A:为CControlForm类中变量添加如下变量:m_back_color(背景色),m_text(文字),m_text_color(文字颜色),m_zihao(字号),m_velocity(转速),m_picDraw(波形的输出)。

B:在ControlForm.cpp文件中添加全局变量:

CString m_t_color, m_b_color, m_zih="40", m_velo="30"; //全局变量

C:使用ClassWizard类向导添加关于四个控件的响应函数,分别用于选择字体颜色,背景颜色,字号,转速,如下:

void CControlForm::OnSelendoktextcolor() //字体颜色选择响应函数

{

// TODO: Add your control notification handler code here

int sel=m_text_color.GetCurSel();//得到当前选择的索引值

m_text_color.GetLBText(sel,m_t_color);//当前索引的对应文本放在m_t_color

}

void CControlForm::OnSelendokbackgroundcolor() //背景颜色选择响应函数

{

// TODO: Add your control notification handler code here

int sel=m_back_color.GetCurSel();//得到当前选择的索引值

m_back_color.GetLBText(sel,m_b_color);//当前索引的对应文本放在m_b_color

}

void CControlForm::OnSelendok_zihao() //字号选择响应函数

{

// TODO: Add your control notification handler code here

int sel=m_zihao.GetCurSel();//得到当前选择的索引值

m_zihao.GetLBText(sel,m_zih);//当前索引的对应文本放在m_zih

}

void CControlForm::OnSelendok_velocity() //转速

{

// TODO: Add your control notification handler code here

int sel=m_velocity.GetCurSel();//得到当前选择的索引值

m_velocity.GetLBText(sel,m_velo);//当前索引的对应文本放在m_velo }

这样,所选择的值被传到了刚刚定义的全局变量。

D:为文档类CXZJ_22Doc添加变量:CString text ; CString t_color ; CString b_color; CString zihao; CString velocity;用于存储由CControlForm 传来的值。

E:为“刷新”按钮控件添加鼠标单击消息响应函数:

void CControlForm::Onfresh()

{

// TODO: Add your control notification handler code here

CXZJ_22Doc* pDoc = DYNAMIC_DOWNCAST(CXZJ_22Doc,GetDocument());

if(pDoc != NULL)

{

UpdateData(TRUE);

pDoc->text = m_text; //文字内容变量

pDoc->t_color = m_t_color;//文字颜色变量

pDoc->b_color = m_b_color;//背景颜色变量

pDoc->zihao = m_zih;//字号变量

pDoc->velocity =m_velo;//转速变量

pDoc->UpdateAllViews(this);

}

}

这样,通过指针,将全局变量的值给了文档类中的成员变量。

F:为CDisplayView添加全局变量:int text_r = 0,text_g = 0,text_b = 0,back_r = 255,back_g = 255,back_b = 255; //全局变量

G:更改CDisplayView中的控制文字旋转的函数:

LRESULT CDisplayView::OnMyMessage(WPARAM wParam,LPARAM lParam) {

//CControlForm my;

// CMainFrame *pFrame=(CMainFrame*)GetParentFrame();

CXZJ_22Doc *pDoc=GetDocument();//获得doc指针

//字色选择----------------------------------------------------------------------- if(pDoc->t_color=="红")

text_r =255,text_g = 0,text_b =0;

else if(pDoc->t_color=="蓝")

text_r =0,text_g = 0,text_b =255;

else if(pDoc->t_color=="绿")

text_r =0,text_g = 255,text_b =0;

else if(pDoc->t_color=="黑")

text_r = 0,text_g = 0,text_b = 0;

else if(pDoc->t_color=="白")

text_r = 255,text_g = 255,text_b = 255;

else if(pDoc->t_color=="黄")

text_r = 255,text_g = 255,text_b = 0;

else if(pDoc->t_color=="紫")

text_r = 255,text_g = 0,text_b = 255;

else if(pDoc->t_color=="青")

text_r = 0,text_g = 255,text_b = 255;

else

text_r = 0,text_g = 0,text_b = 0;

//背景色选择-------------------------------------------------------------------------- if(pDoc->b_color=="红")

back_r =255,back_g = 0,back_b =0;

else if(pDoc->b_color=="蓝")

back_r =0,back_g = 0,back_b =255;

else if(pDoc->b_color=="绿")

back_r =0,back_g = 255,back_b =0;

else if(pDoc->b_color=="黑")

back_r = 0,back_g = 0,back_b = 0;

else if(pDoc->b_color=="白")

back_r = 255,back_g = 255,back_b = 255;

else if(pDoc->b_color=="黄")

back_r = 255,back_g = 255,back_b = 0;

else if(pDoc->b_color=="紫")

back_r = 255,back_g = 0,back_b = 255;

else if(pDoc->b_color=="青")

back_r = 0,back_g = 255,back_b = 255;

else

back_r = 255,back_g = 255,back_b = 255;

//----------------------------------------------------

if(qx=="是")

x = 1;

else if(qx=="否")

x = 0;

else x = 0;

if(xhx=="是")

y = 1;

else if(qx=="否")

y = 0;

else y = 0;

if(scx=="是")

z = 1;

else if(scx=="否")

z = 0;

else z = 0;

CClientDC dc(this);

m_dEscapement=(m_dEscapement-atoi(pDoc->velocity))%3600;//文本显示角度(转速)

CFont fontRotate;

fontRotate.CreateFont(0-atoi(pDoc->zihao),0,m_dEscapement,0,0,x,y,z,0,0,0,0,0,0);

CFont *pOldFont=dc.SelectObject(&fontRotate);

CRect rClient;

GetClientRect(rClient);

dc.FillSolidRect(&rClient,RGB( back_r,back_g,back_b));//背景颜色

dc.SetTextColor(RGB(text_r ,text_g ,text_b)); //字体颜色

dc.TextOut(rClient.right/2,rClient.bottom/2,pDoc->text);

dc.SelectObject(pOldFont);

return 0;

}

说明:a:新建的基于Cview类的视图类中不含GetDocument()的函数,需手动添加,对照CXZJ_22View添加所有与GetDocument()相关的东西.

b:CXZJ_22Doc *pDoc=GetDocument();//获得doc指针,可在此直接访问doc类中的变量;这样完成了CControlForm类向CDisplayView类的传递。

③波形显示:

A:在ControlForm.h文件中的CControlForm类声明上面添加宏定义:

#define POINT_COUNT 100 //此符号常量的意义是波形的点数

B: 在ControlForm.h文件中为CControlForm类添加成员数组:

int m_nzValues[POINT_COUNT]; //此数组用于存放波形数据。

C:在CControlForm类的构造函数中为数组m_nzValues的元素赋初值:// 将数组m_nzValues的元素都初始化为0

memset(m_nzValues, 0, sizeof(int) * POINT_COUNT);

D:在CControlForm的初始化成员函数CControlForm::OnInitialUpdate()中,构造随机数生成器,并启动定时器。CControlForm::OnInitialUpdate()修改如下:void CControlForm::OnInitialUpdate()

{

CFormView::OnInitialUpdate();

// TODO: Add your specialized code here and/or call the base class

// 以时间为种子来构造随机数生成器

srand((unsigned)time(NULL));

// 启动定时器,ID为1,定时时间为200ms

SetTimer(1, 200, NULL);

// return TRUE; // return TRUE unless you set the focus to a control

}

E:为CControlForm类添加波形绘制的成员函数CControlForm::DrawWave(CDC *pDC, CRect &rectPicture),参数分别为设备上下文指针和绘图的矩形区域。(注意:需要先在该类的消息映射宏中声明:afx_msg void DrawWave(CDC *pDC, CRect &rectPicture);)

void CControlForm::DrawWave(CDC *pDC, CRect &rectPicture)

{

float fDeltaX; // x轴相邻两个绘图点的坐标距离

float fDeltaY; // y轴每个逻辑单位对应的坐标值

int nX; // 在连线时用于存储绘图点的横坐标

int nY; // 在连线时用于存储绘图点的纵坐标

CPen newPen; // 用于创建新画笔

CPen *pOldPen; // 用于存放旧画笔

CBrush newBrush; // 用于创建新画刷

CBrush *pOldBrush; // 用于存放旧画刷

// 计算fDeltaX和fDeltaY

fDeltaX = (float)rectPicture.Width() / (POINT_COUNT - 1);

fDeltaY = (float)rectPicture.Height() / 80;

// 创建黑色新画刷

newBrush.CreateSolidBrush(RGB(0,0,255));

// 选择新画刷,并将旧画刷的指针保存到pOldBrush

pOldBrush = pDC->SelectObject(&newBrush);

// 以黑色画刷为绘图控件填充黑色,形成黑色背景

pDC->Rectangle(rectPicture);

// 恢复旧画刷

pDC->SelectObject(pOldBrush);

// 删除新画刷

newBrush.DeleteObject();

// 创建实心画笔,粗度为1,颜色为绿色

newPen.CreatePen(PS_SOLID, 1, RGB(0,255,0));

// 选择新画笔,并将旧画笔的指针保存到pOldPen

pOldPen = pDC->SelectObject(&newPen);

// 将当前点移动到绘图控件窗口的左下角,以此为波形的起始点

pDC->MoveTo(rectPicture.left, rectPicture.bottom);

// 计算m_nzValues数组中每个点对应的坐标位置,并依次连接,最终形成曲线

for (int i=0; i

{

nX = rectPicture.left + (int)(i * fDeltaX);

nY = rectPicture.bottom - (int)(m_nzValues[i] * fDeltaY);

pDC->LineTo(nX, nY);

}

// 恢复旧画笔

pDC->SelectObject(pOldPen);

// 删除新画笔

newPen.DeleteObject();

}

F:在WM_TIMER消息的响应函数中添加对波形数据的定时处理和对波形的定时绘制:void CControlForm::OnTimer(UINT nIDEvent)

{

// TODO: Add your message handler code here and/or call default

CRect rectPicture;

// 将数组中的所有元素前移一个单位,第一个元素丢弃

for (int i=0; i

{

m_nzValues[i] = m_nzValues[i+1];

}

// 为最后一个元素赋一个80以内的随机数值(整型)

m_nzValues[POINT_COUNT-1] = rand() % 80;

// 获取绘图控件的客户区坐标

// (客户区坐标以窗口的左上角为原点,这区别于以屏幕左上角为原点的屏幕坐标)

m_picDraw.GetClientRect(&rectPicture);

// 绘制波形图

DrawWave(m_picDraw.GetDC(), rectPicture);

CFormView::OnTimer(nIDEvent);

}

G:CControlForm类添加WM_DESTROY消息的处理函数,并修改如下:KillTimer(1);//销毁定时器

效果图如下:

④:CPictureView类中的一些变化的实现:类似于对CDisplayView类的操作,也通过指针来与CControlForm与之相联系。

A:在CPictureView类声明中定义变量:int m_vr;

B:在CPictureView类中添加WM_TIMER消息,定时重绘红色线:

void CPictureView::OnTimer(UINT nIDEvent)

{

// TODO: Add your message handler code here and/or call default

CXZJ_22Doc *pDoc=GetDocument();//获得doc指针

m_vr =atoi (pDoc->velocity);

CClientDC dc(this);

CPen pen (PS_SOLID, 2, RGB (255, 0, 0));

CPen* pOldPen = dc.SelectObject (&pen);

dc.MoveTo(5,400-m_vr);

// dc.;

dc.LineTo(800,400-m_vr);

CView::OnTimer(nIDEvent);

}

C:重写CPictureView类的OnCreat函数:SetTimer(1,30,NULL);

D:在CPictureView类中添加WM_DESTROY消息,销毁定时器:KillTimer(1); E:添加OnPaint(),画出静态的图:

void CPictureView::OnPaint()

{

CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here

dc.MoveTo(0,400);//x轴

dc.LineTo(400,400);

dc.MoveTo(5,400);//y轴

dc.LineTo(5,50);

dc.MoveTo(5,50);//y箭头

dc.LineTo(10,55);

dc.MoveTo(5,50);//y箭头

dc.LineTo(0,55);

dc.MoveTo(400,400);//x箭头

dc.LineTo(395,395);

dc.MoveTo(400,400);//x箭头

dc.LineTo(395,405);

dc.TextOut(400,410,"时间/t");

dc.TextOut(5,35,"转速/v");

dc.TextOut(5,410,"0");

for( int i = 0;i<10;i++)

{

dc.MoveTo(5,100+i*30);

dc.LineTo(10,100+i*30);

dc.TextOut(10,100+i*30-5,itoa(300-i*30,str,10));

}

dc.TextOut(200,5,"转速坐标示意图");

// Do not call CView::OnPaint() for painting messages

}

⑤菜单栏的编写:

A:添加菜单栏如图,更改子菜单“更多字体样式”的ID为ID_para_set:

B:新建对话框资源Ctanchukuang,新建对话框资源,ID为IDD_DIALOG3,添加如图所示的控件:

C:利用类向导在CMainFrame中添加消息如图所示,建立一个模态对话框(Ctanchukuang):

代码:void CMainFrame::Onparaset()

{

// TODO: Add your command handler code here

MessageBox("你点击了参数设置,将弹出参数设置对话框!!!");

Ctanchukuang myDlg;

myDlg.DoModal();

}

这样,点击“更多字体样式后”就可以弹出一个模态对话框。下面来介绍这个模态对话框的控件是怎么实现对CDisplayView的字体变化的操作的。

⑥Ctanchukuang对CDisplayView的操作,这里未使用先前的通过文档类搭桥,而是直接获取CDisplayView类的指针:

A:添加Ctanchukuang中控件的变量m_qingx(控制文字倾斜),m_shancx(删除线),m_xiahx(下划线),如图:

B:在tanchukuang.cpp中添加全局变量:CString m_qx,m_scx,m_xhx;

C:添加三个消息选择框的响应函数:

void Ctanchukuang::OnSelendo_kqingx() //倾斜

{

// TODO: Add your control notification handler code here

int sel=m_qingx.GetCurSel();//得到当前选择的索引值

m_qingx.GetLBText(sel,m_qx);//当前索引的对应文本放在m_qx

}

void Ctanchukuang::OnSelendok_shancx() //删除线

{

// TODO: Add your control notification handler code here int sel=m_shancx.GetCurSel();//得到当前选择的索引值

m_shancx.GetLBText(sel,m_scx);//当前索引的对应文本放在m_scx }

void Ctanchukuang::OnSelendok_xiahx() //下划线

{

// TODO: Add your control notification handler code here int sel=m_xiahx.GetCurSel();//得到当前选择的索引值

m_xiahx.GetLBText(sel,m_xhx);//当前索引的对应文本放在m_xhx

}

D:在CDisplayView类声明中添加成员变量CString qx,scx,xhx;// 详见CDisplayView 的OnCreat函数。

E:添加“确定”控件对应的消息响应函数:

void Ctanchukuang::On_OK_fre()

{

CMainFrame* pwnd=(CMainFrame*)GetParent();

CDisplayView

*pView= (CDisplayView*)(pwnd->m_wndSplitter2).GetPane(0,0);

if(pView != NULL)

{

UpdateData(TRUE);

pView->qx = m_qx; //文字倾斜

pView->scx = m_scx;//文字删除线

pView->xhx= m_xhx;//文字下划线

}

}

⑦:工具栏:类似于菜单栏,先作出一个图标,命名ID为ID_open;

添加消息响应函数如图:

代码为:void CMainFrame::Onopen()

{

// TODO: Add your command handler code here

MessageBox("你点击了参数设置,将弹出参数设置对话框!!!");

Ctanchukuang myDlg;

myDlg.DoModal();

} 即与上面菜单栏的实现的功能一样,点击即弹出一个模态对话框。

⑧图标演示功能的子菜单项实现:

A:在CMianFrame类的声明中添加public:CBitmap m_bitmap;

A:添加一个BitMap型的图,ID为IDB_BITMAP1;

B:在CMainFrame::OnCreate中添加:

m_bitmap.LoadBitmap(IDB_BITMAP1);

GetMenu()->GetSubMenu(4)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_bi tmap,&m_bitmap);

⑨动态显示图标:

A:将资源编辑器中导入这四个图标,并定义其唯一的ID 号,IDI_ICON1,IDI_ICON2,IDI_ICON3,IDI_ICON5.

B:在CMainFrame类中,定义一个图标句柄数组成员变量,用来存放这三幅图标的句柄,如:Private:HICON m_hIcons[3];

C:在CMainFrame类的OnCreate函数中利用LoadIcon函数加载四个图标:SetClassLong(m_hWnd,GCL_HICON,(LONG)LoadIcon(NULL,IDI_ERROR));

m_hIcons[0] = LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDI_ICON1));

m_hIcons[1] = LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON2));

m_hIcons[2] = LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON3));

m_hIcons[3] = LoadIcon(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_ICON5));

SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[0]);

SetTimer(1,1000,NULL);

D:在CMainFrame类中添加定时器响应函数:

static int index = 2;

SetClassLong(m_hWnd,GCL_HICON,(LONG)m_hIcons[index]);

index=++index%4;

⑩:状态栏(添加时间和进度条):

A:新增时间和进度条的字符串资源ID,如图:

B:更改indicators的值

static UINT indicators[] =

{

ID_SEPARATOR, // status line indicator

IDS_TIMER, //时间

IDS_PROGRESS, //进度条

ID_INDICATOR_CAPS,

ID_INDICATOR_NUM,

ID_INDICATOR_SCRL,

};

C:在OnTimer添加定时器响应函数:

CTime t = CTime::GetCurrentTime();

CString str = t.Format("%H:%M:%S");

CClientDC dc(this);

CSize sz = dc.GetTextExtent(str);

m_wndStatusBar.SetPaneInfo(1,IDS_TIMER,SBPS_NORMAL,sz.cx);

m_wndStatusBar.SetPaneText(1,str);

这样时间便显示出来了。

D:在CMainFrame类中的声明中添加:CProgressCtrl m_progress;

F:在OnTimer中添加:

m_progress.SetStep(25);//进度条的步进值25,4秒完成一次进度条显示循环。

m_progress.StepIt();

G:重载OnPaint()函数:

void CMainFrame::OnPaint()

{

CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here

CRect rect;

int pos=0;

m_wndStatusBar.GetItemRect(2,&rect);

if(!m_progress.m_hWnd)

m_progress.Create(WS_CHILD | WS_VISIBLE |PBS_SMOOTH,rect,&m_wndStatusBar,123);

else

m_progress.MoveWindow(rect);

m_progress.SetPos(0);

// Do not call CFrameWnd::OnPaint() for painting messages

}

该进度条跟随了动态图标显示进度。

⑾状态栏(显示鼠标所在的位置坐标):

A:在CPictureView中添加On_WM_MouseMove消息:

void CPictureView::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CString str; //定义一个CString对象

str.Format("鼠标坐标(转速坐标图中):x2=%d,y2=%d",point.x,point.y); //让str按一定的形式接受两个点的坐标

((CMainFrame*)GetParentFrame())->SetMessageText(str);//通过

获取框架类的指针,从而获取状态栏,然后通过函数SetWindowText()这个函数

显示到指示行需要注意的是,这里用到了(CMainFrame*)这个强制转换,需要

包含"MainFrm.h"这个头文件。

CView::OnMouseMove(nFlags, point);

}

B:同理:在CDisplayView类中添加On_WM_MouseMove消息:

void CDisplayView::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CString str; //定义一个CString对象

str.Format("鼠标坐标(文字旋转视图中):

x1=%d,y1=%d",point.x,point.y); //让str按一定的形式接受两个点的坐标 ((CMainFrame*)GetParentFrame())->SetMessageText(str); //通过

获取框架类的指针,从而获取状态栏,然后通过函数SetWindowText()这个函数

显示到指示行需要注意的是,这里用到了(CMainFrame*)这个强制转换,需要

包含"MainFrm.h"这个头文件。

CView::OnMouseMove(nFlags, point);

}

C:在CPictureView中添加On_WM_MouseMove消息:

void CControlForm::OnMouseMove(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

CString str; //定义一个CString对象

str.Format("鼠标坐标(转速坐标图中):x2=%d,y2=%d",point.x,point.y); //让str按一定的形式接受两个点的坐标

((CMainFrame*)GetParentFrame())->SetMessageText(str);//通过

获取框架类的指针,从而获取状态栏,然后通过函数SetWindowText()这个函数

显示到指示行需要注意的是,这里用到了(CMainFrame*)这个强制转换,需要

包含"MainFrm.h"这个头文件。

CView::OnMouseMove(nFlags, point);

}

这样,当鼠标移动在这三个视图中移动时,就会状态栏显示出鼠标的位置,

表现出不同的状态。

总体效果图:

1.在左边控件选择选项,可改变中间视图的文字,文字颜色,背景颜色,字号,

旋转速率,右边作出的坐标图与左边同步。

2.左边显示由随机数产生的波形。

3.状态栏显示鼠标位置,当前时间。

4.进度条跟随动态图标的展示过程。

5.打开工具栏或菜单栏“应用”的子菜单,会弹出个对话框。里面可选择更改

字体的样式,如图:

五、设计心得:

1、通过这次课程设计,使我对MFC有了更进一步的了解,对消息的机制有了更深刻的认识,对MFC中的应用结构类、菜单类、窗口以及对话框和控件有了更深刻的认识。

2、更加深了对VC++的理解,对编程能力有了进一步的提升。

3、设计中虽然遇到了这样那样的问题,但通过自己的努力,这些问题都得到了解决,对自己是一个莫大的鼓励。

相关主题
文本预览
相关文档 最新文档