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

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