基于对话框的MFC程序中加视图

这个一个比较神奇的问题,起因是有一次程序需要,需要将显示图像的区域变成有滚动条形式,这就不得不考虑用scrollview类来实现。

看网上的一些方法,主要有两种实现形式:一种是直接在对话框中创建视图。 还有一种是用子类化。 

 先谈第一种: 

先在对话框中定义自己的视图对象 
MyView *m_pView; 
在对话框的CPP中 

  1 CAboutDlg::CAboutDlg()   :   CDialog(CAboutDlg::IDD)     //构造函数 

 2  
 3 m_pView   =   NULL; 
 4 
 5  void   CAboutDlg::OnDestroy()   
 6 
 7  if(m_pView) 
 8 
 9 m_pView-> DestroyWindow(); 
10 delete   m_pView; 
11 
12 CDialog::OnDestroy(); 
13 
14 BOOL   CAboutDlg::OnInitDialog()   
15 
16 CDialog::OnInitDialog(); 
17 
18 CRect   rect; 
19 GetClientRect(&rect); 
20 
21  if(!m_pView) 
22 
23 m_pView   =   new   MyView; 
24 m_pView-> Create(NULL,NULL,WS_CHILD|WS_VISIBLE,rect,this,AFX_IDW_PANE_LAST); 
25 
26 return   TRUE; 
27 } 

 第二重方法是子类化: 

在对话框上放一个简单空间比如RECTANGLE,然后在对话框重定义视图的对象 
MyView *m_pView; 
在对话框的CPP中 

  1 CAboutDlg::CAboutDlg()   :   CDialog(CAboutDlg::IDD) 

 2 
 3 m_pView   =   NULL; 
 4 
 5 BOOL   CAboutDlg::OnInitDialog()   
 6 
 7 CDialog::OnInitDialog(); 
 8 
 9 if(!m_pView) 
10 
11 m_pView   =   new   MyView; 
12 m_pView-> SubclassDlgItem(IDC_STATIC1,this); 
13 
14 
15 return   TRUE; 
16 
17 void   CAboutDlg::OnDestroy()   
18 
19 if(m_pView) 
20 
21 m_pView-> UnsubclassWindow(); 
22 delete   m_pView; 
23 
24 CDialog::OnDestroy(); 
25 
26 在视图中重载OnEraseBkgnd函数 
27 BOOL   MyView::OnEraseBkgnd(CDC*   pDC)   
28 
29 CRect   rect; 
30 CBrush   Brush(RGB(255,255,255)); 
31 GetClientRect(&rect); 
32 pDC-> FillRect(&rect,&Brush); 
33 return   TRUE; 
34 

 我是用第一个方法实现的,第二个方法没试过,有兴趣可以试下。其实不要把视图当作多么高深的东西,视图其实也可以简单看做一个控件,像其他普通控件,如按钮等一样需要初始化,创建,使用,销毁。就是这么简单而已。

希望对你有用! 

原文地址:https://www.cnblogs.com/xweiwei/p/1901692.html