MF C: почему он не может подобрать правильную функцию в зависимости от типа аргумента? - PullRequest
0 голосов
/ 06 апреля 2020

В программе я пытаюсь вызвать диалоговое окно при нажатии элемента меню.

void CMyDoc::OnFileTest()
{
    m_dialog = new CMyDialog;
    m_dialog->Create(CMyDialog::IDD, GetDesktopWindow());
    m_dialog->ShowWindow(SW_SHOW);
}

При наведении указателя мыши на функцию «Создать» (VSE-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, который может компилироваться без приведения.

Одно отличие состоит в том, что я использую Create in Do c, а вышеперечисленное использует в диалоге ??

Ответы [ 2 ]

3 голосов
/ 06 апреля 2020

Посмотрите на заголовок вашего диалога, и вы увидите, в качестве примера:

// Dialog Data
enum { IDD = IDD_DIALOG_ASSIGN_HISTORY };

Или вы можете навести курсор мыши на IDD, чтобы увидеть определение:

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

I в комментариях было сообщено, что существует более простое решение:

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

См. CWnd::GetDesktopWindow() для получения дополнительной информации.

1 голос
/ 06 апреля 2020

Если IDD является значением перечисления, вам нужно привести его к UINT, чтобы воспользоваться этой перегрузкой.

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