我想创建自己的类来处理创建窗口和窗口过程,但我注意到窗口过程必须是静态的!我现在想知道是否有可能使窗口过程面向对象?我已经阅读了一些关于面向对象窗口的教程,但是它们总是让程序变得静态 - 这是什么用的?:/
任何关于如何解决这个问题的链接或信息将不胜感激,
谢谢
众所周知,GWLP_USERDATA可用于将一些指针大小数据与指定窗口相关联。但谁有权这样做呢?显然,如果两段代码独立执行此操作 - 一段是覆盖另一段的数据 - 所以必须只有一个所有者。但必须明确确定一个一般规则——谁是GWLP_USERDATA细胞的所有者?它属于谁?
可以是两个内部一致的协议:
必须使用这两种解决方案中的哪一种?
GWLP_USERDATA:
设置与窗口关联的用户数据。此数据旨在供创建窗口的应用程序使用。它的值最初为零。
怎么需要明白This data is intended for use by the application that created the window?
所以调用CreateWindowEx, CreateDialogParam,DialogBoxParam等的代码-只有这个代码可以使用GWLP_USERDATA. 由此也得出窗口类实现者不能使用GWLP_USERDATA. GWLP_USERDATA用于将类的实例绑定到指定窗口的大量示例是不正确的。管理应用程序状态- 官方 MSDN 示例,GWLP_USERDATA用于将数据结构绑定到窗口的位置不正确?!
SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pThis);
在这条规则下是错误的。
有什么可以说支持这个版本的?我检查了不同的 Windows 版本(从 xp 到 win10) - 我如何看到所有 Windows 内置窗口类(WC_*和其他)使用
SetWindowLongPtr(hwnd, 0, …
我有这个简单的代码:
#include <iostream>
#include <functional>
class a {
public:
a() {
func = [] {
static int i = 0;
i++;
std::cout << i << std::endl;
};
}
std::function<void()> func;
};
int main()
{
a a1;
a1.func();
a a2;
a2.func();
}
Run Code Online (Sandbox Code Playgroud)
我期望这样的输出:
1
1
Run Code Online (Sandbox Code Playgroud)
但它却是:
1
2
Run Code Online (Sandbox Code Playgroud)
然后我检查了两个实例中 lambda 表达式的内存地址a,它们是相同的。这意味着 lambda 创建一次,然后在所有实例中使用。我正在寻找的是让构造函数每次被调用时都创建一个不同的 lambda。我关闭了编译器优化,但没有效果。
信息:我正在使用 MSVC。