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

MFC中使用SOUI的窗口示例相关推荐

  1. MFC中主副屏窗口全屏最大化的几种方法

    MFC中主副屏窗口全屏最大化的几种方法 1.根据鼠标位置判断全屏位置 枚举所有窗口 CArray<MONITORINFO, MONITORINFO&> g_arrMonitorIn ...

  2. MFC中的控件是怎么实现的呢?一个按钮就是一个窗口?还是所有按钮画在一个分层窗口上再叠

    请教一下MFC中的控件是怎么实现的呢(通过调用什么样的API,传递什么参数)?一个按钮就是一个窗口?还是所有按钮画在一个分层窗口上再叠在主窗口上?还是直接在主窗口上画图? 我想到的是: JavaScr ...

  3. MFC中,如何获得对话框控件相对于父窗口(对话框窗口)的位置

    在MFC中,如何获得对话框控件相对于父窗口(对话框窗口)的位置: CRect  r; pWnd->GetWindowRect(&r); 这样获得的r是控件相对于屏幕的坐标,然后用Scre ...

  4. 黑马程序员mfc中分割窗口---ctreeview未定义基类的解决方法

    在跟班黑马程序学mfc中分割窗口,vs2019出现了以下的错误.解决方法很简单. 首先我们点击错误,自动定位到出错的类,会发现出错的是CSelcetView的头文件和源文件出错, 我们找到头文件中 在 ...

  5. MFC中关闭窗口的几种方法

    MFC中关闭窗口的几种办法: 退出程序用AfxGetMainWnd()->SendMessage(WM_CLOSE); 关闭当前窗口用DestroyWindow( ); 关闭模式对话框用EndD ...

  6. MFC PreTranslateMessage(MSG* pMsg)中调用DoModal()模态窗口问题

    在PreTranslateMessage(MSG* pMsg)中调用DoModal()模态窗口如下: 1 BOOL CMainDlg::PreTranslateMessage(MSG* pMsg)   ...

  7. MFC中快速应用OpenCV(转)

    转载链接:http://wiki.opencv.org.cn/index.php/MFC%E4%B8%AD%E5%BF%AB%E9%80%9F%E5%BA%94%E7%94%A8OpenCV 简介和缘 ...

  8. MFC中的GDI绘图

    MFC中的GDI绘图 目录(?)[+] 什么是GDI 什么是DC MFC中与GDI有关的类 获取设备环境 设置坐标映射 创建绘图工具并选入DC 调用DC绘图函数绘图 三坐标映射实例 一.关于GDI的基 ...

  9. MFC中CPropertySheet与CTabCtrl的使用

    转载地址:http://blog.chinaunix.net/uid-16444831-id-65792.html MFC中CPropertySheet与CTabCtrl的使用 2011-01-03 ...

  10. MFC中Create()函数的用法

    Create是一个可从CFrameWnd继承而来的成员函数,用于窗口的创建和设置. Create是MFC中的一个构造函数,用于生成在屏幕上可见的窗口. 示例如下: Create(NULL,_T(&qu ...

最新文章

  1. idea 中使用@Autowired注入mybatis Mapper接口时报错
  2. 微型计算机的三级存储体系是,简述存储系统的三级存储体系及分级的目的。
  3. java 将一个非空文件夹拷贝到另一个地方
  4. Linux 命令之 compress -- unix 档案压缩命令
  5. display:flex
  6. django--通过model拿到字段对象
  7. Ionic4 Camera插件在iOS13上选取视频失败 上传时候提示权限不足
  8. highcharts.js两种数据绑定方式和异步加载数据的使用
  9. Linux上vi(vim)编辑器使用教程
  10. QQ安装目录下各文件用途不完全揭密(转)
  11. 优化1——数据库优化面试题
  12. python标准库6张思维导图学明白
  13. Learn OpenGL 笔记6.2 Gamma Correction(伽马校正)
  14. 关于BASE编码 16 32 36 58 64 58 91
  15. 当今主流软件产品家族及其开发语言
  16. CV战神常用代码-----kj15
  17. 教你制作QQ空间超高连通率背景音乐链接。
  18. 源表搭建光电器件LIV特性测试实验平台
  19. 前端算法及手写算法JavaScript
  20. 66页三级医院智慧医院 信息化建设规划

热门文章

  1. vs2010 破解版,试用版变正式版
  2. GAN 模式崩溃的理论解释
  3. 森林防火监控系统解决方案
  4. 12v电量显示制作方法_12V电池电量指示电路
  5. 热血江湖单机版不显示服务器,热血江湖单机版
  6. [Linux] IOmeter 安装
  7. 使用PGP加密软件实现电子邮件的安全传输
  8. Blender的简单技巧——阵列、旋转、数组和曲线
  9. mysql数据库链接_连接MySQL数据库
  10. 银行登录页面html代码,银行管理系统(带界面)