社区
界面
帖子详情
讨论:OnInitUpdate、OnUpdate、OnDraw与OnPaint!
bluwindhrt
2004-08-06 12:48:40
一个项目终于到界面了,可我界面不行,这几个“On”弄得我七荤八素的,大家都来讨论讨论吧!
...全文
305
7
打赏
收藏
讨论:OnInitUpdate、OnUpdate、OnDraw与OnPaint!
一个项目终于到界面了,可我界面不行,这几个“On”弄得我七荤八素的,大家都来讨论讨论吧!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
geggegeda
2004-12-16
打赏
举报
回复
学习中。。。。。。。。。
快乐鹦鹉
2004-08-06
打赏
举报
回复
OnInitUpdate是VIEW的初始化
OnUpdate是文档多视时,响应其它视图的改变
OnDraw和OnPaint都是绘图。OnPaint调用OnDraw,并且调用OnPrepareDC
bluwindhrt
2004-08-06
打赏
举报
回复
嗯,很好很好!很清楚!
多谢小三老大!
为了让更多人看到,暂时不结贴!
kpsh
2004-08-06
打赏
举报
回复
解释的很清楚了,学习...
lixiaosan
2004-08-06
打赏
举报
回复
OnDraw()和OnPaint()好象兄弟俩,因为它们的工作类似。
至于不见了的问题简单,因为当你的窗口改变后,会产生无效区域,这个无效的区域需要重画。一般Windows回发送两个消息WM_PAINT(通知客户区有变化)和WM_NCPAINT(通知非客户区有变化)。非客户区的重画系统自己搞定了,而客户区的重画需要我们自己来完成。这就需要OnDraw()或OnPaint()来重画窗口。
OnDraw()和OnPaint()有什么区别呢?
首先:
我们先要明确CView类派生自CWnd类。而OnPaint()是CWnd的类成员,同时负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,并且没有响应消息的功能。这就是为什么你用VC成的程序代码时,在视图类只有OnDraw没有OnPaint的原因。
其次:
我们在第《每天跟我学MFC》3的开始部分已经说到了。要想在屏幕上绘图或显示图形,首先需要建立设备环境DC。其实DC是一个数据结构,它包含输出设备(不单指你17寸的纯屏显示器,还包括打印机之类的输出设备)的绘图属性的描述。MFC提供了CPaintDC类和CWindwoDC类来实时的响应,而CPaintDC支持重画。
当视图变得无效时(包括大小的改变,移动,被遮盖等等),Windows 将 WM_PAINT 消息发送给它。该视图的 OnPaint 处理函数通过创建 CPaintDC 类的DC对象来响应该消息并调用视图的 OnDraw 成员函数。通常我们不必编写重写的 OnPaint 处理成员函数。
///CView默认的标准的重画函数
void CView::OnPaint()
{
CPaintDC dc(this);
OnPreparDC(&dc);
OnDraw(&dc); //调用了OnDraw
}
既然OnPaint最后也要调用OnDraw,因此我们一般会在OnDraw函数中进行绘制。下面是一个典型的程序
///视图中的绘图代码首先检索指向文档的指针,然后通过DC进行绘图调用。
void CMyView::OnDraw( CDC* pDC )
{
CMyDoc* pDoc = GetDocument();
CString s = pDoc->GetData(); // Returns a CString
CRect rect;
GetClientRect( &rect );
pDC->SetTextAlign( TA_BASELINE | TA_CENTER );
pDC->TextOut( rect.right / 2, rect.bottom / 2,
s, s.GetLength() );
}
最后:
现在大家明白这哥俩之间的关系了吧。因此我们一般用OnPaint维护窗口的客户区(例如我们的窗口客户区加一个背景图片),用OnDraw维护视图的客户区(例如我们通过鼠标在视图中画图)。当然你也可以不按照上面规律来,只要达到目的并且没有问题,怎么干都成。
补充:
我们还可以利用Invalidate(),ValidateRgn(),ValidateRect()函数强制的重画窗口,具体的请参考MSDN吧。
lixiaosan
2004-08-06
打赏
举报
回复
一般来说用户的输入/输出基本都是通过视进行,但一些例外的情况下可能需要和框架直接发生作用,而在多视的情况下如何在视之间传递数据。
在使用菜单时大家会发现当一个菜单没有进行映射处理时为禁止状态,在多视的情况下菜单的状态和处理映射是和当前活动视相联系的,这样MFC可以保证视能正确的接收到各种消息,但有时候也会产生不便。有一个解决办法就是在框架中对消息进行处理,这样也可以保证当前文档可以通过框架得到当前消息。
在用户进行输入后如何使视的状态得到更新?这个问题在一个文档对应一个视图时是不存在的,但是现在有一个文档对应了两个视图,当在一个视上进行了输入时如何保证另一个视也得到通知呢?MFC的做法是利用文档来处理的,因为文档管理着当前和它联系的视,由它来通知各个视是最合适的。让我们同时看两个函数:
void CView::OnUpdate( CView* pSender, LPARAM lHint, CObject* pHint )
void CDocument::UpdateAllViews( CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL )
当文档的UpdateAllViews被调用时和此文档相关的所有视的OnUpdate都会被调用,而参数lHint和pHint都会被传递。这样一来发生改变视就可以通知其他的兄弟了。那么还有一个问题:如何在OnUpdate中知道是那个视图发生了改变呢,这就可以利用pHint参数,只要调用者将this指针赋值给参数就可以了,当然完全可以利用该参数传递更复杂的结构。
视的初始化,当一个文档被打开或是新建一个文档时视图的CView::OnInitialUpdate()会被调用,你可以通过重载该函数对视进行初始化,并在结束前调用父类的OnInitialUpdate,因为这样可以保证OnUpdate会被调用。
文档中内容的清除,当文档被关闭时(比如退出或是新建前上一个文档清除)void CDocument::DeleteContents ()会被调用,你可以通过重载该函数来进行清理工作。
在单文档结构中上面两点尤其重要,因为软件运行文档对象和视对象只会被产生并删除一次。所以应该将上面两点和C++对象构造和构析分清楚。
最后将一下文档模板(DocTemplate)的作用,文档模板分为两类单文档模板和多文档模板,分别由CSingleDocTemplate和CMultiDocTemplate表示,模板的作用在于记录文档,视,框架之间的对应关系。还有一点就是模板可以记录应用程序可以打开的文件的类型,当打开文件时会根据文档模板中的信息选择正确的文档和视。模板是一个比较抽想的概念,一般来说是不需要我们直接进行操作的。
当使用者通过视修改了数据时,应该调用GetDocument()->SetModifiedFlag(TRUE)通知文档数据已经被更新,这样在关闭文档时会自动询问用户是否保存数据。
bluwindhrt
2004-08-06
打赏
举报
回复
可以说得详细点吗?
累了,不想翻MSDN!
用MFC画圆,很标准的程序
可以覆盖`On
Update
`函数来处理这种情况,当坐标或半径发生变化时,调用`Invalidate()`或`InvalidateRect(NULL, TRUE)`来标记视图区域需要重新绘制。 4. **重绘逻辑**: 在MFC中,`On
Paint
`函数会在需要重绘时被...
MFC编程 记事本
4. 文档和视图之间的数据交换通过
OnDraw
()和On
Update
()等函数实现。 5. 程序退出时,CWinApp的ExitInstance()清理资源。 通过这个简单的记事本程序,开发者可以学习到MFC的基础知识,包括类的继承、消息映射、控件...
构建,重构二叉树并输出
同时,为了使图形动态更新,可能还需要实现On
Update
()和On
Paint
()等函数。 总结来说,构建和重构二叉树是理解数据结构和算法的关键部分,而使用MFC进行图形化输出则可以提供直观的视觉辅助,帮助我们更好地理解和...
DlgTest.rar_MFC 文档视图
通过ON_COMMAND()和ON_
UPDATE
_COMMAND_UI()宏,开发者可以指定命令的处理函数和更新UI的函数。 9. **视图之间的通信**:在多视图环境中,视图之间可能需要交换信息。MFC提供了各种机制,如消息广播、CWnd::Post...
hermite曲线,MFC实现
4. **重绘机制**:当控制点改变时,需要调用`Invalidate()`或`InvalidateRect()`方法来标记视图区域为无效,触发WM_
PAINT
消息,然后在`On
Paint
()`回调中重新计算并绘制Hermite曲线。 5. **视图类的重写**:在MFC中...
界面
15,980
社区成员
115,867
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章