在Qt中使用MFC,例子很简单,多余的废话也不多说

环境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,如果发生断言失败,那么表示资源无效,需要提前处理。

如果你遇到问题,可以在下方留言

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在Qt使用MFC例子可以使用CString、MessageBox等MFC类和方法,具体如下: 1. 字符串操作:Qt没有类似MFC的CString类,但可以使用QString类进行字符串操作。QString类提供了丰富的字符串处理方法,如拼接字符串、查找子字符串、替换字符串等。 例如,使用MFC的CString类进行字符串拼接可以如下所示: CString str1 = "Hello"; CString str2 = "World"; CString result = str1 + " " + str2; 而在Qt,可以使用QString类的arg()函数实现字符串的格式化和拼接: QString str1 = "Hello"; QString str2 = "World"; QString result = QString("%1 %2").arg(str1).arg(str2); 2. 消息框:在MFC,可以使用CMessageBox类弹出对话框进行消息提示。 而在Qt,可以使用QMessageBox类实现类似的功能。QMessageBox类提供了丰富的静态函数用于弹出对话框,如information()、warning()、critical()等。它们分别用于显示不同类型的消息框。 例如,使用MFC的CMessageBox类弹出一个提示消息框可以如下所示: CMessageBox::Information("提示", "欢迎使用MFC"); 而在Qt,可以使用QMessageBox类的information()函数实现类似的效果: QMessageBox::information(nullptr, "提示", "欢迎使用Qt"); 以上是在Qt使用MFC例子使用了QString类代替了MFC的CString类,并使用了QMessageBox类代替了MFC的CMessageBox类,以实现字符串操作和消息框的功能。 ### 回答2: 在Qt使用MFC的类和方法可以通过将MFC的头文件包含到Qt项目来实现。下面是一个使用MFC例子: 首先,在Qt项目的.pro文件添加MFC库的链接,例如: ``` LIBS += -L"path/to/mfc/library" -lmfc140u ``` 然后,在Qt的代码包含MFC的头文件和定义MFC的字符串类型`CString`。例如: ```cpp #include <afxwin.h> #include <afxdlgs.h> typedef CStringA MFCString; // 将CString转换为Qt项目的String类型 void showDialog() { MFCString message = "Hello MFC"; MessageBoxA(NULL, message, "MFC Example", MB_OK); } ``` 在上面的例子,我们使用MFC的`MessageBoxA`方法显示一个消息框,同时使用MFC的`CString`字符串类型。在Qt项目,我们通过将`CString`定义为`CStringA`来使用MFC的字符串类型,并将其转换为Qt项目的字符串类型。 这只是一个简单例子,你可以根据实际需求,使用更多的MFC类和方法,在Qt项目集成MFC的功能。需要注意的是,在使用MFC的类和方法时,可能会存在一些平台相关性的问题,需要根据具体的情况进行调整和处理。 ### 回答3: 在Qt使用MFC例子,可以使用MFC的类和方法,如CString和MessageBox。 例如,我们可以在Qt创建一个按钮,当点击这个按钮时,弹出一个消息框,消息框显示一个使用CString拼接的字符串。 以下是一个使用MFC字符串和消息框的示例代码: ```cpp #include <QtWidgets> class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) { QPushButton *button = new QPushButton("点击我", this); connect(button, &QPushButton::clicked, this, &MainWindow::showMessageBox); } public slots: void showMessageBox() { CString str1 = _T("Hello"); CString str2 = _T("MFC"); CString concatStr; concatStr.Format(_T("%s %s"), str1, str2); QMessageBox::information(this, "消息框标题", (const char*)CT2CA(concatStr)); } }; int main(int argc, char *argv[]) { QApplication app(argc, argv); MainWindow window; window.show(); return app.exec(); } #include "main.moc" ``` 在上面的例子,我们在MainWindow的构造函数创建了一个按钮,并连接了按钮的clicked信号到showMessageBox槽函数。当按钮被点击时,就会触发showMessageBox函数。 showMessageBox函数,我们首先使用CString来创建两个字符串。然后使用CString的Format方法来将这两个字符串拼接成一个新的字符串。最后,我们使用QMessageBox::information方法创建一个消息框,并将拼接后的字符串转换成char*类型的参数传进去,实现字符串的显示。 运行这个例子,当点击按钮时,就会弹出一个消息框,消息框显示"Hello MFC"这个字符串。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值