环境vs2022。
Qt5.12.11
首先使用VS创建一个Qt UI项目。
然后增加MFC的头文件,这个头文件的内容可以是其他MFC项目的拷贝。
#pragma once
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // 从 Windows 头中排除极少使用的资料
#endif
#include <SDKDDKVer.h>
#include <stdio.h>
#include <tchar.h>
#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 部分 CString 构造函数将是显式的
#define _AFX_NO_MFC_CONTROLS_IN_DIALOGS // 移除对话框中的 MFC 控件支持
#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN // 从 Windows 头文件中排除极少使用的内容
#endif
#include <afx.h>
#include <afxwin.h> // MFC 核心组件和标准组件
#include <afxext.h> // MFC 扩展
#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h> // MFC 对 Internet Explorer 4 公共控件的支持
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC 对 Windows 公共控件的支持
#endif // _AFX_NO_AFXCMN_SUPPORT
#include <iostream>
//#include <afxcontrolbars.h> // MFC 支持功能区和控制条
然后新建一个pch.h的头文件引用这个头文件
下一步初始化mfc库,在Qt项目的main文件中操作,注意别忘了引用头文件。
#include "MyQtDemo.h"
#include <QtWidgets/QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
HMODULE hModule = ::GetModuleHandle(nullptr);
AfxWinInit(hModule, nullptr, ::GetCommandLine(), 0);
MyQtDemo w;
w.show();
return a.exec();
}
然后配置vs的编译选项
这个在项目的属性-高级里面可以看到。
创建MFC窗口资源文件,同样是右键项目-添加-资源-Dialog-新建
这个时候就会出现rc资源管理文件,你点开,里面会有一个窗口资源,为这个窗口资源新建一个类,继承CDialogEx。
#pragma once
#include "afxdialogex.h"
// CDlg 对话框
class CDlg : public CDialogEx
{
DECLARE_DYNAMIC(CDlg)
public:
CDlg(CWnd* pParent = nullptr); // 标准构造函数
CDlg(QWidget* pParent);
virtual ~CDlg();
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_DIALOG1 };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedButton1();
QWidget* base;
};
我新增了一个构造函数,其他的全是编译器自动生成的。
新建完成之后,就可以使用这个对象创建一个mfc窗口并显示。
在构造函数中使用
#include "MyQtDemo.h"
#include<qmessagebox.h>
#include"CDlg.h"
#include"resource.h"
MyQtDemo::MyQtDemo(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MyQtDemoClass())
{
ui->setupUi(this);
CDlg* dlg = new CDlg(this);
dlg->DoModal();
}
窗口正常显示,如果断言失败,请检查,main函数初始化mfc库是否成功,如果为0,那么是失败的。对于窗口的消息映射就在mfc创建的类对象中进行处理
// CDlg.cpp: 实现文件
//
#include "pch.h"
#include "MyQtDemo.h"
#include "afxdialogex.h"
#include "CDlg.h"
#include<qmessagebox.h>
// CDlg 对话框
IMPLEMENT_DYNAMIC(CDlg, CDialogEx)
CDlg::CDlg(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_DIALOG1, pParent)
{
base = nullptr;
}
CDlg::CDlg(QWidget* pParent) : CDlg()
{
base = pParent;
}
CDlg::~CDlg()
{
}
void CDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CDlg, CDialogEx)
ON_BN_CLICKED(IDC_BUTTON1, &CDlg::OnBnClickedButton1)
END_MESSAGE_MAP()
// CDlg 消息处理程序
void CDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
QMessageBox::information(base, "tip", u8"我的MFC程序消息处理窗口");
}
注意在使用AFX系列函数,和其他成员函数如MessageBox,如果发生断言失败,那么表示资源无效,需要提前处理。
如果你遇到问题,可以在下方留言