相关疑难解决方法(0)

面向对象的c ++ win32?

我想创建自己的类来处理创建窗口和窗口过程,但我注意到窗口过程必须是静态的!我现在想知道是否有可能使窗口过程面向对象?我已经阅读了一些关于面向对象窗口的教程,但是它们总是让程序变得静态 - 这是什么用的?:/

任何关于如何解决这个问题的链接或信息将不胜感激,

谢谢

c++ winapi

8
推荐指数
2
解决办法
6338
查看次数

谁是 GWLP_USERDATA 单元的所有者?

众所周知,GWLP_USERDATA可用于将一些指针大小数据与指定窗口相关联。但谁有权这样做呢?显然,如果两段代码独立执行此操作 - 一段是覆盖另一段的数据 - 所以必须只有一个所有者。但必须明确确定一个一般规则——谁是GWLP_USERDATA细胞的所有者?它属于谁?

可以是两个内部一致的协议:

  1. 创建窗口的代码是所有者。属于窗口的创建者
  2. 实现窗口类的代码。属于窗口类实现者

必须使用这两种解决方案中的哪一种?

1. 来自MSDN

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, …

windows winapi

6
推荐指数
0
解决办法
439
查看次数

如何让构造函数每次调用时创建不同的 lambda?

我有这个简单的代码:

#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。

c++ lambda constructor

3
推荐指数
1
解决办法
97
查看次数

标签 统计

c++ ×2

winapi ×2

constructor ×1

lambda ×1

windows ×1