NtUserRedrawWindow函数主要用来重画窗口显示。具体代码如下:
#001 BOOL APIENTRY
#002 NtUserRedrawWindow(HWND hWnd, CONST RECT *lprcUpdate, HRGN hrgnUpdate,
#003 UINT flags)
#004 {
#005 RECT SafeUpdateRect;
#006 NTSTATUS Status;
#007 PWINDOW_OBJECT Wnd;
#008 DECLARE_RETURN(BOOL);
#009 USER_REFERENCE_ENTRY Ref;
#010
#011 DPRINT("Enter NtUserRedrawWindow/n");
进入界面临界区代码。
#012 UserEnterExclusive();
#013
获取窗口对象,或者获取桌面窗口对象。
#014 if (!(Wnd = UserGetWindowObject(hWnd ? hWnd : IntGetDesktopWindow())))
#015 {
#016 RETURN( FALSE);
#017 }
#018
如果更新窗口的大小不为空,就是固定大小的窗口更新。
#019 if (lprcUpdate != NULL)
#020 {
#021 Status = MmCopyFromCaller(&SafeUpdateRect, (PRECT)lprcUpdate,
#022 sizeof(RECT));
#023
#024 if (!NT_SUCCESS(Status))
#025 {
#026 SetLastWin32Error(ERROR_INVALID_PARAMETER);
#027 RETURN( FALSE);
#028 }
#029 }
#030
增加窗口的引用计数。
#031 UserRefObjectCo(Wnd, &Ref);
#032
调用函数co_UserRedrawWindow来更新窗口。
#033 Status = co_UserRedrawWindow(Wnd, NULL == lprcUpdate ? NULL : &SafeUpdateRect,
#034 hrgnUpdate, flags);
#035
减少窗口引用计数。
#036 UserDerefObjectCo(Wnd);
#037
如果执行不成功,就返回出错码。
#038 if (!NT_SUCCESS(Status))
#039 {
#040 /* IntRedrawWindow fails only in case that flags are invalid */
#041 SetLastWin32Error(ERROR_INVALID_PARAMETER);
#042 RETURN( FALSE);
#043 }
#044
#045 RETURN( TRUE);
#046
#047 CLEANUP:
#048 DPRINT("Leave NtUserRedrawWindow, ret=%i/n",_ret_);
退出临界区代码。
#049 UserLeave();
#050 END_CLEANUP;
#051 }