模态 CDialog 找不到资源 (MFC)

Posted

技术标签:

【中文标题】模态 CDialog 找不到资源 (MFC)【英文标题】:Modal CDialog doesn't find resources (MFC) 【发布时间】:2017-11-01 13:58:05 【问题描述】:

我在创建一个非常简单的 CDialog 应用程序时遇到了一些麻烦。我的目标是在我的代码的 main 函数中启动一个 CDialog 实例,等待它关闭并继续。当我在对话框中添加图片时,问题就出现了,它只是没有出现。我什至尝试以编程方式将其加载到 CStatic 中,在那里我找到了解决方法。如果我使用CBitmap::LoadBitmap(...),它会返回错误ERROR_RESOURCE_NAME_NOT_FOUND,但如果我使用::LoadImage(GetModulehandle(0), ...),它确实有效。所以看来问题出在模块句柄上。一个重要的注意事项是,如果我尝试将我的应用程序设置为无模式(使用 CWinApp),一切都可以完美运行,但我需要一个模态 CDialog!我不会放弃我的主要功能。提前谢谢你。

以防万一它可能有用,这里是代码(几乎全部):

MyDialog.h

#include<afxwin.h>
#include"resource.h"

class CMyDialog: public CDialog
public:
    enum IDD = IDD_DIALOG1 ;
    CMyDialog();
    ~CMyDialog();
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support
protected:
    DECLARE_MESSAGE_MAP()
;

MyDialog.cpp

#include"MyDialog.h"

CMyDialog::CMyDialog(): CDialog(CMyDialog::IDD)


CMyDialog::~CMyDialog()


void CMyDialog::DoDataExchange(CDataExchange* pDX)
    CDialog::DoDataExchange(pDX);


BEGIN_MESSAGE_MAP(CMyDialog, CDialog)
END_MESSAGE_MAP()

main.cpp

#include"MyDialog.h"

int main()
    CMyDialog mDialog;
    mDialog.DoModal();
    return 0;

【问题讨论】:

没有“模态”或“非模态”应用程序。模态或非模态是指对话框相对于其余应用程序的行为,即它是否允许用户与应用程序中的其他窗口进行交互。但在你的情况下,对话框是唯一的窗口......至于你的问题,我认为问题是由于没有按要求创建应用程序。尝试创建一个新的“基于对话框”的 MFC 应用程序,而不仅仅是自己使用 main()。 这个窗口将成为一个更大项目的一部分,当它出现时它需要停止与其他窗口的交互,这就是我所说的模态但我用错了,我是 MFC 的新手和一般的VC++。我不想使用该向导,因为它创建的项目基本上是 Visual Studio 的 UI,这让我无法理解它的小组件是如何工作的。是的,主要功能缺少一些说明,但现在它可以工作了。谢谢! 嗯,不确定这种方式是否可以阻止调用应用程序。加载您的应用程序后,该调用可能会立即返回。也许考虑将其改为 dll? 【参考方案1】:

问题是 MFC 代码在没有初始化的情况下无法运行。

如果你想拥有一个使用 MFC 的命令行应用程序,你需要调用 AfxWinInit。

向导将创建如下代码:

int main()

    int nRetCode = 0;

    HMODULE hModule = ::GetModuleHandle(nullptr);

    if (hModule != nullptr)
    
        // initialize MFC and print and error on failure
        if (!AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0))
        
            // TODO: change error code to suit your needs
            wprintf(L"Fatal Error: MFC initialization failed\n");
            nRetCode = 1;
        

使用基于对话框的应用程序或任何其他非命令行应用程序,将创建一个 CWinApp 单例。在进程内创建 CWinApp 对象后,将调用 AfxWinInit 函数。

主要是您的代码失败,因为未设置资源句柄。因此 MFC 找不到您的资源。

【讨论】:

你不知道我有多感激。问题是我无法使用该向导,因为我被限制使用 VS 2010(出于某种奇怪的原因),并且该向导会生成一个非常复杂的窗口系统作为单例。如果它对我的要求不高,为什么我能够使用 LoadImage 加载位图?此函数是否调用 AfxWinInit()?非常感谢! 作为单例的 Windows 系统?不,通常只有一个 CWinApp 单例。这个单例可以承载数百个窗口。如果你有一个 Windows 应用程序并且你使用 MFC,那么必须有一个 CWinApp 派生类,它调用 AfxWinInit...所以你的代码可能会工作。对于位于 MFC 应用程序中的扩展 DLL 和标准 DLL 也是如此...

以上是关于模态 CDialog 找不到资源 (MFC)的主要内容,如果未能解决你的问题,请参考以下文章

VS2012:“找不到资源编译器 DLL。请确保路径正确。”

MFC “DockPane”: 找不到标识符 求解(CDockablePane的)

找不到 c:\windows\system32\mfc100d.dll

在模态页面的情况下找不到管道“”

VS2015 MFC - 如何将静态库资源链接到项目

新建MFC工程再次打开找不到按钮视图