reactos操作系统实现(166)

前端之家收集整理的这篇文章主要介绍了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}

原文链接:https://www.f2er.com/react/308355.html

猜你在找的React相关文章