怎么由cview 刷新得到cclientdc

用户名:wangliyong
文章数:10
访问量:14167
注册日期:
阅读量:1297
阅读量:3317
阅读量:580906
阅读量:464499
51CTO推荐博文
CWnd::OnPaint&
afx_msg void OnPaint( );
The framework calls this member function when Windows or an application makes a request to repaint a portion of an application’s window. The
message is sent when the
member function is called.
CView::OnDraw
virtual void OnDraw( CDC* pDC ) = 0;
Called by the framework to render an image of the document.
The framework calls this function to perform screen display, printing, and print preview, and it passes a different device context in each case. There is no default implementation.
You must override this function to display your view of the document.
If you need to distinguish between normal screen display and printing, call the
member function of the device context.
区别已经很明显。OnPaint()是CWnd的成员函数,所有CWnd的子类都有一份OnPaint,而OnDraw()则是CView类中声明的纯虚函数。OnPaint()响应WM_PAINT消息,OnDraw不响应任何消息,只是一个虚函数。CWnd的子类分为四大类:FrameWindows, Dialog Boxes, Views, Controls,因此除了View及其子类使用OnDraw()外,其余三类都使用OnPaint()来重画。OnPaint()的工作是'Screen Display',而OnDraw()则可以做'Screen display, printing, print preview'等工作。再看MFC源代码中如何做:void CView::OnPaint(){&&& // standard paint routine&&& CPaintDC dc(this);&&& OnPrepareDC(&dc);&&& OnDraw(&dc);}OnPaint()是CWnd类的非虚函数,CView中重载了该函数。从代码中可以看出,在CView响应WM_PAINT消息的情况下,在OnPaint中先调用了OnPrepareDC(),然后调用了OnDraw()。查MSDN,可以看到,OnPrepareDC()的作用是:framework中在OnDraw()之前调用它,或者在OnPrint中调用它,前者是为了准备屏幕显示,后者是为了打印。MFC中OnPrepareDC的源代码是:void CView::OnPrepareDC(CDC* pDC, CPrintInfo* pInfo){&&& ASSERT_VALID(pDC);&&& UNUSED(pDC); // unused in release builds&&& // Default to one page printing if doc length not known&&& if (pInfo != NULL)&&& &&& pInfo-&m_bContinuePrinting =&&& &&& &&& (pInfo-&GetMaxPage() != 0xffff || (pInfo-&m_nCurPage == 1));}这是CView中的定义,OnPrepareDC()是一个虚函数。完全可以改写它。在CView各子类中该函数的定义都不一样。
OnDraw()和OnPaint()
OnDraw()和OnPaint()兄弟
经常有朋友问这样的问题:我在视图画的图象或者文字,当窗口改变后为什么不见了?OnDraw()和OnPaint()两个都是解决上面的问题,有什么不同?
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&&&& CR
&&&& 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吧。
Onpaint和OnDraw的区别[转]
OnPaint是WM_PAINT消息的消息处理函数,在OnPaint中调用OnDraw,一般来说,用户自己的绘图代码应放在OnDraw中。
OnPaint()是CWnd的类成员,负责响应WM_PAINT消息。OnDraw()是CVIEW的成员函数,没有响应消息的功能.当视图变得无效时(包括大小的改变,移动,被遮盖等等),Windows发送WM_PAINT消息。该视图的OnPaint 处理函数通过创建CPaintDC类的DC对象来响应该消息并调用视图的OnDraw成员函数.OnPaint最后也要调用OnDraw,因此一般在OnDraw函数中进行绘制。
The WM_PAINT message is sent when the UpdateWindow or RedrawWindow member function is called.
在OnPaint中,将调用BeginPaint,用来获得客户区的显示设备环境,并以此调用GDI函数执行绘图操作。在绘图操作完成后,将调用EndPaint以释放显示设备环境。而OnDraw在BeginPaint与EndPaint间被调用。
1) 在mfc结构里OnPaint是CWnd的成员函数. OnDraw是CView的成员函数.2) OnPaint()调用OnDraw(),OnPrint也会调用OnDraw(),所以OnDraw()是显示和打印的共同操作。OnPaint是WM_PAINT消息引发的重绘消息处理函数,在OnPaint中会调用OnDraw来进行绘图。OnPaint中首先构造一个CPaintDC类得实例,然后一这个实例为参数来调用虚函数OnPrepareDC来进行一些绘制前的一些处理,比设置映射模式,最后调用OnDraw。而OnDraw和OnPrepareDC不是消息处理函数。所以在不是因为重绘消息所引发的OnPaint导致OnDraw被调用时,比如在OnLButtonDown等消息处理函数中绘图时,要先自己调用OnPrepareDC。 至于CPaintDC和CClientDC根本是两回事情 CPaintDC是一个设备环境类,在OnPaint中作为参数传递给OnPrepareDC来作设备环境的设置。真正和CClientDC具有可比性的是CWindowDC,他们一个是描述客户区域,一个是描述整个屏幕。如果是对CVIEW或从CVIEW类派生的窗口绘图时应该用OnDraw。
了这篇文章
类别:┆阅读(0)┆评论(0)【图文】第6章--MFC教程_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
第6章--MFC教程
大小:847.50KB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢2008年4月 硬件/嵌入开发大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。安全检查中...
请打开浏览器的javascript,然后刷新浏览器
< 浏览器安全检查中...
还剩 5 秒&// TODO: 在此添加消息处理程序代码和/或调用默认&#20540;
CView::OnLButtonDown(nFlags, point);
void CThView::OnUpdate32771(CCmdUI *pCmdUI)
// TODO: 在此添加命令更新用户界面处理程序代码
//::MessageBoxA(NULL, &ff&, &ggg&, MB_OK);
void CThView::OnLButtonUp(UINT nFlags, CPoint point)
//point.x = 144;
&&&& //point.y = 6;
/* 完全API划线
HDC hDc= ::GetDC(::GetParent(this-&m_hWnd));
&&& ::MoveToEx(hDc, pp.x, pp.y, NULL);
::LineTo(hDc, point.x, point.y);
::ReleaseDC(hDc);
/*使用CDC这个类
CDC *dc = GetDC();
dc-&MoveTo(pp);
dc-&LineTo(point);
ReleaseDC(dc);
//使用CclientDC不需要手动释放DC,
CClientDC&&& clientD(::GetParent(this-&m_hWnd));//这个DC和处于这个窗口的父窗口发生联系;
&&& clientD.MoveTo(pp);
&&& clientD.LineTo(point);&&&&&&&&&&&&&&&&&&&&&&&&& //由此可见,父窗口的客户区包括子窗口的客户区;
HWND wnd = ::GetDesktopWindow();//得到顶层窗口 的句柄
//HDC dc = ::GetDC(NULL);//得到整个屏幕的DC,每次运行这个 DC的&#20540;都会变化,
HDC dc = ::GetDC(wnd);//得到最顶层窗口的DC,但不是桌面的
BOOL aa = ::MoveToEx(dc, pp.x, pp.y, NULL);
BOOL bb = ::LineTo(dc, point.x, point.y);
::ReleaseDC(wnd, dc);
/////////////
/////////经过两次的::getwindow(),返回&#20540;是 NULL,所以一下三条语句 =====::getDc(NULL);
HWND wnd = ::GetDesktopWindow();
wnd =::GetWindow(wnd,GW_CHILD);&&&
wnd =::GetWindow(wnd ,GW_CHILD);//最终得到可以绘图的窗口窗口 的句柄
HDC dc = ::GetDC(wnd);&&&&&&&&&&&& //得到可以绘图的桌面的DC
BOOL aa = ::MoveToEx(dc, pp.x, pp.y, NULL);
BOOL bb = ::LineTo(dc, point.x, point.y);
CView::OnLButtonUp(nFlags, point);
本文已收录于以下专栏:
相关文章推荐
一 CClientDC
&#160;&#160;&#160;&#160;&#160; CClientDC 派生于CDC 类
&#160;&#160;&#160;&#160;&#160;&#160; 客户区设备上下文,其矩形区域为窗口整个客户区,客户区的左上角的坐标为(0,0),与特定的窗口相关...
和&#160;CDC&#160;的区别& alt=&CClientDC&#160;和&#160;CDC&#160;的区别& src=&/bmiddle/48eaf0&quo...
CDC是Windows绘图设备的基类
CClientDC:
(1)(客户区设备上下文)用于客户区的输出,与特定窗口关联,可以让开发者访问目标窗口中客户区,其构造函数中包含了GetDC,析构函数中包...
一 CClientDC
&#160;&#160;&#160;&#160;&#160; CClientDC 派生于CDC 类
&#160;&#160;&#160;&#160;&#160;&#160; 客户区设备上下文,其矩形区域为窗口整个客户区,客户区的左上角的坐标为(0,0),与特定的窗口相关联...
CDC是Windows绘图设备的基类
CClientDC:
(1)(客户区设备上下文)用于客户区的输出,与特定窗口关联,可以让开发者访问目标窗口中客户区,其构造函数中包含了GetDC,析构函数中包...
VC/MFC的HDC,CDC,CWindowDC,CClientDC,CPaintDC详解:&#160;首先说一下什么是DC(设备描述表)&#160;解:Windows应用程序通过为指定设备(屏幕,打印机等)创建一个设备...
一 CClientDC
&#160;&#160;&#160;&#160;&#160;CClientDC 派生于CDC
&#160;&#160;&#160;&#160;&#160;&#160;客户区设备上下文,其矩形区域为窗口整个客户区,客户区的左上角的坐标为(0,0),与特定的窗口相关联,...
1、&#160;设备环境(DC)&#160;
&#160;&#160;&#160;(1)在Windows中,显示工作是基于设备环境的。所谓设备环境(DC)是一种Windows数据结构,该结构包含应用程序设备输出时所需要的信息。
&#160;&#160;&#160;(2)在使用任何...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 mfc cview 的文章

 

随机推荐