好吧,严重的困境。我试图包装Windows API。我遇到的最大的设计问题(现在)是什么类适合包装什么?由于我以前创建了一个Windows API包装器大约三次,总是遇到设计问题,这一次,我打算小心翼翼地在实现它们之前询问这里令人困惑的部分。
WNDCLASS
和CreateWindow
创建的主窗口是否应该包含在单个类或单独的类中?我应该创建一个单身来容纳WNDCLASS
吗?
另外,如果有人能给我一个流程图或一般想法,关于如何将Windows API抽象为类,一些好的设计技巧?
答案 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函数。
需要考虑的事项:
答案 2 :(得分:1)
它们应该是单独的类,原因很简单,因为多个窗口可以从同一个类继承。
之前我做过的方法是你的CWindow类要求CWindowClass类的静态方法创建给定特定参数的窗口类。然后,CWindowClass注册一个新的窗口类,包含在CWindowClass中以返回给调用者,或者它通过缓存以前成功的类来回收现有的窗口类以返回调用者。
然后,您的CWindow类可以设置使用已注册类的基础名称创建窗口句柄,并且当处理CWindow时,它可以减少CWindowClass上的引用计数 - 最后一个引用将正确释放该类。