在OnDraw中分别调用pDC和GetDC() 得到的结果可能不相同
pDC 所指的是视图初始的客户区DC
比如 视图是基于CFormView类的,其上设置了工具栏资源
则这些工具栏就是依赖pDC产生的, 这样,当滚动条左右移动时,工具栏资源也随之左右移动。
这是因为:滚动条移动时,当前窗口可见区的坐标发生变化,而工具栏资源是以PDC坐标为准的,因此,工具栏各个资源的坐标位置不变,而窗口坐标发生变化,这样就使得工具栏也有移动的效果
如果使用pDC来画图, 当滚动条右移时,可以发现,图片局限在原有的PDC坐标区域中,无法移动到新视图的右端
GetDC() 指的是: 获得当前可见窗口的DC,并将其坐标作为参照坐标,也就是可见窗口的左上角为DC的(0,0)点,这样,当用GetDC画图时,便会发现,无论滚动条如何移动,图片都不会发生变化。
自然,这是因为,无论滚动条如何移动,当前可见窗口的坐标都是相同的,画图时都是参照可见窗口的左上角(0,0)点进行的,因此每次画的图都一样
实在分不清的话 ,可以分别用PDC和GETDC测试下,做下对比,就清楚了 。
简言之,滚动条左右滚动时,pdc所画图像,依然是参照初始的客户区
而GetDC,是把当前的VIEW窗口作为参照来画图的
也就是说,二者使用的坐标系不同,自然就有所差别了。
以下是网上的一段参考资料:
//----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CScrollView::OnDraw(CDC* pDC)
{
HDC hdc1 = ::GetDC(GetSafeHwnd());
HDC hdc2 = pDC->GetSafeHdc();
}
hdc1 和hdc2有和区别;
我用hdc1画图,操作滚动条可以自动移动图形,但是DPtoLP不对,结果总是正值;
我用hdc2画图,操作滚动条不能自动移动图形,但是DPtoLP正确;
CScrollView::OnDraw(CDC* pDC)
{
HDC hdc1 = ::GetDC(GetSafeHwnd()); //GetSafeHwnd()得到的是View的句柄
HDC hdc2 = pDC->GetSafeHdc(); //得到的是客户区DC的句柄
}
不是在OnDraw()里的话,就相同,如:
CDC* pDC = GetDC();
HDC hdc1 = ::GetDC(GetSafeHwnd());
HDC hdc2 = pDC->GetSafeHdc();
hdc1和hdc2作用一样
在OnDraw()里直接使用OnDraw()的参数pDC就不一样了,没记错的话,那个pDC是裁剪过的
//-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
参考资料:
http://blog.sina.com.cn/s/blog_4f8d956b0100hlrr.html