【问题标题】:MFC: why it cannot pick up the right function based on argument type?MFC:为什么它不能根据参数类型选择正确的函数?
【发布时间】:2020-07-18 22:21:21
【问题描述】:

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

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 中使用??

【问题讨论】:

  • 你能告诉我们CMyDialog类的定义——具体来说,(大概是staticIDD成员是如何声明和定义的?
  • @AdrianMole 这些是系统在旧版 Visual Studio 中创建对话框时声明的标准变量。
  • @AndrewTruckle 好点!我不再使用那些自动生成的 IDD,我已经忘记了它们的本质!
  • @AdrianMole 我的两个项目始于 2002 年,所以有很多类都包含这些 IDD 定义。:)
  • 查看我的更新答案。

标签: c++ visual-studio visual-c++ mfc


【解决方案1】:

看看你的对话框的标题,你会看到一个例子:

// 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());

我在 cmets 中被告知有一个更简单的解决方案:

m_dialog->Create(static_cast<UINT>(CMyDialog::IDD), CWnd::GetDesktopWindow());

请参阅CWnd::GetDesktopWindow() 了解更多信息。

【讨论】:

  • 对不起,它不起作用,请检查我的新编辑。谢谢。
  • 在您提到的文章中,它没有指定第二个参数,而是在函数声明中使用默认值(NULL)。
  • CWnd 类中有一个名为 GetDesktopWIndow() 的静态函数,它返回一个 CWnd*。
  • @JosephWillcoxson 啊,你的意思是CWnd::GetDesktopWIndow()。谢谢。
【解决方案2】:

如果 IDD 是一个枚举值,您需要将其强制转换为 UINT 以利用该重载。

m_dialog->Create((UINT)CMyDialog::IDD, GetDesktopWindow());

【讨论】:

  • 对不起,它不起作用,请检查我的新编辑。谢谢。
猜你喜欢
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多