Qt プログラムで MFC 動的ライブラリを呼び出す

1. Qt ライブラリが MFC モジュール ダイアログ ボックスを呼び出します。

  1. QT によって呼び出されるモーダル ダイアログ ボックスはリソース クラスに属し、エクスポート関数の先頭に追加する必要があります。AFX_MANAGE_STATE(AfxGetStaticModuleState());
  2. MFC EXE ファイルから転送された Dll の場合、アプリ クラスの初期化関数がモーダル ダイアログ ボックスの関連コードを呼び出し、TRUE を返すことに注意してください。
  1. ウィザードを使用して、MFCLibrary1 などの MFC ダイナミック ライブラリを追加します。
  2. ダイアログ リソースを追加し、ダイアログ デザイン インターフェイスに CTestDialog などの MFC インターフェイス クラスを追加します。
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. 実績

画像.png

2、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. 実績

画像.png

おすすめ

転載: blog.csdn.net/qq_33377547/article/details/125597346