Winapi WMNCUCREATE中按钮等的CreateWindowEx lpParam

Winapi WMNCUCREATE中按钮等的CreateWindowEx lpParam,winapi,Winapi,我将指针作为lpParam参数传递给控件的类包装器实例指针,并在接收WN\u NCCREATE时捕获它 创建静态或按钮等控件时,此消息不会被发送(到目前为止) 因此,我创建了一个窗口、一个静态窗口和一个按钮,记录实例的指针,并且windows指针只收到一条WN\NCCREATE消息 我的问题是:如何获得传递的参数 在几年前的上一次尝试中,我使用了一个std::maphwnd->ptr,效果很好。在这次尝试中,我试图深入了解WinAPI并尝试一种不同的方法。现在我被这个问题困扰着,谷歌搜索结果到目

我将指针作为
lpParam
参数传递给控件的类包装器实例指针,并在接收
WN\u NCCREATE
时捕获它

创建静态或按钮等控件时,此消息不会被发送(到目前为止)

因此,我创建了一个窗口、一个静态窗口和一个按钮,记录实例的指针,并且windows指针只收到一条
WN\NCCREATE
消息

我的问题是:如何获得传递的参数

在几年前的上一次尝试中,我使用了一个
std::maphwnd->ptr
,效果很好。在这次尝试中,我试图深入了解WinAPI并尝试一种不同的方法。现在我被这个问题困扰着,谷歌搜索结果到目前为止帮不了什么忙


我应该坚持使用地图还是有其他解决方案?

要执行您正在尝试的操作,您可以执行以下操作:

  • 调用/获取您试图包装的预先存在的类的默认/注册详细信息,例如
    按钮

  • WNDCLASS::lpfnWndProc
    字段更改为指向您自己的窗口消息处理程序,并将
    WNDCLASS::lpszClassName
    字段更改为您自己的自定义类名。根据需要更改任何其他
    WNDCLASS
    字段

  • 使用修改后的
    WNDCLASS/EX
    调用/

现在,您可以使用自定义类名调用
CreateWindow/Ex()
,所有创建消息,包括
WM\u NCCREATE
,都将通过窗口消息处理程序

这就是Embarcadero的VCL框架对标准Windows控件进行子类化的方式


另请参见:.

如果不对系统控件进行子分类,则无法截获发送到系统控件的消息,并且当您可以对a类控件进行子分类时,它已经被创建,并且
WM\NCCREATE
消息早已被处理。你到底想做什么?我几乎可以肯定有更好的方法。我正在尝试将GUI封装到类中,并使用一些c++nn特性来创建一个漂亮的API。只是玩玩而已。每个小部件的实例都有自己的wndproc,负责触发事件。观察到的字段模板负责发送和接收消息,然后设置成员等。要让成员和进程识别实例,以便将消息传递给其wndproc。这不是标准Windows控件中事件处理的工作方式。要执行您想要执行的操作,您需要a)从头开始编写所有控件,或者b)通过从那里回调类来处理容器窗口过程中的事件。您可以使用
SetWindowLongPtr(hwnd,GWLP\u USERDATA,(LPARAM)this)
对于绑定windows控件或自定义窗口到类实例指针*您只能在调用了
RegisterClass()
的窗口上使用
GWLP\u USERDATA
;否则你就不会拥有那记忆。我假设OP已经在他们的顶层窗口中这样做了。