采用MFC编制MVC模式之球体演示程序

duanmiao93

duanmiao93

2016-01-29 12:00

采用MFC编制MVC模式之球体演示程序,采用MFC编制MVC模式之球体演示程序

采用 MFC 编制 MVC 模式之球体演示程序

作者:haykey

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/cyuyanjiaocheng/)

下载源代码


  在传统面向过程的程序设计中,往往采用 Input-Processing-Output 模式,这“归功”于 DOS 操作系统的单任务。当 Windows 图形界面 OS 出现后,MVC(Model-View-Controller)模型更适合 Windows 图形界面程序的设计,它将数据处理和数据显示分离开,使维护,扩展系统更加灵活。其中,View:负责 显示数据,它从Model处获得数据然后显示。当然,一个Model会有用户可从不同角度来观察的多个View。Model:存储数据以及对数据进行各种运算和处理。Controller:负责接受用户输入,并且把用户输入转换成对 Model 的操作。因此Controller 可能会修改 Model 的数据,当数据修改后,更新 View。其结构示意图如下:




  一直采用MFC编程的朋友可能不太熟悉它,这是因为MFC的文档视图结构就是基于MVC的高层结构,这蒙蔽了我们的双眼。虽然MS替我们做了,我们还是有必要接触它,以在SDK or 其他地方有的放矢。我做了一个球体演示的例子,其界面如下:



  左侧两个表面积和体积Edit让使用者从文本的角度精确地观察,我们称其为TextView。右侧为从CStatic派生的CGraphicView,使得人们可直观地观察Sphere.对话窗口CMVCSphereDlg是控制器,来获取用户的键盘输入(输入半径后回车)和在Static上的鼠标点击与拖动(可动态调整球体半径并实时反馈球体变化)而CSphere类是模型,存储了球体半径和计算表面积,计算体积等处理半径数据的操作.
  现在让我们详细看看代码,来感受下Model,View,Controller之间如何关联,如何协同工作的。

class CSphere  {public:     ... ....    //更新Graphic-VIEW    BOOL UpdateGraphicView(HWND hWnd,const CRect &rect,BOOL bErase);    //更新Text-VIEW    void UpdateTextView();    //外界Controller的接口:设置球体半径    void SetRadius(float r);private:    //球体半径    float m_fRadius;    //计算球体表面积    float CalculateArea(float radius);    //计算球体体积    float CSphere::CalculateVolumn(float radius);};
  这里面 UpdateTextView,UpdateTextView 就是当用户输入新半径或拖动鼠标 Controller 捕获后通知 Model,Model 通知两个View更新显示。具体代码如下:
BOOL CSphere::UpdateGraphicView(HWND hWnd,const CRect &rect,BOOL bErase){    //data format examination    if(!::IsWindow(hWnd)||::IsRectEmpty(&rect))    {      AfxMessageBox("View is not created by now or rect is empty");      return false;    }    //get the window pointer from window handle    CWnd *pView = CWnd::FromHandle(hWnd);    if(pView == NULL)        return false;    //set graphic view''s radius in order to painting    ((CGraphicView*)pView)->SetRadius(m_fRadius);    bPaintSphere = true;//set paint tag true    //repaint    if(!::InvalidateRect(hWnd,&rect,bErase)&&   !::UpdateWindow(hWnd))    {      AfxMessageBox("UpdateView failed");      return true;    }        pView = NULL;    return false;}void CSphere::UpdateTextView(){   CMVCSphereDlg *parent = (CMVCSphereDlg *)AfxGetMainWnd();   CWnd *wnd1 = parent->GetDlgItem(IDC_SURFACE);   CWnd *wnd2 = parent->GetDlgItem(IDC_VOLUMN);      CString str;   str.Format("%.2f平方米",CalculateArea(m_fRadius));   wnd1->SetWindowText(str);   str.Empty();   str.Format("%.2f立方米",CalculateVolumn(m_fRadius));   wnd2->SetWindowText(str);}
CGraphicView中绘图关键代码如下:
void CGraphicView::OnPaint() {    ... .....    if(!bPaintSphere) dc.DrawText("球体演示",rect,DT_VCENTER|DT_CENTER|DT_SINGLELINE);    else{   int r=(int)m_radius;//半径取整   CPoint MiddlePoint = rect.CenterPoint();//以矩形框的中心为球心   int x=MiddlePoint.x;   int y=MiddlePoint.y;   oldpen = (CPen*)dc.SelectObject(&solid_pen);   oldbru = (CBrush*)dc.SelectObject(&brush);   dc.Ellipse(x-r,y-r,x+r,y+r);              //先画一个圆形          dc.SelectObject(&dash_pen);   dc.Arc(x-r/2,y-r,x+r/2,y+r,x,y-r,x,y+r);  //再画4个半圆弧   dc.Arc(x-r/2,y-r,x+r/2,y+r,x,y+r,x,y-r);   dc.Arc(x-r,y-r/2,x+r,y+r/2,x-r,y,x+r      
展开更多 50%)
分享

猜你喜欢

采用MFC编制MVC模式之球体演示程序

C语言教程 C语言函数
采用MFC编制MVC模式之球体演示程序

采用行写方式的聊天程序(之五)

PHP
采用行写方式的聊天程序(之五)

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

采用行写方式的聊天程序(之四)

PHP
采用行写方式的聊天程序(之四)

使用 MFC 编写打印程序

C语言教程 C语言函数
使用 MFC 编写打印程序

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

监视程序的编制

编程语言 网络编程
监视程序的编制

mvc模式分离javascript开发

Web开发
mvc模式分离javascript开发

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

利用CSS控制打印

利用CSS控制打印

DIESEL的概念及其函数

DIESEL的概念及其函数
下拉加载更多内容 ↓