C++ 控件的CWnd::DefWindowProc上出现Stackoverlow异常的原因是什么

C++ 控件的CWnd::DefWindowProc上出现Stackoverlow异常的原因是什么,c++,mfc,stack-overflow,C++,Mfc,Stack Overflow,我在一个MFC应用程序中遇到了一个奇怪的问题,这个问题花了我很多时间才解决,而且对我来说很难检测到,这是CWnd::DefWindowProc方法上的堆栈溢出。它被递归调用,只针对特定对话框上的自定义按钮,该按钮在其他对话框上工作正常。后来我发现了这个问题,控件在不同的控件中被分为两个子类,这是我造成的真正的错误 我在模仿OWL在MFC中创建子控件的方式,当用户在构造函数中创建控件类的实例时,无需转到DoDataExchange来调用在基本对话框中完成的DDX_控件,它会迭代子对象列表来为它们调

我在一个MFC应用程序中遇到了一个奇怪的问题,这个问题花了我很多时间才解决,而且对我来说很难检测到,这是CWnd::DefWindowProc方法上的堆栈溢出。它被递归调用,只针对特定对话框上的自定义按钮,该按钮在其他对话框上工作正常。

后来我发现了这个问题,控件在不同的控件中被分为两个子类,这是我造成的真正的错误

我在模仿OWL在MFC中创建子控件的方式,当用户在构造函数中创建控件类的实例时,无需转到DoDataExchange来调用在基本对话框中完成的DDX_控件,它会迭代子对象列表来为它们调用它,在窗口获得句柄后,我们将调用它的SetupWindow()方法它就像.NET C#上的OnLoad一样,还有一件好事是,我首先使用GetDlgItem检查父项是否有一个ID为该ID的项。如果对话框中有一个控件,那么它是一个资源控件,需要DDX\u控件。否则,如果它不在对话框中,那么它是一个动态控件,我使用以前保存的属性调用CreateWindowEx在Attr成员中

这样就错过了另一个检查,是什么导致了该对话框中的堆栈溢出,程序员创建了两个具有相同ID的按钮[他根据图标绘制的ID,两个按钮都用于相同的作业,但用于同一对话框中的不同网格控件],用户在button类中使用消息映射捕获了button click,并为此调用了相应的例程,…不管怎样,当第一个按钮即将创建时,它的id不在对话框中,因此它是动态创建的,当第二个具有相同id的控件在对话框中搜索该id时,找到了是的,因此它将其视为资源控件并调用DDX_控件,然后它被子类化两次,从而导致堆栈溢出,以修复该问题,我将指向控件的指针存储为具有特殊名称的窗口属性,当在对话框中找到id时,获取其HWND如果它具有该属性,则它是先前创建的,我需要创建一个新的动态属性,否则它尚未创建

  • 我想说的是,不要将DDX_控件用于以前的 MFC中的子类控件

我希望这篇文章是可读的,我发布了这个问题的答案,以帮助任何有这个问题的人找到答案,我为此付出了很多。

后来我发现了这个问题,控件在不同的控件中被子类化了两次,这是我造成的一个真正的错误

我在模仿OWL在MFC中创建子控件的方式,当用户在构造函数中创建控件类的实例时,无需转到DoDataExchange来调用在基本对话框中完成的DDX_控件,它会迭代子对象列表来为它们调用它,在窗口获得句柄后,我们将调用它的SetupWindow()方法它就像.NET C#上的OnLoad一样,还有一件好事是,我首先使用GetDlgItem检查父项是否有一个ID为该ID的项。如果对话框中有一个控件,那么它是一个资源控件,需要DDX\u控件。否则,如果它不在对话框中,那么它是一个动态控件,我使用以前保存的属性调用CreateWindowEx在Attr成员中

这样就错过了另一个检查,是什么导致了该对话框中的堆栈溢出,程序员创建了两个具有相同ID的按钮[他根据图标绘制的ID,两个按钮都用于相同的作业,但用于同一对话框中的不同网格控件],用户在button类中使用消息映射捕获了button click,并为此调用了相应的例程,…不管怎样,当第一个按钮即将创建时,它的id不在对话框中,因此它是动态创建的,当第二个具有相同id的控件在对话框中搜索该id时,找到了是的,因此它将其视为资源控件并调用DDX_控件,然后它被子类化两次,从而导致堆栈溢出,以修复该问题,我将指向控件的指针存储为具有特殊名称的窗口属性,当在对话框中找到id时,获取其HWND如果它具有该属性,则它是先前创建的,我需要创建一个新的动态属性,否则它尚未创建

  • 我想说的是,不要将DDX_控件用于以前的 MFC中的子类控件

我希望这篇文章是可读的,我发布了这个问题的答案,以帮助任何有这个问题的人找到答案,我为此付出了很多。

嗯,这不是一个问题。@RaymondChen:我更改了标题。嗯,这不是一个问题。@RaymondChen:我更改了标题。