reactos操作系统实现(181)
NtUserDrawCaption是内核函数,主要用来实现显示窗口标题。 #001 BOOL #002 APIENTRY #003 NtUserDrawCaption(HWND hWnd, #004 HDC hDC, #005 LPCRECT lpRc, #006 UINT uFlags) #007 {
这里主要调用函数NtUserDrawCaptionTemp来实现相应的功能。 #008 return NtUserDrawCaptionTemp(hWnd,hDC,lpRc,NULL,uFlags); #009 }
函数NtUserDrawCaptionTemp实现如下: #001 BOOL #002 APIENTRY #003 NtUserDrawCaptionTemp( #004 HWND hWnd, #005 HDC hDC, #006 LPCRECT lpRc, #007 HFONT hFont, #008 HICON hIcon, #009 const PUNICODE_STRING str, #010 UINT uFlags) #011 { #012 PWINDOW_OBJECT pWnd = NULL; #013 RECT SafeRect; #014 UNICODE_STRING SafeStr = {0}; #015 BOOL Ret = FALSE; #016
进入临界区代码。 #017 UserEnterExclusive(); #018
如果窗口句柄不为空,就获取窗口的对象。 #019 if (hWnd != NULL) #020 { #021 if(!(pWnd = UserGetWindowObject(hWnd))) #022 { #023 UserLeave(); #024 return FALSE; #025 } #026 } #027 #028 _SEH2_TRY #029 {
获取窗口的大小。 #030 ProbeForRead(lpRc,sizeof(RECT),sizeof(ULONG)); #031 RtlCopyMemory(&SafeRect,sizeof(RECT)); #032 if (str != NULL) #033 {
获取窗口标题要显示的字符串。 #034 SafeStr = ProbeForReadUnicodeString(str); #035 if (SafeStr.Length != 0) #036 { #037 ProbeForRead(SafeStr.Buffer, #038 SafeStr.Length, #039 sizeof(WCHAR)); #040 }
调用函数UserDrawCaption来显示窗口的标题。 #041 Ret = UserDrawCaption(pWnd,&SafeRect,hFont,hIcon,&SafeStr,uFlags); #042 } #043 else #044 Ret = UserDrawCaption(pWnd,uFlags); #045 }
这里是异常出错处理。 #046 _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) #047 { #048 SetLastNtError(_SEH2_GetExceptionCode()); #049 } #050 _SEH2_END; #051 #052 UserLeave(); #053 return Ret; #054} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |