我已从 VC 6 <项目项目迁移 * MFC *项目。 现在一个自定义对话框我们实现了使用CDialog :: DoModal 但它无法正常工作,它在此行失败 HRSRC hResource = :: FindResource(hInst,m_lpszTemplateName,RT_DIALOG) 与新项目一样,返回Null ,在旧中,获取值。 - 项目正常构建,所以我认为我不会忘记导入资源? - 如果这可能与问题有关,我在新项目中使用色带? - 我应该将自定义对话框的继承更改为 CDialogEx 吗?
更新 我创建了一个新的自定义对话框,继承了CDialog和DoModal非常有效 问题在于那些行完全在DoModal
中hInst = AfxFindResourceHandle(m_lpszTemplateName, RT_DIALOG);
HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG);
hDialogTemplate = LoadResource(hInst, hResource);
由于hInst没有正常返回,所以所有其他调用都失败了。 该问题与使用另一个dll中的对话框和资源有关。 我仍然不明白为什么问题出现在VS2010中并且没有出现在VS 6中。 怎么可以解决这个问题!
答案 0 :(得分:1)
嗯,它没有找到资源,所以有两种可能性:
1)资源不在您的可执行文件中 2)包含资源的模块不在MFC资源链中
首先,打开您认为该资源位于IDE中的.exe或.dll文件。在IDE中打开模块时,它将作为资源文件打开。搜索模块中的对话框并验证它确实在模块中。
如果确实验证了资源在模块中,那么在调用DoModal()之前,使用包含资源的模块的HINSTANCE调用AfxSetResourceHandle()。
答案 1 :(得分:0)
我认为你的HINSTANCE错误了。你可以按如下方式获得HINSTANCE:
HINSTANCE hInstance = (HINSTANCE)GetModuleHandle( NULL );
因此,以下代码应该起作用:
hInst = (HINSTANCE)GetModuleHandle( NULL );
HRSRC hResource = ::FindResource(hInst, m_lpszTemplateName, RT_DIALOG);
hDialogTemplate = LoadResource(hInst, hResource);
答案 2 :(得分:0)
尝试更改IDD_YOURDIALOG
的指定号码。也许它与MFC 10.0中的一些新资源冲突?
答案 3 :(得分:0)
缺少资源的问题。 1-添加适当的rc文件以预测显示的问题。 2-解决了资源中的一些重复问题。
仍然没有理解为什么它在旧项目中工作而在新项目中失败了。
答案 4 :(得分:0)
可能为时已晚,但我发现这篇帖子是因为我遇到了类似的问题。问题出在Vista对话框样式中,这在VS2010中是默认的。我刚刚在基类初始化中添加了两个零,它开始像以前一样工作:
IMPLEMENT_DYNAMIC(LoadAscii_dlg, CFileDialog)
LoadAscii_dlg::LoadAscii_dlg(LPCTSTR lpszFileName) :
CFileDialog( TRUE, "txt", lpszFileName,
OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_ENABLETEMPLATE | OFN_EXPLORER,
"Text Files (*.txt)|*.txt|Comma Separated Values (*.csv)|*.csv|All Files (*.*)|*.*||", 0,**0,0** )
{
m_ofn.lpTemplateName = MAKEINTRESOURCE( IDD_LOADASCII );
....
}