基于对话框的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 }
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 }
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 }
我是用第一个方法实现的,第二个方法没试过,有兴趣可以试下。其实不要把视图当作多么高深的东西,视图其实也可以简单看做一个控件,像其他普通控件,如按钮等一样需要初始化,创建,使用,销毁。就是这么简单而已。
希望对你有用!