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

时间:2010-11-02 08:19:36

标签: c++ opengl encapsulation direct3d hwnd

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

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

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

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

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

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

- 编辑

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

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

3 个答案:

答案 0 :(得分:6)

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

struct WindowHandleImpl;
typedef WindowHandleImpl *WindowHandle;

C ++允许您使用指向不完整类型的指针 - 只是不要在任何地方定义WindowHandleImpl的内容,WindowHandle是完全不透明的类型,可以由App传递披露任何实施细节。

因为HWND,X11 WindowWindowHandle都是指针类型,所以您可以自由地和无损地在它们之间进行投射。因此,每当您需要将一个包装的窗口句柄返回给应用程序时,您执行static_cast<WindowHandle>(some_hwnd),当您需要将应用程序指定的WindowHandle转换为实际的平台类型时,相同的技巧会相反。

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

答案 1 :(得分:2)

通过虚函数公开句柄上的操作:

class GenericHandle
{
    public:
        virtual void some_operation() = 0;
};

// Windows API
class WindowsHandle : public GenericHandle
{
    public:
        virtual void some_operation()
        {
            WndOperation (handle_);
        }
    private:
        HANDLE* handle_;
};

// Some X system API
class XHandle : public GenericHandle
{
    public:
        virtual void some_operation()
        {
           XOperation (handle_);
        }
    private:
        XVOID* handle_;
};

配置GraphicsAdapter的可能方法:

GraphicsAdapter* ga = new GraphicsAdapter(GenericHandleFactory::get_handle(SYSTEM_ID));

答案 2 :(得分:-1)

记录您期望使用它的方式。

相信你团队中的其他程序员。

不要写一堆代码试图直接将你的团队编码为只按照你想要的方式进行编码。更多的代码意味着需要维护更多的代码,更多的错误机会,更多的混乱让下一个看着这段代码的人想知道它在做什么。