1. Qt ライブラリが MFC モジュール ダイアログ ボックスを呼び出します。
- QT によって呼び出されるモーダル ダイアログ ボックスはリソース クラスに属し、エクスポート関数の先頭に追加する必要があります。
AFX_MANAGE_STATE(AfxGetStaticModuleState());
- MFC EXE ファイルから転送された Dll の場合、アプリ クラスの初期化関数がモーダル ダイアログ ボックスの関連コードを呼び出し、TRUE を返すことに注意してください。
- ウィザードを使用して、MFCLibrary1 などの MFC ダイナミック ライブラリを追加します。
- ダイアログ リソースを追加し、ダイアログ デザイン インターフェイスに 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();
};
- エクスポート クラスを追加します (対応するエクスポート マクロ定義 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();
}
};
- Qtで呼び出す
通常の通常の手続き呼び出しと何の違いもありません
QObject::connect(ui.pushButton, &QPushButton::clicked, []()
{
TestExport test;
test.showDialog();
});
- 実績
2、Qt ライブラリ組み込み MFC ダイアログ コントロール
- MFCLibrary1 動的ライブラリ関連の関数は基本的に似ています
- ダイアログ ウィンドウ ハンドルを取得するメソッドを 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();
}
- 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);
}
});
- 実績