reactos操作系统实现(183)

UserDrawCaptionText函数实现窗口上标题显示。实现的代码如下:

#001 BOOL

#002 UserDrawCaptionText(HDC hDc,

#003 const PUNICODE_STRING Text,

#004 const LPRECT lpRc,

#005 UINT uFlags)

#006 {

#007 HFONT hOldFont = NULL,hFont = NULL;

#008 COLORREF OldTextColor;

#009 NONCLIENTMETRICSW nclm;

#010 NTSTATUS Status;

#011 #ifndef NDEBUG

#012 INT i;

#013 DPRINT("%s:",__FUNCTION__);

#014 for(i = 0; i < Text->Length/sizeof(WCHAR); i++)

#015 DbgPrint("%C",Text->Buffer[i]);

#016 DbgPrint(",%d/n",Text->Length/sizeof(WCHAR));

#017 #endif

#018

获取非客户区的大小。

#019 nclm.cbSize = sizeof(nclm);

#020 if(!IntSystemParametersInfo(SPI_GETNONCLIENTMETRICS,

#021 sizeof(NONCLIENTMETRICS),&nclm,0))

#022 {

#023 DPRINT1("%s: IntSystemParametersInfo() Failed!/n",__FUNCTION__);

#024 return FALSE;

#025 }

#026

设置显示文字方式为透明方式。

#027 IntGdisetBkMode(hDc,TRANSPARENT);

#028

创建显示字符串的字体。

#029 if(uFlags & DC_SMALLCAP)

#030 Status = TextIntCreateFontIndirect(&nclm.lfSmCaptionFont,&hFont);

#031 else Status = TextIntCreateFontIndirect(&nclm.lfCaptionFont,&hFont);

#032

#033 if(!NT_SUCCESS(Status))

#034 {

#035 DPRINT1("%s: TextIntCreateFontIndirect() Failed! Status: 0x%x/n",

#036 __FUNCTION__,Status);

#037 return FALSE;

#038 }

#039

选择字体到显示设备里。

#040 hOldFont = NtGdiselectFont(hDc,hFont);

#041 if(!hOldFont)

#042 {

#043 DPRINT1("%s: SelectFont() Failed!/n",__FUNCTION__);

#044 NtGdiDeleteObject(hFont);

#045 return FALSE;

#046 }

#047

设置字符串显示的颜色。

#048 if(uFlags & DC_INBUTTON)

#049 OldTextColor = IntGdisetTextColor(hDc,IntGetSysColor(COLOR_BTNTEXT));

#050 else OldTextColor = IntGdisetTextColor(hDc,IntGetSysColor(uFlags & DC_ACTIVE

#051 ? COLOR_CAPTIONTEXT : COLOR_INACTIVECAPTIONTEXT));

#052

#053 //FIXME: If string doesn't fit to rc,truncate it and add ellipsis.

#054

调用函数GreExttextoutW显示字符串。

#055 GreExttextoutW(hDc,lpRc->left,

#056 lpRc->top,NULL,Text->Buffer,

#057 Text->Length/sizeof(WCHAR),0);

#058

恢复前面的颜色和字体,删除创建的字体。

#059 IntGdisetTextColor(hDc,OldTextColor);

#060 NtGdiselectFont(hDc,hOldFont);

#061 NtGdiDeleteObject(hFont);

#062

#063 return TRUE;

#064}

相关文章

一、前言 在组件方面react和Vue一样的,核心思想玩的就是组件...
前言: 前段时间学习完react后,刚好就接到公司一个react项目...
前言: 最近收到组长通知我们项目组后面新开的项目准备统一技...
react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom...