BeginPaint EndPaint 与GetDC ReleaseDC的区别
2010-10-26 19:41
363 查看
1.
绘图一般在WM_PAINT消息里面绘图, 一般用BeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint) 与BOOL EndPaint(
HWND hWnd, CONST PAINTSTRUCT *lpPaint)
<1> BeginPaint自动设置裁剪区域,把不更新的区域设置到更新区域外面,
此消息只绘制无效区域,更新区域可以显示地被InvalidateRect 和InvalidateRgn设置,如果背景要擦除,BeginPaint发送消息 WM_ERASEBKGND 给窗口
<2>BeginPaint 会自动地把无效区域设置为有效区域, BeginPaint 和EndPaint 只能在WM_PAINT消息里面进行调用 ,两者一定要成对出现
2. GetDC与ReleaseDC
<1> GetDC 可以用在任何需要DC的地方, 他不会使得无效区域变得有效
3.解释了那么多,拿个程序来说明问题:
比如说要在一个客户区域画个圆 ,如果在WM_PAINT消息里面输入如下代码:
运行程序可以清楚的看到,圆在不停的闪烁,
如果替换成BeginPaint 则不会闪烁
原因是: GetDC不会把无效区域变为有效区域,所以不停的发送消息自绘,从而导致闪烁,BeginPaint 反之
绘图一般在WM_PAINT消息里面绘图, 一般用BeginPaint(HWND hwnd, LPPAINTSTRUCT lpPaint) 与BOOL EndPaint(
HWND hWnd, CONST PAINTSTRUCT *lpPaint)
<1> BeginPaint自动设置裁剪区域,把不更新的区域设置到更新区域外面,
此消息只绘制无效区域,更新区域可以显示地被InvalidateRect 和InvalidateRgn设置,如果背景要擦除,BeginPaint发送消息 WM_ERASEBKGND 给窗口
<2>BeginPaint 会自动地把无效区域设置为有效区域, BeginPaint 和EndPaint 只能在WM_PAINT消息里面进行调用 ,两者一定要成对出现
2. GetDC与ReleaseDC
<1> GetDC 可以用在任何需要DC的地方, 他不会使得无效区域变得有效
3.解释了那么多,拿个程序来说明问题:
比如说要在一个客户区域画个圆 ,如果在WM_PAINT消息里面输入如下代码:
HDC hdc = GetDC(hWnd); Ellipse(ps.hdc, 10, 10, 20, 20); ReleaseDC(hWnd, hdc);
运行程序可以清楚的看到,圆在不停的闪烁,
如果替换成BeginPaint 则不会闪烁
原因是: GetDC不会把无效区域变为有效区域,所以不停的发送消息自绘,从而导致闪烁,BeginPaint 反之
相关文章推荐
- BeginPaint EndPaint 与GetDC ReleaseDC的区别
- BeginPaint/EndPaint(CPaintDC)与GetDC(CClientDC)的区别
- BeginPaint/EndPaint(CPaintDC)与GetDC(CClientDC)的区别
- BeginPaint&&GetDc区别
- 顺序容器的begin,front,end,back的区别
- STL front() ,back()和begin(),end()区别
- sort函数、vector中begin()、end()和front()、back()的区别
- **c++ stl 顺序容器: begin(),end()和front(),back()区别和使用**
- 双缓存之BeginPaint&GetDC
- rbegin 和 end 区别
- MFC程序设计中的BeginPaint/EndPaint和GetDC/ReleaseDC的使用
- C++ STL begin()和front()、end()和back()的区别与用法
- BeginPaint&&GetDc
- C++ STL begin()和front()、end()和back()的区别与用法
- Oracle BEGIN END 【整理】
- CreateThread与_beginthreadex本质区别
- c# Invoke和BeginInvoke 区别
- Android中Drawable Bitmap Canvas Paint之间区别
- c# Invoke和BeginInvoke 区别
- CreateThread AfxBeginThread _beginthread _beginthreadex的区别