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类了。
- MFC对话框(Dialog类)中添加客户区(View类)实现绘图
- mfc中对话框访问view类成员变量
- mfc中dialog中嵌入view
- MFC的对话框中使用OpenGL绘图
- MFC的对话框中使用OpenGL绘图
- VC++ MFC view类中添加鼠标响应
- VS2008 MFC对话框工程中,在对话框中添加ActiveX控件生成类的问题
- View视图类与Dialog对话框通信实例
- 对话框客户区实现拖动
- 对话框类调用视图类并绘图(基于MFC)
- 更改MFC对话框dialog默认的窗口类名classname
- MFC中Dialog中添加菜单
- mfc里为对话框程序中的Dialog添加菜单
- mfc对话框类中多线程
- 实现MFC扩展DLL中导出类和对话框
- 一步一步实现MFC扩展DLL中导出类和对话框
- 实现MFC扩展DLL中导出类和对话框
- 实现MFC扩展DLL中导出类和对话框
- 二进制加法(算导课后习题)
- 控件的layer边框用法
- Google Code Jam 2015 Round 1A: Problem A. Mushroom Monster
- CSU 1506 - Double Shortest Paths(网络流’最小费用流)
- ORACLE9i_性能调优基础九(Managing Statistics)
- MFC对话框(Dialog类)中添加客户区(View类)实现绘图
- HDU 4035 Maze (概率dp)
- 嵌入式CGI 与HTML的数据交换
- 10 CI where数据库操作 以及查询最后一次执行的sql语句
- Find Minimum in Rotated Sorted Array - LeetCode 153
- POJ 3461 Oulipo
- IOS中拨打电话
- sql server用sql导出数据库字典
- 现有一个1G左右的日志文件,大约有500多万行, 用php返回最后几行的内容