提问:CPaintDC和CClientDC

guyanhun 2006-09-01 11:58:18

代码:
void CMyView::OnViewScanup()
{
Invalidate();
//UpdateWindow() ;
CPaintDC dc (this) ; CClientDC dc (this) ; /***********/
// ...
DrawDibDraw( m_DrawDib , dc.GetSafeHdc() ,0 ,0 + m_size.cy -i ,m_size.cx,
10 ,&RGB32BITSBITMAPINFO ,(LPVOID )m_clrSrc ,
0 ,m_size.cy -i,m_size.cx ,10 ,DDF_BACKGROUNDPAL ) ;
}
/***********/ 行的用 CPaintDC 和CClientDC 为什么会有不同的结果呢?
...全文
550 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
guyanhun 2006-09-02
  • 打赏
  • 举报
回复
CPaintDC dc (this) ; 可以显示出图片
CClientDC dc (this) ; 不可以显示出图片
InwIvled 2006-09-02
  • 打赏
  • 举报
回复
不同结果是指什么
guyanhun 2006-09-02
  • 打赏
  • 举报
回复
可是如上的代码是可行的啊,为什么呢 ?
它不是在OnPaint 中,
guyanhun 2006-09-02
  • 打赏
  • 举报
回复
嗯。谢谢 !
结贴!
w_anthony 2006-09-02
  • 打赏
  • 举报
回复
/********************/
To : w_anthony()

如果代码改为:
Invalidate();
UpdateWindow() ; // 这里与以前不同
CPaintDC dc (this) ; CClientDC dc (this) ; /***********/

/********************/
Invalidate()与UpdateWindow()的区别相当于PostMessage与SendMessage的区别。不过这里有一点要明白,CPaintDC好像是把所有的WM_PAINT消息取走,不管里面有几个这样的消息。Invalidate()先POST了一个WM_PAINT消息,并没有进行绘图操作,而UpdateWindow()则是“SEND”了一个WM_PAINT消息(不知道是否真的发一个,但是效果是直接调用OnPaint再继续下面的程序),因此直接调用OnPaint函数,在OnPaint函数里面的CPaintDC取走了所有的WM_PAINT消息,因此如果下一句是CPaintDC dc(this),会因为取不到WM_PAINT消息,而不能绘图,但如果是CClientDC dc (this)则会成功绘图,而且因为已经没有WM_PAINT消息并不会再调用OnPaint清空画面。

guyanhun 2006-09-02
  • 打赏
  • 举报
回复
不是位置的问题,
w_anthony() 所说的就是原因了吧。

再加上 UpdateWindow() ; 之后的区别又怎么解释呢?
believefym 2006-09-02
  • 打赏
  • 举报
回复
楼主说的不同的效果是只画图的位置吗?
believefym 2006-09-02
  • 打赏
  • 举报
回复
A CPaintDC object can only be used when responding to a WM_PAINT message, usually in your OnPaint message-handler member function.

This means that the device context associated with a CClientDC object is the client area of a window.

guyanhun 2006-09-02
  • 打赏
  • 举报
回复
To : w_anthony()

如果代码改为:
Invalidate();
UpdateWindow() ; // 这里与以前不同
CPaintDC dc (this) ; CClientDC dc (this) ; /***********/

/***********/ 行的用 CPaintDC 和CClientDC 为什么会有不同的结果呢?
麻烦再解释一下!
谢谢!

jeng 2006-09-02
  • 打赏
  • 举报
回复
w_anthony() 说的看起来很有道理,有时间确认一下。
w_anthony 2006-09-02
  • 打赏
  • 举报
回复
如果想用CClientDC画上去的话,去掉Invalidate()。

我不知道你的目的是什么,如果想一直保留画面的话,应该把绘图函数写进OnPaint,不然窗口被覆盖画面就没了
w_anthony 2006-09-02
  • 打赏
  • 举报
回复
根据我的经验,CPaintDC会去取WM_PAINT消息,如果取不到,下面的绘图都是白搭。如果在OnPaint里面将CPaintDC而换成CClientDC的话(当然CDialog::OnPaint也被换掉了的情况下),会因为WM_PAINT消息并没有被取走,导致系统一直调用OnPaint函数,结果变得很卡。

至于你说的问题我是这样想的,我认为你在OnPaint函数里面没有绘图操作,只是默认清空。
先是Invalidate()发送了一个WM_PAINT消息,下面用CPaintDC直接取走了消息并绘了图,这样OnPaint函数并没有被调用,因此不会被清空。而用CClientDC虽然成功绘了图,但是WM_PAINT消息依然存在,以至于调用OnPaint清空了画面,所以画不上去。
JianGeYa 2006-09-02
  • 打赏
  • 举报
回复
用断点跟踪一下,就能看到
cybermat 2006-09-02
  • 打赏
  • 举报
回复
CPaintDC只能在OnPaint中用
hurryboylqs 2006-09-02
  • 打赏
  • 举报
回复
CClientDC dc (this) ; 不可以显示出图片
--------------------------------------------
没有这个道理吧?看你在什么地方调用,只不过是容易被擦除而已
hurryboylqs 2006-09-02
  • 打赏
  • 举报
回复
CPaintDC是用在WM_PAINT消息里面的,设备上下文是通过BeginPain()获得,通过EndPain()释放
而CClientDC里的设备DC是通过GetDC获得(构造函数里调用GetDC()),通过ReleaseDC释放
在析构函数里ReleaseDC被调用。
goodboyws 2006-09-01
  • 打赏
  • 举报
回复
CPaintDC只能用在OnPaint里

16,551

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧