微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

reactos操作系统实现(189)

DCdevice context)是一个图形对象、图形属性和影响图形输出的集合结构体。CreateDC函数用给定名称为指定的设备创建设备环境。CreateDC一般用于创建打印机的设备环境,也可以用来得到屏幕(硬件屏幕,而不是窗口的客户区)的设备环境。请小心使用这个函数,因为它允许应用程序在屏幕上任何位置绘图,而不仅仅是在窗口的边界内。请用GetDCBeginPaint获取屏幕窗口的设备环境。

#001 HDC

#002 WINAPI

#003 CreateDCW (

#004 LPCWSTR lpwszDriver,

#005 LPCWSTR lpwszDevice,

#006 LPCWSTR lpwszOutput,

#007 CONST DEVMODEW *lpInitData

#008 )

#009 {

#010

#011 return IntCreateDICW ( lpwszDriver,

#012 lpwszDevice,

#013 lpwszOutput,

#014 (PDEVMODEW) lpInitData,

#015 0 );

#016 }

lpwszDriver是指向空值结尾的字符串的指针,字符串说明设备驱动程序的文件名。比如“disPLAY”指的是显示器驱动程序,而“WINSPOOL”就是指打印驱动程序。

lpwszDevice是批向空值结尾的字符串的指针,字符串指定了正在使用的专用输出设备的名称,比如打印管理程序名称

lpwszOutput是没有使用参数,一般设置为NULL

lpInitData是指向结构包含了设备驱动程序的设备专用初始化数据。设置为NULL时,就使用系统认的初始化参数。

下面接着来分析函数IntCreateDICW代码

#001 HDC

#002 FASTCALL

#003 IntCreateDICW ( LPCWSTR lpwszDriver,

#004 LPCWSTR lpwszDevice,

#005 LPCWSTR lpwszOutput,

#006 PDEVMODEW lpInitData,

#007 ULONG iType )

#008 {

#009 UNICODE_STRING Device,Output;

#010 HDC hDC = NULL;

#011 BOOL display = FALSE,Default = TRUE;

#012 ULONG UMdhpdev = 0;

#013

#014 HANDLE hspool = NULL;

#015

加载打印驱动程序。

#016 if ( !ghSpooler && !LoadTheSpoolerDrv())

#017 {

#018 DPRINT1("WinSpooler.Drv Did not load!/n");

#019 }

#020 else

#021 {

#022 DPRINT("WinSpooler.Drv Loaded! hMod -> 0x%x/n",ghSpooler);

#023 }

#024

根据设备名称判断获取什么样的设备。

#025 if ((!lpwszDevice) && (!lpwszDriver))

#026 {

设置缺省设备名称

#027 Default = FALSE; // Ask Win32k to set Default device.

#028 display = TRUE; // Most likely to be disPLAY.

#029 }

#030 else

#031 {

#032 if ((lpwszDevice) && (wcslen(lpwszDevice) != 0)) // First

#033 {

判断是否获取显示设备。

#034 if (!_wcsnicmp(lpwszDevice,L"////.//disPLAY",11)) display = TRUE;

#035 RtlInitUnicodeString(&Device,lpwszDevice);

#036 }

#037 else

#038 {

#039 if (lpwszDriver) // Second

#040 {

#041 if ((!_wcsnicmp(lpwszDriver,L"disPLAY",7)) ||

#042 (!_wcsnicmp(lpwszDriver,11))) display = TRUE;

#043 RtlInitUnicodeString(&Device,lpwszDriver);

#044 }

#045 }

#046 }

#047

#048 if (lpwszOutput) RtlInitUnicodeString(&Output,lpwszOutput);

#049

#050 if (!display)

#051 {

#052 //Handle Print device or something else.

#053 DPRINT1("Not a disPLAY device! %wZ/n",&Device);

#054 }

#055

调用WIN32K内核NtGdiopenDCW函数打开设备。

#056 hDC = NtGdiopenDCW( (Default ? &Device : NULL),

#057 (PDEVMODEW) lpInitData,

#058 (lpwszOutput ? &Output : NULL),

#059 iType, // DCW 0 and ICW 1.

#060 display,

#061 hspool,

#062 (PVOID) NULL, // NULL for Now.

#063 (PVOID) &UMdhpdev );

#064 #if 0

#065 // Handle something other than a normal dc object.

#066 if (GDI_HANDLE_GET_TYPE(hDC) != GDI_OBJECT_TYPE_DC)

#067 {

#068 PDC_ATTR Dc_Attr;

#069 PLDC pLDC;

#070

#071 GdiGetHandleUserData((HGdioBJ) hDC,GDI_OBJECT_TYPE_DC,(PVOID) &Dc_Attr);

#072

#073 pLDC = LocalAlloc(LMEM_ZEROINIT,sizeof(LDC));

#074

#075 Dc_Attr->pvLDC = pLDC;

#076 pLDC->hDC = hDC;

#077 pLDC->iType = LDC_LDC; // 1 (init) local DC,2 EMF LDC

#078 DbgPrint("DC_ATTR Allocated -> 0x%x/n",Dc_Attr);

#079 }

#080 #endif

返回DC给应用程序。

#081 return hDC;

#082}

原文地址:https://www.jb51.cc/react/308331.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐