VS2019 创建的默认MFC 对话框程序c错误

为什么我用VS2019 创建的默认MFC 对话框程序,给控件添加变量会出现“找不到具有指定的对话框类?”

1、类视图是空的

img

2.双击Button 控件不是添加响应函数

img

3.为button添加变量出现找不到

img

都是默认创建的对话框程序!

你先用classwizard创建一下对话框类看看

你可能改了对话框的ID
原因是,VS在修改了对话框ID后,会同步修改到Resource.h和 .cpp文件,但是在.h的类声明中,还是原来的ID,导致该错误。
解决:

1.检查.cpp文件中类构造函数中,绑定的ID是否正确
2.检查.h文件中对话框数据部分,对话框ID属性,修改为当前的ID,而不是默认的IDD_DIALOG1这种

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/367532
  • 这篇博客你也可以参考下:mfc 界面中使用控件(button)
  • 除此之外, 这篇博客: 自学MFC(三):Button控件中的 单击响应 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 创建一个基于对话框的MFC工程,在对话框中放置一个静态文本控件Static Text,一个按钮控件Button,通过属性窗口修改默认显示的名称和文本,如图:在这里插入图片描述
    现在我们可以通过通过消息机制实现单击改变字体大小的操作。
    MFC提供了一种便捷实现消息映射的操作方法,在界面设计窗口,双击按钮,此时自动完成了一个完整的消息映射就完成了,我们只需要在消息响应函数中实现我们想要完成的操作就可以了。

    void CMFCDemoDlg::OnBnClickedButton1() {
    	// TODO: 在此添加控件通知处理程序代码
    	static int size = 50;
    	if (size <= 500) {
    		size += 50;
    		// 修改控件ID为IDC_STATIC1的字体(此函数在上一篇已给出)
    		changeFont(IDC_STATIC1, L"黑体", size);
    	}
    	else size = 50;
    }
    

    运行程序,可以看到每单击一次按钮,字体就会变大,代表消息响应成功。

该回答引用ChatGPT
问题分析:
根据问题描述,可以看出是在使用VS2019创建默认MFC对话框程序时,出现了添加控件变量时找不到对话框类的错误。具体表现为类视图为空,双击控件无法添加响应函数,添加控件变量时出现错误提示。
可能原因:
1.项目配置错误:可能是项目配置不正确导致的,例如没有正确添加MFC库等。
2.文件损坏:可能是某些文件损坏导致的,例如资源文件、头文件等。
3.编译器问题:可能是编译器本身的问题,例如VS2019版本不兼容等。
解决方案:
1.检查项目配置:在项目属性中检查是否正确添加了MFC库,是否选择了正确的字符集等。
2.重新创建项目:如果文件损坏导致的问题比较严重,可以尝试重新创建一个新的MFC对话框程序项目。
3.升级或降级VS版本:如果是编译器本身的问题,可以尝试升级或降级VS版本,或者安装补丁程序。
代码作答:
由于问题描述中没有提供具体的代码,无法进行代码作答。但是,可以提供一些常见的解决方案代码示例供参考:
1.检查项目配置:
在项目属性中,选择“配置属性”->“常规”,确保“使用MFC”选项已经勾选,并且选择了正确的字符集。
2.重新创建项目:
可以在VS2019中选择“文件”->“新建”->“项目”,然后选择“MFC应用程序向导”,按照向导提示创建一个新的MFC对话框程序项目。
3.升级或降级VS版本:
如果是编译器本身的问题,可以尝试升级或降级VS版本,或者安装补丁程序。例如,可以在VS2019中选择“帮助”->“检查更新”,检查是否有可用的更新程序。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
这个问题可能是由于控件ID对应的资源没有被正确导入或者命名空间不一致导致的。可以尝试以下几个步骤:

  1. 检查资源文件是否已正确导入。在Solution Explorer中找到资源文件,单击右键并选择“属性”。在属性窗口中检查资源ID是否正确,并确认资源文件已被正确地导入到项目中。

  2. 检查命名空间是否一致。打开您的对话框头文件,找到类定义,确保它与rc文件中的类名称匹配。

  3. 如果在资源文件中添加了新的控件,可能需要将其ID添加到对话框头文件中。打开对话框头文件,找到控件的声明,确保它们与资源文件中的ID匹配。

以下是一个默认的MFC对话框程序中的代码示例,其中包括添加控件和响应函数的步骤:

// MyDlg.h

#pragma once

class CMyDlg : public CDialogEx
{
public:
    CMyDlg(CWnd* pParent = nullptr);    // standard constructor

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

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

// Implementation
protected:
    HICON m_hIcon;

    // Generated message map functions
    virtual BOOL OnInitDialog();
    afx_msg void OnPaint();
    afx_msg HCURSOR OnQueryDragIcon();
    DECLARE_MESSAGE_MAP()

private:
    // Add member variable for new control
    CString m_strEdit;
public:
    afx_msg void OnBnClickedButton();
    // Add handler for new control
    afx_msg void OnEnChangeEdit();
    CEdit m_EditCtrl; // Add control variable for new control
};

// MyDlg.cpp

#include "pch.h"已黑化的小白 #include "My.h"已黑化的小白 #include "MyDlg.h"已黑化的小白 #include "afxdialogex.h"已黑化的小白 
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

// CMyDlg dialog

CMyDlg::CMyDlg(CWnd* pParent /*=nullptr*/)
    : CDialogEx(IDD_MY_DIALOG, pParent)
    , m_strEdit(_T(""))
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CMyDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
    // Add DDX line for new control
    DDX_Text(pDX, IDC_EDIT1, m_strEdit);
    // Add DDX line for existing control
    DDX_Control(pDX, IDC_EDIT1, m_EditCtrl);
}

BEGIN_MESSAGE_MAP(CMyDlg, CDialogEx)
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    // Add message handler for new control
    ON_EN_CHANGE(IDC_EDIT1, &CMyDlg::OnEnChangeEdit)
    // Add message handler for existing control
    ON_BN_CLICKED(IDC_BUTTON1, &CMyDlg::OnBnClickedButton)
END_MESSAGE_MAP()

// CMyDlg message handlers

BOOL CMyDlg::OnInitDialog()
{
    CDialogEx::OnInitDialog();

    // Set the icon for this dialog.  The framework does this automatically
    //  when the application's main window is not a dialog
    SetIcon(m_hIcon, TRUE);         // Set big icon
    SetIcon(m_hIcon, FALSE);        // Set small icon

    // TODO: Add extra initialization here

    return TRUE;  // return TRUE  unless you set the focus to a control
}

void CMyDlg::OnPaint()
{
    if (IsIconic())
    {
        CPaintDC dc(this); // device context for painting

        SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

        // Center icon in client rectangle
        int cxIcon = GetSystemMetrics(SM_CXICON);
        int cyIcon = GetSystemMetrics(SM_CYICON);
        CRect rect;
        GetClientRect(&rect);
        int x = (rect.Width() - cxIcon + 1) / 2;
        int y = (rect.Height() - cyIcon + 1) / 2;

        // Draw the icon
        dc.DrawIcon(x, y, m_hIcon);
    }
    else
    {
        CDialogEx::OnPaint();
    }
}

HCURSOR CMyDlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}

// Add handler for new control
void CMyDlg::OnEnChangeEdit()
{
    UpdateData(TRUE); // Get the value of the edit control and update member variable
}

// Add handler for existing control
void CMyDlg::OnBnClickedButton()
{
    m_EditCtrl.SetWindowText(_T("Button clicked")); // Change the caption of the edit control
}

希望这些步骤和代码片段能够帮助您解决问题。
如果我的回答解决了您的问题,请采纳!