在程序中,我尝试单击菜单项时弹出一个对话框。

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上以查看定义:

c++ - MFC:为什么不能根据参数类型选择正确的函数?-LMLPHP

注意,变量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/

10-10 01:44