在任务栏中显示MFC对话框

在任务栏中显示MFC对话框,mfc,dialog,taskbar,non-modal,Mfc,Dialog,Taskbar,Non Modal,我有一个应用程序,它使用来自两个DLL的对话框。两个DLL中对话框的代码几乎相同: 两个对话框在RC文件中具有相同的样式:DS\u SETFONT| DS|MODALFRAME | WS|U弹出窗口| WS|U标题| WS|U系统菜单 这两个对话框都使用ShowWindow(SW\u SHOW)显示 这两个对话框都是按需创建的,而不是在应用程序启动时创建的 两个对话框都有一个空的父对话框 这两个对话框都继承自CDialog 唯一的区别是: 在对话框A中,在对话框构造函数之前调用AFX\u MAN

我有一个应用程序,它使用来自两个DLL的对话框。两个DLL中对话框的代码几乎相同:

  • 两个对话框在RC文件中具有相同的样式:
    DS\u SETFONT|
    DS|MODALFRAME | WS|U弹出窗口| WS|U标题| WS|U系统菜单
  • 这两个对话框都使用
    ShowWindow(SW\u SHOW)
    显示
  • 这两个对话框都是按需创建的,而不是在应用程序启动时创建的
  • 两个对话框都有一个空的父对话框
  • 这两个对话框都继承自CDialog
  • 唯一的区别是:

  • 在对话框A中,在对话框构造函数之前调用
    AFX\u MANAGE\u STATE()
    ,而对于对话框B,则在构造函数的开头调用它
  • 我看不出这些差异有什么区别,但是,当我显示对话框时,对话框A在任务栏和对话框B中没有图标,而且,将主窗口移到前面会使对话框A移到前面(反之亦然),而对话框B则独立运行

    我想让对话框B的行为像对话框A一样。有人能告诉我为什么会有这种行为差异,以及如何修复它,使对话框B的行为像对话框A一样吗

    我知道您会喜欢示例代码,但这需要一些时间(我不需要)来编写。现有的代码都是公司的商业代码,也是一个巨大的应用程序,从中提取关键部分确实非常困难

    **更新** 如果我在调用
    AFX\u MANAGE\u STATE()
    之前在对话框B的控制器中调用::AfxGetMainWnd(),我可以获得指向主窗口指针的指针。耶!然后,当我将其传递给
    Create()
    时,程序崩溃。嘘


    看起来我无法将主窗口设置为对话框B的所有者,我认为这可以解决我的问题,大概是因为对话框B位于DLL中。我不明白的是,这为什么适用于dialog A。

    实现dialog A的DLL实例化了CWinApp的一个实例。实现对话框B的DLL没有

    要解决此问题,只需将以下行添加到CPP文件,可能是一个独立的“the_app.CPP”文件:

    即“应用程序cpp”:


    要诊断您的问题,您需要了解什么是“模块”,以及如何工作。你提出的答案没有解决真正的问题。如果在我的答案中附加此评论,而不是问题,可能会更好。我读了那篇文章,现在并不比以前聪明。它没有说明任何种类的窗口,也没有说明为什么需要有一个CWinApp实例才能使DLL对话框正确地归主应用程序所有。我猜,当您在DLL中实例化CWinApp时,它会识别属于主应用程序进程的单例应用程序对象,并将自身连接到该对象,然后创建的所有对话框在创建时在当前模块中查找CWinApp,并将其设置为其所有者。因此,对话框不需要任务栏图标,当您将主应用程序窗口放在前面时,对话框窗口也会放在前面。你认为什么是“真正”的问题,我的答案没有解决?据我的调查所知,对话在当前模块上下文中没有任何内容可供父对象,根据我的回答,添加一个CWinApp实例可以解决这个问题。请您发布一个“正确”的答案以及向下投票。我很感谢你的评论(在这里期待,但一开始没有看到)。最简单的解决方案是调用并将其作为所有者传递给对话框
    CWinApp
    是一个单例。在一个应用程序中创建多个副本会造成不可预测的破坏。很遗憾,我已经超出了允许我更正打字错误的五分钟时间范围。谢谢,我无法预知。遗憾的是我试过了。在当前模块上下文中调用它会返回一个空指针,如问题中所述,在
    AFX\u MANAGE\u STATE()
    之前调用它以获取一个非空指针,然后在上下文中使用它(以便对话框的ID与DLL的资源文件匹配)会导致崩溃。您需要创建一个非空指针。请参阅以获取概述和决定所需DLL类型的指南)。
    CWinApp dummy;
    
    #include "stdafx.h"
    
    CWinApp dummy;