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

标签 c++ opengl encapsulation direct3d hwnd

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

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

如果 Window 子系统允许访问低级 API 句柄,则封装很可能会被破坏。

如果它允许窗口进入全屏和返回全屏,但必须触发事件警告系统有关这些更改,并且低级句柄被用来在它不知情的情况下切换到全屏怎么办?

如何确保句柄从 Window 子系统安全地传送到 GraphicsAdapter 而不会被滥用,并且仍然足够灵活以允许稍后添加其他子系统(如 GraphicsAdapter),同时保持类型安全?

有没有一种方法可以封装句柄,使 Direct3D 和 OpenGL 可以从句柄访问足够的内容以正常工作?

-- 编辑

除了将句柄从一个子系统安全地转移到另一个子系统之外,例如,知道子系统可以由不同的编码人员团队编写,是否有任何方法可以提醒他们句柄的使用方式?

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

最佳答案

HWND 和 X11 窗口句柄都是指针类型。你可以利用它来发挥你的优势。做这样的事情:

struct WindowHandleImpl;
typedef WindowHandleImpl *WindowHandle;

C++ 允许您很好地处理指向不完整类型的指针 - 只是不要定义 WindowHandleImpl 的内容任何地方和WindowHandle是一种完全不透明的类型,可以在不公开任何实现细节的情况下由应用程序传递。

因为 HWND , X11 WindowWindowHandle都是指针类型,你可以在它们之间自由无损地转换。因此,无论何时您需要将包装的窗口句柄返回给应用程序,您都可以执行 static_cast<WindowHandle>(some_hwnd)。 ,当您需要转换应用程序指定的 WindowHandle 时,同样的技巧可以反向使用。转化为实际的平台类型。

如果您需要移植到一个不使用指针类型来表示窗口句柄的平台,您可以将它包装在一个结构/类中并返回一个指向它的指针。

关于c++ - 如何最好地封装窗口句柄?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4075931/

相关文章:

c++ - 共享库中静态函数成员的销毁顺序

C++ ⎼ 两个相似的函数,但表现却大不相同

c++ - 应用程序的一个实例,平台无关,C++11

仅包含私有(private)成员的 Java 类

c++ - 当不使用指针来跟踪当前节点时,为什么树遍历会导致未定义的行为?

xcode - OpenCv ImShow()函数闪烁

java - 如何检查相机前面是否有物体?

android - 使用 glMultMatrixf 进行翻译,以及何时规范化

java - 我应该为永远不会改变的字段值使用访问器吗?

java - 类的 getters() 和 setters() 简化