文章demo參照 https://github.com/soui-demo/mfc.demo
分析步驟:
Step1 創建一個純的SOUI的項目 代碼由嚮導生成
Step2 創建一個純MFC的項目 代碼由嚮導生成
Step3 分析對比Step1和Step2
在MFC的 BOOL CxxxApp::InitInstance() 這個相當於 SOUI中的 main 這裏將兩者合二爲一
需要添加的資源,包括SOUI的資源:包含的dll文件,頭文件 以及一些初始化設置;下面列出需要增加的內容
完整的SOUI項目初始化過程包含:
將一個MFC工程 包含加入SOUI的窗口來實現一些簡單的功能
Step1 在工程設置中,包含SOUI需要用到的一些庫和文件
配置屬性-》C/C++ -》常規 -》附加包含目錄
$(SOUIPATH)\utilities\include
$(SOUIPATH)\soui\include
$(SOUIPATH)\components
$(SOUIPATH)\config
配置屬性-》C/C++ -》預處理器 -》預處理器定義
_CRT_SECURE_NO_WARNINGS
配置屬性-》鏈接器 -》常規 -》附加庫目錄
$(SOUIPATH)\bin
配置屬性-》鏈接器 -》輸入 -》附加依賴庫
utilitiesd.lib
souid.lib
補充:上面是debug的設置,如果爲release需要對應設置
Step2 修改 BOOL CxxxApp::InitInstance() 函數中的相關文件
在對應的工程名.cpp文件中加入下面的內容(這個文件也就是包含 BOOL CxxxApp::InitInstance() 這個函數的cpp文件)
加入頭文件 #include "com-cfg.h"
引入資源文件:
#ifdef _DEBUG
#define SYS_NAMED_RESOURCE _T("soui-sys-resourced.dll")
#else
#define SYS_NAMED_RESOURCE _T("soui-sys-resource.dll")
#endif
在BOOL CxxxApp::InitInstance()函數中加入下面的內容(初始化SOUI資源的一些代碼,在SOUI工程中int APIENTRY _tWinMain 函數中就可以找到)
SComMgr* pComMgr = new SComMgr;
{//這一個括號很重要,保證裏面聲明的局部對象在CoUninitialize()之前釋放
CAutoRefPtr<IImgDecoderFactory> pImgDecoderFactory;
CAutoRefPtr<IRenderFactory> pRenderFactory;
pComMgr->CreateImgDecoder((IObjRef * *)& pImgDecoderFactory);
pComMgr->CreateRender_GDI((IObjRef * *)& pRenderFactory);
pRenderFactory->SetImgDecoderFactory(pImgDecoderFactory);
SApplication* pSouiApp = new SApplication(pRenderFactory, theApp.m_hInstance);
//加載系統資源
HMODULE hSysResource = LoadLibrary(SYS_NAMED_RESOURCE);
if (hSysResource)
{
CAutoRefPtr<IResProvider> sysSesProvider;
CreateResProvider(RES_PE, (IObjRef * *)& sysSesProvider);
sysSesProvider->Init((WPARAM)hSysResource, 0);
pSouiApp->LoadSystemNamedResource(sysSesProvider);
}
CAutoRefPtr<IResProvider> pResProvider;
CreateResProvider(RES_PE, (IObjRef * *)& pResProvider);
pResProvider->Init((WPARAM)theApp.m_hInstance, 0);
pSouiApp->AddResProvider(pResProvider); //從資源加載皮膚
//這裏加載的是MFC的主窗口
CMFCIncludeSOUIDlg dlg;
m_pMainWnd = &dlg;
dlg.DoModal();
delete pSouiApp;
}
delete pComMgr;
CoUninitialize();
還需要修改一個文件,這裏我用的VS2019 對應的文件是 pch.h 低版本的VS對應的是 stdafx.h 文件
包含一些SOUI的配置頭文件
#include <souistd.h>
#include <core/SHostDialog.h>
#include <control/SMessageBox.h>
#include <control/souictrls.h>
#include <control/realwndhandler-i.h>
Step3 在rc文件中包含相應的資源文件 這一步很重要(這一步不處理 將無法加載xml文件)
在xxxx.rc文件中
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE 4, 2
#include "res\xxxx.rc2" // 非 Microsoft Visual C++ 編輯的資源
#include "l.CHS\afxres.rc" // 標準組件
#if !defined(_AFXDLL)
#include "l.CHS\afxribbon.rc" // MFC 功能區和控制條資源
#endif
#endif
包含一個res\xxxx.rc2 這個文件就包含SOUI資源的映射關係
/////////////////////////////////////////////////////////////////////////////
// 在此處添加手動編輯的資源...
#define DEFINE_UIRES(name, type, file_path)\
name type file_path
DEFINE_UIRES(xml_init, uidef, "uires\\xml\\init.xml")
DEFINE_UIRES(TestDlg, TEST, "uires\\xml\\TestDlg.xml")
/////////////////////////////////////////////////////////////////////////////
這裏加上對應的文件關係 從上面可以很容易和idx文件對應起來,也就是資源加載的映射關係
取idx裏面的一部分
<TEST>
<file name="TestDlg" path="xml\TestDlg.xml" />
</TEST>
這樣才能保證可以打開對應的資源;
這樣一個完整的MFC工程中使用SOUI的小例子 就做好了
例子不難,主要是文件的包含以及資源文件的映射關係這個很重要;
效果圖:
最後附上整個工程的地址:https://github.com/JamesWu9527/MFCincludeSOUI