user-0 提问: Windows编程InvalidateRect()函数

回复:
user: user-1
content: 查了下MSDN的InvalidateRect，重点如下 Remarks 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.  InvalidateRect函数名不会去重画无效区域，只有在下一次收到WM_PAINT消息事后才会重画，所以如果你想现在就更新的话需要::SendMessage( hwnd ,WM_PAINT, 0, 0);

user: user-2
content: 引用 6 楼 hunanzhiying 的回复:@zhao4zhong1 好详细的解释啊 查MSDN是Windows程序员必须掌握的技能之一。  粘贴MSDN是zhao4zhong1经常用来刷CSDN论坛分的办法之一。

user: user-0
content: @zhao4zhong1 好详细的解释啊

user: user-2
content: UpdateWindow The UpdateWindow function updates the client area of the specified window by sending a WM_PAINT message to the window if the window's update region is not empty. The function sends a WM_PAINT message directly to the window procedure of the specified window, bypassing the application queue. If the update region is empty, no message is sent.   BOOL UpdateWindow(   HWND hWnd   // handle of window );   Parameters hWnd  Handle to the window to be updated.  Return Values If the function succeeds, the return value is nonzero.  If the function fails, the return value is zero.   Windows NT: To get extended error information, callGetLastError.  QuickInfo   Windows NT: Requires version 3.1 or later.   Windows: Requires Windows 95 or later.   Windows CE: Requires version 1.0 or later.   Header: Declared in winuser.h.   Import Library: Use user32.lib.  See Also Painting and Drawing Overview, Painting and Drawing Functions, ExcludeUpdateRgn, GetUpdateRect, GetUpdateRgn, InvalidateRect, InvalidateRgn, WM_PAINT

user: user-2
content: 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.   BOOL InvalidateRect(   HWND hWnd,  // handle of window with changed update region   CONST RECT *lpRect,               // address of rectangle coordinates   BOOL bErase // erase-background flag );   Parameters hWnd  Handle to the window whose update region has changed. If this parameter is NULL, the system invalidates and redraws all windows, and sends theWM_ERASEBKGND and WM_NCPAINT messages to the window procedure before the function returns.  lpRect  Pointer to a RECT structure that contains the client coordinates of the rectangle to be added to the update region. If this parameter is NULL, the entire client area is added to the update region.  bErase  Specifies whether the background within the update region is to be erased when the update region is processed. If this parameter is TRUE, the background is erased when the BeginPaint function is called. If this parameter is FALSE, the background remains unchanged.  Return Values If the function succeeds, the return value is nonzero.  If the function fails, the return value is zero.   Windows NT: To get extended error information, callGetLastError.  Remarks 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.   The system sends a WM_PAINT message to a window whenever its update region is not empty and there are no other messages in the application queue for that window.   If the bErase parameter is TRUE for any part of the update region, the background is erased in the entire region, not just in the given part.   Windows CE: The hWnd parameter cannot be NULL.  QuickInfo   Windows NT: Requires version 3.1 or later.   Windows: Requires Windows 95 or later.   Windows CE: Requires version 1.0 or later.   Header: Declared in winuser.h.   Import Library: Use user32.lib.  See Also Painting and Drawing Overview, Painting and Drawing Functions, BeginPaint, InvalidateRgn, RECT, ValidateRect, ValidateRgn,WM_ERASEBKGND, WM_NCPAINT, WM_PAINT

user: user-0
content: @gameslq 不是吧，我记得InvalidateRect是可以发送WM_PAINT消息的，但是因为WM_PAINT消息在消息队列中是属于等级较低的消息，所以如果要提前处理WM_PAINT可以用UpdateWindow来让窗口过程直接处理ＷＭ＿ＰＡＩＮＴ而不经消息队列。

user: user-3
content: InvalidateRect(某窗口句柄，假设为hwnd,NULL,TRUE);         2.UpdateWindow(hwnd); 这两句应该放在 3的最后，一般是绘制完图形然后进行刷新显示。  InvalidateRect函数只是置窗口区域为无效，UpdateWindow才真正发送wm_pain 1,2可用redrawwindow代替，更直接

user: user-4
content: updatewindow函数理论上会直接调用onpaint，不会经过消息循环。