EngCreateWnd 函数 (winddi.h)
EngCreateWnd 函数为 hwnd 引用的窗口创建 WNDOBJ 结构。
语法
ENGAPI WNDOBJ * EngCreateWnd(
SURFOBJ *pso,
HWND hwnd,
WNDOBJCHANGEPROC pfn,
FLONG fl,
int iPixelFormat
);
参数
pso
指向标识设备表面的 SURFOBJ 结构的指针。
hwnd
应用程序调用 Win32 CreateWindow 或等效函数创建的窗口的句柄。
pfn
fl
是一个位掩码,指定 GDI 应跟踪并报告给驱动程序的更改类型。 此值必须通过驱动程序发出的所有 WNDOBJ 请求保持一致。 此参数可以是以下一个或多个位字段值:
标志 | 含义 |
---|---|
WO_DRAW_NOTIFY | GDI 应为驱动程序提供WOC_DRAWN通知。 |
WO_RGN_CLIENT | GDI 应跟踪窗口对象的客户端区域中的更改,并在窗口的可见客户端区域更改时通知驱动程序。 回调函数中枚举的区域是窗口的新可见工作区。 |
WO_RGN_CLIENT_DELTA | GDI 应跟踪窗口对象的增量客户端区域中的更改,并在窗口的可见区域更改时通知驱动程序。 回调函数中枚举的区域是位于新区域中但不在新区域中的无空增量区域。 增量区域仅在回调期间有效。 |
WO_RGN_DESKTOP_COORD |
当系统运行多个监视器时,GDI 会创建具有桌面坐标的 WNDOBJ 结构。
当系统运行单个监视器时,GDI 会忽略此标志并创建具有设备坐标的 WNDOBJ 结构。 |
WO_RGN_SURFACE | GDI 应跟踪窗口对象的图面区域中的更改,并在图面区域更改时通知驱动程序。 图面区域是显示外围应用区域,不包括驱动程序跟踪的窗口的所有可见客户端区域。 |
WO_RGN_SURFACE_DELTA | GDI 应跟踪窗口对象的增量图面区域中的更改,并在图面区域更改时通知驱动程序。 回调函数中枚举的区域是一个非空增量区域,位于新外围区域,但不在旧图面区域中。 增量图面区域仅在回调期间有效。 |
WO_RGN_UPDATE_ALL | 当任何窗口的可见区域发生更改时,GDI 应通知驱动程序它跟踪的所有窗口。 此标志必须与 WO_RGN_CLIENT 标志一起使用。 |
WO_RGN_WINDOW | GDI 应跟踪窗口对象 ((包括窗口) 的客户端区域)的整个区域中的更改,并在窗口的区域更改时通知驱动程序。 |
WO_SPRITE_NOTIFY | 当其任何窗口的可见区域被子画面重叠或不再重叠时,GDI 应通知驱动程序它跟踪的所有窗口。 |
iPixelFormat
指定与窗口对象关联的像素格式。 窗口对象的像素格式是固定的。 如果没有关联的像素格式,此参数可以为零。
返回值
如果函数成功,则返回值是指向 WNDOBJ 结构的指针。 否则,如果驱动程序正在跟踪同一窗口,则返回值为 1;如果驱动程序未跟踪同一窗口,则返回值为 0。
注解
由于创建窗口对象涉及锁定窗口资源,因此应仅在 DrvEscape 中WNDOBJ_SETUP转义的上下文中调用 EngCreateWnd。
EngCreateWnd 支持多个驱动程序的窗口跟踪,其中每个驱动程序由 pfn 标识的唯一 WNDOBJCHANGEPROC 函数指针标识。 例如,实时视频驱动程序可以跟踪对实时视频窗口的更改,而 OpenGL 驱动程序跟踪对 OpenGL 窗口的更改。
如果 DrvEscape 创建了新的 WNDOBJ,GDI 将调用具有最新窗口状态的 WNDOBJCHANGEPROC。 当 销毁 WNDOBJ 结构描述的窗口时,GDI 还会通知 WNDOBJCHANGEPROC。
传递给 WNDOBJCHANGEPROC 的WOC_SPRITE_OVERLAP和WOC_SPRITE_NO_OVERLAP通知允许在子画面位于其窗口顶部时同步通知驱动程序,并采取相应的操作。 即使所有子画面已被 EngControlSprites 的ECS_TEARDOWN标志拆毁,驱动程序也会收到这些通知。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 适用于 Windows 2000 及更高版本的 Windows 操作系统。 |
目标平台 | 通用 |
标头 | winddi.h (包括 Winddi.h) |
Library | Win32k.lib |
DLL | Win32k.sys |