WNDCLASS和Window句柄在单独的或相同的类中
WNDCLASS and Window Handle in Seperate or Same Class?
好吧,严重的困境。我正在尝试包装Windows API。我(目前)遇到的最大的设计问题是什么类适合包装什么?由于我之前已经创建了大约三次Windows API包装器,总是在中间遇到设计问题,这一次,我打算谨慎行事,在实现它们之前询问这里令人困惑的部分。
WNDCLASS
和CreateWindow
创建的主窗口应该封装在单个类中还是单独的类中?我应该创建一个单例来保存WNDCLASS
吗?
另外,如果有人能给我一个流程图或一般的想法,关于如何将Windows API抽象为类,一些好的设计技巧?
要获得好的灵感来源,请查看.Net框架-没有WNDCLASS的概念!您可以让您的库创建一个WNDCLASS,供所有窗口共享。您不需要singleton(uurrgghhh),因为类可以由字符串使用。如果您想更改WNDCLASS为特定窗口定义的一些特性,我认为您可以使用SetWindowLongPtr函数。
需要考虑的事项:
- 是否需要拥有多个WNDCLASS实例
- 是否希望客户端访问WNDCLASS数据
- 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上的引用计数,最后一次取消引用将正确释放该类。
- 如何在C++中从两个单独的for循环中添加两个数组
- 用C++在单独的头文件中完成函数体
- 类模板的成员功能的定义在单独的TU中完全专业化
- 如何使用单独文件中的派生类访问友元函数对象
- CoInitialize()在单独的线程上崩溃而不返回
- avrogencpp能为模式中的每种类型生成单独的头文件吗
- 转换函数,将 std::数组的双精度作为参数或双精度作为参数单独转换
- 单独定义模板化嵌套类方法的正确语法
- 如何将 2 个类分成单独的 .h 文件并正确设置它们
- C++ 链接到单独的.cpp文件说"multiple definitions"
- 从单独的文件中读取树
- 将字符串拆分为标记,并将标记拆分为两个单独的数组
- C++计算器,不能单独除以 0
- 自 Windows 10 20H1 以来,具有单独线程的多个窗口停止工作
- 当结构位于单独的头文件中时'unregistered datatype'在 QML 中出现Q_GADGET错误
- 通过单独的 tcp 流建立 http 连接
- Cmake:为 C 设置警告级别,并为 MSVC 单独设置C++代码(Visual C++)
- 如何将字符串和整数读取到两个单独的动态数组中的程序编写?
- window.display() 单独在显示的最后一个缓冲区和当前缓冲区之间切换
- WNDCLASS和Window句柄在单独的或相同的类中