计算机窗口技术课程设计报告
一.设计目的:
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、设计中虽然遇到了这样那样的问题,但通过自己的努力,这些问题都得到了解决,对自己是一个莫大的鼓励。