MFC对话框(Dialog类)中添加客户区(View类)实现绘图

来源:互联网 发布:brew 卸载软件 编辑:程序博客网 时间:2024/06/05 07:53

注:本教程适合VisualStudio 2005及以上版本,不适合VC++6.0.

在对话框上画图可以通过添加控件来进行,但这种画图有一个严重弊端就是画图范围受控件范围控制,所以可以通过在对话框上动态创建视图类来达到目的。最终效果就是在对话框中创建一个和单文档窗口客户区有相同功能的区域。

视图窗口如何动态创建方法如下:

1,视图窗口的定位:在对话框上加一个静态文本控件(编辑框控件也可以,大小随意,不要修改任何参数),然后把视图创建在该控件之上。

2,动态创建视图类

1)通过项目|添加类添加一个派生自CSrollView类(CView类的子类)的视图类CDrawView。(IDE主窗口不能是资源编辑器,不然此时只能新建相关资源的类,转换到代码编辑器随便开个文件就可以。)

2)在对话框类的头文件中定义一个CDrawView类指针*m_pDrawView。

3)重写对话框类的OnInitDialog()函数。具体方法为在类视图中选中对话框类,在IDE右侧的属性页中点击“重写”(上部的菱形按钮),在下方的列表中点击添加OnInitDialog函数,来创建并重写此虚函数。

4)在OnInitDialog()中添加如下的代码

BOOL CDialogModify::OnInitDialog(){CDialog::OnInitDialog();// TODO:  在此添加额外的初始化UINT TargetCtrlID = IDC_STATIC;      CWnd *pWnd = this->GetDlgItem(IDC_STATIC);      CRect RectTargetCtrl;      pWnd->GetWindowRect(RectTargetCtrl);      pWnd->DestroyWindow();      this->ScreenToClient(RectTargetCtrl);      //在目标位置动态创建CScrollView      if (NULL==m_pModifyView)      {          return FALSE;      }     m_pModifyView = (CModifyView*)RUNTIME_CLASS(CModifyView)->CreateObject(); //这条语句不能少,有的教程中少了,会出错。    m_pModifyView->Create(NULL, NULL, AFX_WS_DEFAULT_VIEW|WS_VSCROLL|WS_HSCROLL, RectTargetCtrl, this, TargetCtrlID);      //使用CreateView创建的视图 不能自动调用OnInitialUpdate函数,需要人工调用OnInitialUpdate函数或者发送 WM_INITIALUPDATE消息    m_pModifyView->OnInitialUpdate();    // 使用CreateView创建的视图不会自动显示并且激活,需要人工操作     m_pModifyView->ShowWindow(SW_SHOW);  return TRUE;  // return TRUE unless you set the focus to a control// 异常: OCX 属性页应返回 FALSE}



5)重写两个基类的虚函数,添加两个消息响应函数并修改返回值信息。(不做这步会报assert错误)  

virtual void OnActivateFrame(UINT nState, CFrameWnd* pDeactivateFrame);

afx_msg int OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message); //添加CDrawView类消息WM_MOUSEACTIVATE的消息响应函数  

afx_msg void OnDestroy();//添加CDrawView类消息WM_DESTROY的消息响应函数  

virtual void PostNcDestroy(); //重写CDrawView类中的此函数将上面四个函数原来的返回值注释掉,修改为如下的值:  

void CModifyView::OnActivateFrame(UINT nState, CFrameWnd* pDeactivateFrame){// TODO: 在此添加专用代码和/或调用基类       //这个直接注释掉       //CScrollView::OnActivateFrame(nState, pDeactivateFrame);}


int CModifyView::OnMouseActivate(CWnd* pDesktopWnd, UINT nHitTest, UINT message){// TODO: 在此添加消息处理程序代码和/或调用默认值        //return CScrollView::OnMouseActivate(pDesktopWnd, nHitTest, message);       return CWnd::OnMouseActivate(pDesktopWnd, nHitTest, message);}


void CModifyView::PostNcDestroy(){// TODO: 在此添加专用代码和/或调用基类CWnd::PostNcDestroy();//CScrollView::PostNcDestroy();}
void CModifyView::OnDestroy(){//CScrollView::OnDestroy(); CWnd::OnDestroy();// TODO: 在此处添加消息处理程序代码}





此时,窗口客户区就创建完了,你可以像操作CView类一样去操作CDrawView类了。

1 0
原创粉丝点击