Qt程序中调用MFC动态库

一、 Qt库调用MFC模块对话框
  1. QT调用模态对话框属于资源类,需要在导出函数中开头增加 AFX_MANAGE_STATE(AfxGetStaticModuleState());
  2. 对于从MFC EXE文件中转过来的Dll,需要注意的是app类中的初始化函数调用模态对话框的相关代码注释掉,并返回TRUE
  1. 使用向导添加一个MFC的动态库,如取名为MFCLibrary1
  2. 添加一个对话框资源,并在对话框设计界面添加一个MFC界面类如CTestDialog
class CTestDialog : public CDialogEx
{
	DECLARE_DYNAMIC(CTestDialog)

public:
	CTestDialog(CWnd* pParent = nullptr);   // 标准构造函数
	virtual ~CTestDialog();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_DIALOG1 };
#endif

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

	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedOk();
};
  1. 添加导出类(在工程项目中添加对应的导出宏定义 TEST_EX)
//
#pragma once
#ifdef TEST_EX
#define TEST_SDK __declspec(dllexport)
#else
#define TEST_SDK __declspec(dllimport)
#endif
class TEST_SDK TestExport
{
public:
	void showDialog()
    {
        //下面这句号一定加,否则QT调用会报(afxwin1.inl 第21行的错误)
        AFX_MANAGE_STATE(AfxGetStaticModuleState());
        //启动模态对话框;
        CTestDialog dlg;
        dialog.DoModal();
    }
};


  1. 在Qt中调用

与普通的正常程序调用没有任何区别

QObject::connect(ui.pushButton, &QPushButton::clicked, []()
	{
		TestExport test;
		test.showDialog();

	});
  1. 成果展示

image.png

二、Qt库嵌入MFC对话框控件
  1. MFCLibrary1动态库相关功能基本类似
  2. 给TestExport类增加一个获取对话框窗口句柄的方法
CTestDialog* dialog = new CTestDialog();

void* TestExport::getDialogHandle()
{
	AFX_MANAGE_STATE(AfxGetStaticModuleState());

    //将对话框当成控件用;
	dialog->Create(IDD_DIALOG1);

	dialog->ShowWindow(SW_SHOW);
	dialog->DoModal();
	return dialog->GetSafeHwnd();
}
  1. qt程序接入MFC控件
QObject::connect(ui.pushButton, &QPushButton::clicked, [=]()
	{
		TestExport test;
		void* handle = test.getDialogHandle();

		if(handle)
		{
			auto m_window = QWindow::fromWinId((WId)handle);


			m_window->setFlags(m_window->flags() | Qt::CustomizeWindowHint | Qt::WindowTitleHint);

			auto mWidget = QWidget::createWindowContainer(m_window);
			this->setCentralWidget(mWidget);
        }
	});
  1. 成果展示

image.png

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

揽月凡尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值