如何最好地封装窗口句柄?

Gui*_*ira 4 c++ opengl encapsulation direct3d hwnd

我正在开发一个由许多独立子系统组成的系统.其中两个子系统是Window和GraphicsAdapter子系统.

GraphicsAdapter需要一个低级窗口句柄(HWND或X11窗口句柄,具体取决于操作系统),而Window子系统是一种抽象这些特定于操作系统的API的方法.

如果Window子系统允许访问低级API句柄,那么封装将有很大的可能性被破坏.

如果它允许窗口全屏显示并返回,但是必须触发事件警告系统有关这些更改,并且低级别句柄用于在不知情的情况下切换到全屏?

如何确保把手从Window子系统安全地传送到GraphicsAdapter而不被滥用,并且仍然足够灵活,以便稍后可以添加其他子系统,如GraphicsAdapter,同时保持类型安全?

有没有办法以一种方式封装句柄Direct3D和OpenGL可以从句柄访问正常工作?

- 编辑

另外,从一个子系统到另一个子系统安全地携带手柄,例如,知道子系统可以由不同的编码器团队编写,有没有办法提醒他们手柄的使用方式?

注释是显而易见的选择,但编译器强制执行的是我真正想要的...

Fab*_*sen 6

HWND和X11窗口句柄都是指针类型.你可以利用这个优势.做这样的事情:

struct WindowHandleImpl;
typedef WindowHandleImpl *WindowHandle;
Run Code Online (Sandbox Code Playgroud)

C++允许您使用指向不完整类型的指针 - 只是不要定义WindowHandleImpl任何地方的内容,并且WindowHandle是一个完全不透明的类型,可以由应用程序传递而不公开任何实现细节.

因为HWND,X11 WindowWindowHandle所有指针类型,你可以自由和无损地在它们之间进行转换.所以每当你需要将一个包装好的窗口句柄返回给应用程序时,你就会做一个static_cast<WindowHandle>(some_hwnd),当你需要将app-specified WindowHandle转换为实际的平台类型时,同样的技巧就会反向运行.

如果您需要移植到不使用指针类型来表示Window句柄的平台,您可以将其包装在struct /类中并返回指向它的指针.