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} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |