MFC:为什么它不能根据参数类型选择正确的函数?
MFC: why it cannot pick up the right function based on argument type?
在程序中,我尝试在单击菜单项时弹出一个对话框。
void CMyDoc::OnFileTest()
{
m_dialog = new CMyDialog;
m_dialog->Create(CMyDialog::IDD, GetDesktopWindow());
m_dialog->ShowWindow(SW_SHOW);
}
当我将鼠标悬停在 "Create" 函数 (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,不用cast也能编译。
一个区别是我在Doc中使用Create,而上面在Dialog中使用??
如果 IDD
是一个枚举值,您需要将其转换为 UINT
以便利用该重载。
m_dialog->Create((UINT)CMyDialog::IDD, GetDesktopWindow());
查看您的对话框的 header,您将看到,例如:
// 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
returns HWND
而不是 CWnd *
。所以你又回到了同样的场景。如果可以接受,您可以转换为 CWnd *
或使用 this
。
根据我的研究,您应该能够这样做以获得 CWnd *
:
CWnd* pWnd = CWnd::FromHandlePermanent ( GetDesktopWindow());
我在评论中得知有一个更简单的解决方案:
m_dialog->Create(static_cast<UINT>(CMyDialog::IDD), CWnd::GetDesktopWindow());
有关详细信息,请参阅 CWnd::GetDesktopWindow()
。
在程序中,我尝试在单击菜单项时弹出一个对话框。
void CMyDoc::OnFileTest()
{
m_dialog = new CMyDialog;
m_dialog->Create(CMyDialog::IDD, GetDesktopWindow());
m_dialog->ShowWindow(SW_SHOW);
}
当我将鼠标悬停在 "Create" 函数 (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,不用cast也能编译。
一个区别是我在Doc中使用Create,而上面在Dialog中使用??
如果 IDD
是一个枚举值,您需要将其转换为 UINT
以便利用该重载。
m_dialog->Create((UINT)CMyDialog::IDD, GetDesktopWindow());
查看您的对话框的 header,您将看到,例如:
// 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
returns HWND
而不是 CWnd *
。所以你又回到了同样的场景。如果可以接受,您可以转换为 CWnd *
或使用 this
。
根据我的研究,您应该能够这样做以获得 CWnd *
:
CWnd* pWnd = CWnd::FromHandlePermanent ( GetDesktopWindow());
我在评论中得知有一个更简单的解决方案:
m_dialog->Create(static_cast<UINT>(CMyDialog::IDD), CWnd::GetDesktopWindow());
有关详细信息,请参阅 CWnd::GetDesktopWindow()
。