WM_PAINT和InvalidateRect的有关问题

WM_PAINT和InvalidateRect的问题
书上说InvalidateRect会发送一个WM_PAINT消息来刷新一个矩形区域,这个WM_PAINT和回调函数里的WM_PAINT是怎么区分开的?而且我看msdn里说的WM_PAINT的消息没有附加值,那他是怎么确定这个矩形的呢?求解

------解决方案--------------------
PAINTSTRUCT结构。

PAINTSTRUCT ps;
hdc = BeginPaint( hwnd, &ps );

ps.rcPaint; // 就是这玩意了。

EndPaint( hwnd, &ps );
当然,MFC给隐藏了。
------解决方案--------------------
windows为每一个窗口在windows内部维护一个paint 的结构体,这个结构用来标示一个无效区域,它代表窗口上被覆盖或者是无效的那一部分,这个区域的存在,是windows放置一个WM_PAINT消息在应用程序消息队列中的原因;当重绘窗口时,仅需重绘这一部分就可以;

我们可以调用InvalidateRect函数来让客户区中的一个矩形无效,如果此时消息队列中WM_PAINT消息已经存在,那么windows会重新计算无效区域的大小;窗口过程接受到WM_PAINT消息的时候它就能获取无效区域的坐标,当然,我们也可以调用GetUpdateRect函数来在任何时候获取无效区域坐标;

在窗口过程WM_PAINT消息分支中处理了BeginPaint 函数之后,整个窗口客户区都变为有效;程序也能调用ValidateRect函数来让客户区中的任何矩形区域有效,但用这个函数标示了整个客户区时,那么任何当前在应用程序队列中的WM_PAINT消息被移去;

------解决方案--------------------
GetUpdateRect()

 An application should call the GetUpdateRect function to determine whether the window has an update region.