WNDCLASS和窗口句柄是分开还是同一类?

时间:2012-03-08 11:29:38

标签: c++ windows oop winapi

好吧,严重的困境。我试图包装Windows API。我遇到的最大的设计问题(现在)是什么类适合包装什么?由于我以前创建了一个Windows API包装器大约三次,总是遇到设计问题,这一次,我打算小心翼翼地在实现它们之前询问这里令人困惑的部分。

WNDCLASSCreateWindow创建的主窗口是否应该包含在单个类或单独的类中?我应该创建一个单身来容纳WNDCLASS吗?

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

3 个答案:

答案 0 :(得分:1)

你有没有使用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重量轻或重量轻。

答案 1 :(得分:1)

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

需要考虑的事项:

  1. 是否需要有多个WNDCLASS实例?
  2. 您是否希望客户访问WNDCLASS数据?
  3. Windows与WNDCLASS之间是否存在一对一关系,还是一对多?

答案 2 :(得分:1)

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

之前我做过的方法是你的CWindow类要求CWindowClass类的静态方法创建给定特定参数的窗口类。然后,CWindowClass注册一个新的窗口类,包含在CWindowClass中以返回给调用者,或者它通过缓存以前成功的类来回收现有的窗口类以返回调用者。

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