reactos操作系统实现(166)

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  }

posted @ 2009-12-22 21:53  ajuanabc  阅读(126)  评论(0编辑  收藏  举报