在程序中,我尝试单击菜单项时弹出一个对话框。
void CMyDoc::OnFileTest()
{
m_dialog = new CMyDialog;
m_dialog->Create(CMyDialog::IDD, GetDesktopWindow());
m_dialog->ShowWindow(SW_SHOW);
}
当我将鼠标悬停在“创建”功能(VS-2008 IDE)上时,它显示了两个重载。
Create(LPCTSTR..., CWnd *);
Create(UINT..., CWnd *);
但是,当我构建它时,为什么编译器坚持认为它应该采用第一个。如何解决?
error C2664: 'BOOL CDialog::Create(LPCTSTR,CWnd *)' : cannot convert parameter 1 from '' to 'LPCTSTR'
编辑
我尝试按照答案中的建议将IDD强制转换为UINT,但是它不起作用...
error C2664: 'BOOL CDialog::Create(LPCTSTR,CWnd *)' : cannot convert parameter 1 from 'UINT' to 'LPCTSTR'
实际上,我从该项目中复制了代码:https://www.codeproject.com/Articles/1651/Tutorial-Modeless-Dialogs-with-MFC,无需进行强制转换即可进行编译。
区别之一是我在Doc中使用了Create,而上述在Dialog中使用了??
最佳答案
看一下对话框的标题,您将看到一个示例:
// Dialog Data
enum { IDD = IDD_DIALOG_ASSIGN_HISTORY };
或者,您可以将鼠标悬停在
IDD
上以查看定义:注意,变量
IDD
实际上是enum
吗?具体来说,它是而不是UINT
类型的。结果,您的编译器找不到正确的替代,最终尝试使用LPCTSTR
版本,但失败了。正如已经回答的那样,您需要强制转换
IDD
变量,m_dialog->Create(static_cast<UINT>(CMyDialog::IDD), GetDesktopWindow());
这样,编译器将不会抱怨。
Win32 SDK的
GetDesktopWindow
返回HWND
而不是CWnd *
。因此,您又回到了相同的情况。您可以强制转换为CWnd *
或使用this
(如果可以)。从我的研究中,您应该能够做到这一点以获得
CWnd *
:CWnd* pWnd = CWnd::FromHandlePermanent ( GetDesktopWindow());
有人在评论中告知我,有一个更简单的解决方案:
m_dialog->Create(static_cast<UINT>(CMyDialog::IDD), CWnd::GetDesktopWindow());
有关更多信息,请参见
CWnd::GetDesktopWindow()
。关于c++ - MFC:为什么不能根据参数类型选择正确的函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61067936/