WNDCLASS和Window句柄在单独的或相同的类中

WNDCLASS and Window Handle in Seperate or Same Class?

本文关键字:单独 Window 句柄 WNDCLASS      更新时间:2023-10-16

好吧,严重的困境。我正在尝试包装Windows API。我(目前)遇到的最大的设计问题是什么类适合包装什么?由于我之前已经创建了大约三次Windows API包装器,总是在中间遇到设计问题,这一次,我打算谨慎行事,在实现它们之前询问这里令人困惑的部分。

WNDCLASSCreateWindow创建的主窗口应该封装在单个类中还是单独的类中?我应该创建一个单例来保存WNDCLASS吗?

另外,如果有人能给我一个流程图或一般的想法,关于如何将Windows API抽象为类,一些好的设计技巧?

要获得好的灵感来源,请查看.Net框架-没有WNDCLASS的概念!您可以让您的库创建一个WNDCLASS,供所有窗口共享。您不需要singleton(uurrgghhh),因为类可以由字符串使用。如果您想更改WNDCLASS为特定窗口定义的一些特性,我认为您可以使用SetWindowLongPtr函数。

需要考虑的事项:

  1. 是否需要拥有多个WNDCLASS实例
  2. 是否希望客户端访问WNDCLASS数据
  3. windows和WNDCLASS之间是一对一的关系,还是一对多的关系

您不使用ATL的原因是什么?

将ATL CWindow视为窗口的轻量级包装:

class CMyWindow : public CWindowImpl<CMyWindow>, ...
{
public:
   // Optionally specify name of the new Windows class
   DECLARE_WND_CLASS("MyName") 
              // If this macro is not specified in your
              // class, ATL will generate a class name
   ...
   BEGIN_MSG_MAP(CMyWindow)
      MESSAGE_HANDLER(WM_PAINT, OnPaint)
   END_MSG_MAP()
   LRESULT OnPaint(UINT nMsg, WPARAM wParam, 
                   LPARAM lParam, BOOL& bHandled)
   {
      // Do some painting code
      return 0;
   }
};

使用ATL,可以随心所欲地重或轻。

它们应该是独立的类,原因很简单,多个窗口可以从同一个类继承。

我以前做过的方法是,您的CWindow类要求CWindowClass类的一个静态方法在给定特定参数的情况下创建一个窗口类。然后,CWindowClass要么注册一个新的窗口类,封装在CWindowClass中返回给调用者,要么通过缓存以前成功的类来回收现有的窗口类返回给调用者。

然后,您的CWindow类可以设置使用注册类的基础名称创建一个窗口句柄,并且当CWindow被释放时,它可以减少CWindowClass上的引用计数,最后一次取消引用将正确释放该类。