加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

reactos操作系统实现(181)

发布时间:2020-12-15 04:58:39 所属栏目:百科 来源:网络整理
导读:NtUserDrawCaption 是内核函数,主要用来实现显示窗口标题。 #001 BOOL #002 APIENTRY #003 NtUserDrawCaption(HWND hWnd, #004 HDC hDC, #005 LPCRECT lpRc, #006 UINT uFlags) #007 { 这里主要调用函数 NtUserDrawCaptionTemp 来实现相应的功能。 #008 ret

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}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读