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

猜你喜欢

转载自blog.csdn.net/qq_33377547/article/details/125597346