没有重载函数的实例与参数列表匹配 C++ - 创建无模式对话框

问题描述 投票:0回答:1

我正在尝试使用 Create() 和 ShowWindow() 函数从资源创建一个无模式对话框。 但最终出现错误“没有重载函数的实例与参数列表 C++ 匹配” 这是我的应用程序命令.cpp

void
CSurveyApp::OnAskAI()
{
    //MessageBox()
    /*dlg_AskAI dlg_AskAI;
    dlg_AskAI.DoModal();*/
    dlg_AskAI m_dialog;
    if (!m_dialog) {
        m_dialog.Create(IDD_ASKAI, this);
        m_dialog.ShowWindow(SW_SHOW);
    }
    
    
}

这是dialog.h文件

#pragma once
#include "afxdialogex.h"


// dlg_AskAI dialog

class dlg_AskAI : public CDialog
{
    DECLARE_DYNAMIC(dlg_AskAI)

public:
    dlg_AskAI(CWnd* pParent = nullptr);   // standard constructor
    virtual ~dlg_AskAI();

// Dialog Data
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_ASKAI };
#endif

protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV support

    DECLARE_MESSAGE_MAP();
public:
    afx_msg void OnBnClickedButton2();
    afx_msg void OnEnChangeEdit3();
    afx_msg void OnBnClickedButton3();
    afx_msg void OnEnChangeEdit4();
    afx_msg void OnClose();
private:
    CString m_message;

};

这是dialog.cpp文件

// dlg_AskAI.cpp : implementation file
//

#include "StdAfx.h"
#include "afxdialogex.h"
#include "resource.h"
#include "dlg_AskAI.h"


// dlg_AskAI dialog

IMPLEMENT_DYNAMIC(dlg_AskAI, CDialog)

dlg_AskAI::dlg_AskAI(CWnd* pParent /*=nullptr*/)
    : CDialog(IDD_ASKAI, pParent)
    , m_message(_T(""))
{

}
CString m_message;
dlg_AskAI::~dlg_AskAI()
{
}

void dlg_AskAI::DoDataExchange(CDataExchange* pDX)
{
    CDialog::DoDataExchange(pDX);
    DDX_Text(pDX, IDC_EDIT3, m_message);
}


BEGIN_MESSAGE_MAP(dlg_AskAI, CDialog)
    ON_BN_CLICKED(IDC_BUTTON2, &dlg_AskAI::OnBnClickedButton2)
    ON_EN_CHANGE(IDC_EDIT3, &dlg_AskAI::OnEnChangeEdit3)
    ON_BN_CLICKED(IDC_BUTTON3, &dlg_AskAI::OnBnClickedButton3)
    ON_BN_CLICKED(IDC_EDIT4, &dlg_AskAI::OnEnChangeEdit4)
END_MESSAGE_MAP()


void dlg_AskAI::OnClose()
{
    DestroyWindow();
}
//Contact Us
void dlg_AskAI::OnBnClickedButton2()
{
    // TODO: Add your control notification handler code here
}


void dlg_AskAI::OnEnChangeEdit3()
{
    // TODO:  If this is a RICHEDIT control, the control will not
    // send this notification unless you override the CDialog::OnInitDialog()
    // function and call CRichEditCtrl().SetEventMask()
    // with the ENM_CHANGE flag ORed into the mask.

    // TODO:  Add your control notification handler code here

    
}

//Send Button
void dlg_AskAI::OnBnClickedButton3()
{
    
}


void dlg_AskAI::OnEnChangeEdit4()
{
  
}

最终出现此错误

no instance of overloaded function "dlg_AskAI::Create" matches the argument list

第一次提问,请多多包涵。请注意,我对 C++ 的经验非常少,请帮忙 T.T

c++ mfc modeless-dialog
1个回答
0
投票

CDialog::Create的第二个参数应该是CWnd*

而不是
CApp*
,您应该将第二个参数留空,默认为null。

对话框的生命周期有问题,无模式对话框(与模式对话框不同)无法在堆栈上创建。 (因为 1. 它们比堆栈更耐用,2. 它们本身

delete

)。

要解决此问题,您需要

    在您的
  1. CApp
     对象中保存指向窗口的指针。
  2. 遵循
  3. 备注中有关模型对话框的 MSDN 文档
当您实现无模式对话框时,请始终重写 OnCancel 成员函数并从其中调用 DestroyWindow。不要打电话给 基类 CDialog::OnCancel,因为它调用 EndDialog,这将 使对话框不可见,但不会破坏它。你也应该 覆盖无模式对话框的 PostNcDestroy 以删除 这是因为非模式对话框通常分配有 new。 模态对话框通常构建在框架上,并不 需要 PostNcDestroy 清理。

© www.soinside.com 2019 - 2024. All rights reserved.