WIN32编程的问题

slean 2007-02-11 08:14:15
在回调函数中,这样写
........
case WM_PAINT:
hdc = GetDC (hwnd) ;

...........

ReleaseDC (hwnd, hdc) ;
.....

和写成
........
case WM_PAINT:
hdc = BeginPaint(hwnd,&ps) ;

...........

EndPaint(hwnd, &ps) ;
.....

有什么区别啊,可以用第一种写法吗??
...全文
246 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
东文-桑晨 2007-02-15
  • 打赏
  • 举报
回复
如果是局部的刷新,请使用BeginPaint(),EndPaint()

非WM_PAINT消息时用GetDC和ReleaseDC来获取设备描述表句柄
artcpp 2007-02-15
  • 打赏
  • 举报
回复
学习。
lizhongbin 2007-02-12
  • 打赏
  • 举报
回复
简单点说,就是BeginPaint局部刷新,GetDC全部刷新
lizhongbin 2007-02-12
  • 打赏
  • 举报
回复
最常用的是:
在处理WM_PAINT消息时,使用BeginPaint和EndPaint调用
在处理非WM_PAINT消息,可以使用GetDC和ReleaseDC来获取设备描述表句柄


区别:
1.使用BeginPaint时,其中PAINTSTRUCT结构中包含名为rcPaint的RECT(矩形)结构,它定义了一个包含窗口客户区无效范围的矩形,从BeginPaint获得的句柄只能在这个区域内绘图,并使该区域有效。

2.使用GetDC返回的句柄在整个客户区上绘图,并且不使任何无效区域变为有效。
外来物种 2007-02-12
  • 打赏
  • 举报
回复
首先,窗口无效会产生WM_PAINT消息,该消息进入消息队列。
GetMessage()函数从消息队列中取出消息并清除该消息(除WM_PAINT消息外)
也就是说此时WM_PAINT还在消息队列中,所以我们必须自己清楚,
BeginPaint()函数能将WM_PAINT消息从消息队列中清楚。而GetDC()不会。

case WM_PAINT:
hdc = GetDC (hwnd) ;

...........

ReleaseDC (hwnd, hdc) ;
.....
这段代码将使程序进入死循环

从消息队列中清除WM_PAINT的另个方法是调用ValidateRect()

其他区别:
1.使用BeginPaint时,其中PAINTSTRUCT结构中包含名为rcPaint的RECT(矩形)结构,它定义了一个包含窗口客户区无效范围的矩形,从BeginPaint获得的句柄只能在这个区域内绘图,并使该区域有效。

2.使用GetDC返回的句柄在整个客户区上绘图,并且不使任何无效区域变为有效。
ringphone 2007-02-11
  • 打赏
  • 举报
回复
不能用第一种,初学编程时试过,时间太久,后果有点记不清了,好象是闪得厉害。
BeginPaint会自动设置刷新区域,不需要刷新的区域不会绘制,因此不会闪烁,而GetDC则没有此功能,把需要和不需要刷新的区域一起画了,因此一旦调整窗口大小,界面会狂闪。
___NULL 2007-02-11
  • 打赏
  • 举报
回复
我只用过第一种

16,471

社区成员

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

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

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