MFC中使用SOUI的窗口示例

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章