模态 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的)