文章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