BeginPaint函数两个实参的作用我理解的对么

ycyu1455 2016-08-18 10:36:59
BeginPaint(hwnd,&ps)
从实参一:获取窗口句柄
从实参二:获取设备环境句柄,根据这个设备环境先设置一个矩形的裁剪区,同时设置成无效化区

//然后函数体中的代码:会先检验窗口客户区中是否有无效区,若有无效区就先擦除整个窗口客户区1次,函数的返回值:若获取设备环境句柄成功就返回设备环境(显示设备描述表)句柄,否则返回NULL
...全文
197 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-08-19
  • 打赏
  • 举报
回复
《深入浅出MFC》中有Windows消息剖析。
ycyu1455 2016-08-19
  • 打赏
  • 举报
回复
引用 6 楼 VisualEleven 的回复:
InvalidateRect The InvalidateRect function adds a rectangle to the specified window's update region. The update region represents the portion of the window's client area that must be redrawn. The invalidated areas accumulate in the update region until the region is processed when the next WM_PAINT message occurs or until the region is validated by using the ValidateRect or ValidateRgn function.
BeginPint会先检验整个窗口客户区是否有无效区,若有无效区系统就帮忙把整个窗口客户区擦除1次进行绘图,目的是让窗口客户区保持全部是有效区,然后BeginPint再根据ps.rcPaint的坐标信息设置一个裁剪区 当本次的WM_PAINT消息处理完,因为整个窗口客户区都是有效区,因此系统不再触发WM_PAINT,也因此 BeginPint处理的消息不会闪烁 而GetDC处理消息时一直闪烁,就是因为GetCD没有检验窗口客户区是否有无效区,也没有让系统擦除1次整个窗口客户区,因此窗口客户区始终会存在无效区,因此会一直发送WM_PAINT消息,一直执行重绘 我这样理解对么
Eleven 2016-08-19
  • 打赏
  • 举报
回复
InvalidateRect The InvalidateRect function adds a rectangle to the specified window's update region. The update region represents the portion of the window's client area that must be redrawn. The invalidated areas accumulate in the update region until the region is processed when the next WM_PAINT message occurs or until the region is validated by using the ValidateRect or ValidateRgn function.
ycyu1455 2016-08-19
  • 打赏
  • 举报
回复
引用 4 楼 ycyu1455 的回复:
[quote=引用 3 楼 schlafenhamster 的回复:] "有效矩形是不能绘图的吧" 有效矩形才能绘图, 如果窗口一直 无效 ,就会 发 WM_PAINT 消息。BeginPaint 最大的作用就是 使窗口 有效。 当然可以 人工 BOOL ValidateRect( HWND hWnd, // handle of window CONST RECT *lpRect // address of validation rectangle coordinates );
是不是BeginPaint会设置一个矩形有效区,再根据这个有效区坐标设置做成同位置的裁剪区,这样等于窗口客户区全部是有效区,这样系统就不会再发送WM_PAINT消息[/quote] 不对,应该是BeginPaint先检测窗口客户区是否有无效区,若有无效区,系统就帮忙把整个窗口客户区擦除1次进行绘图,这样窗口客户区全部是有效区,然后在用ps.rcPaint的坐标设置一个裁剪区,因为整个窗口客户区都是有效区,因此在处理这个消息后,系统将不会再发送WM_PAINT消息
ycyu1455 2016-08-19
  • 打赏
  • 举报
回复
引用 3 楼 schlafenhamster 的回复:
"有效矩形是不能绘图的吧" 有效矩形才能绘图, 如果窗口一直 无效 ,就会 发 WM_PAINT 消息。BeginPaint 最大的作用就是 使窗口 有效。 当然可以 人工 BOOL ValidateRect( HWND hWnd, // handle of window CONST RECT *lpRect // address of validation rectangle coordinates );
是不是BeginPaint会设置一个矩形有效区,再根据这个有效区坐标设置做成同位置的裁剪区,这样等于窗口客户区全部是有效区,这样系统就不会再发送WM_PAINT消息
schlafenhamster 2016-08-19
  • 打赏
  • 举报
回复
"有效矩形是不能绘图的吧" 有效矩形才能绘图, 如果窗口一直 无效 ,就会 发 WM_PAINT 消息。BeginPaint 最大的作用就是 使窗口 有效。 当然可以 人工 BOOL ValidateRect( HWND hWnd, // handle of window CONST RECT *lpRect // address of validation rectangle coordinates );
ycyu1455 2016-08-19
  • 打赏
  • 举报
回复
引用 1 楼 zgl7903 的回复:
看MSDN 的解释最权威 包括 Remarks
其中有一段:If the caret is in the area to be painted, BeginPaint automatically hides the caret to prevent it from being erased. 翻译机:如果插入的是在该地区被画,BeginPaint自动隐藏插入标记以防止它被擦掉 疑惑:BeginPaint自动隐藏插入标记以防止它被擦掉,是不是就是把那个无效矩形有效化,但是我下面代码好像能在这个有效矩形中使用DGI函数绘图,有效矩形是不能绘图的吧 case WM_PAINT: hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint (hwnd, &ps) ; return 0 ;
ycyu1455 2016-08-19
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
《深入浅出MFC》中有Windows消息剖析。
好吧

16,472

社区成员

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

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

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