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
MFC中使用SOUI的窗口示例相关推荐
- MFC中主副屏窗口全屏最大化的几种方法
MFC中主副屏窗口全屏最大化的几种方法 1.根据鼠标位置判断全屏位置 枚举所有窗口 CArray<MONITORINFO, MONITORINFO&> g_arrMonitorIn ...
- MFC中的控件是怎么实现的呢?一个按钮就是一个窗口?还是所有按钮画在一个分层窗口上再叠
请教一下MFC中的控件是怎么实现的呢(通过调用什么样的API,传递什么参数)?一个按钮就是一个窗口?还是所有按钮画在一个分层窗口上再叠在主窗口上?还是直接在主窗口上画图? 我想到的是: JavaScr ...
- MFC中,如何获得对话框控件相对于父窗口(对话框窗口)的位置
在MFC中,如何获得对话框控件相对于父窗口(对话框窗口)的位置: CRect r; pWnd->GetWindowRect(&r); 这样获得的r是控件相对于屏幕的坐标,然后用Scre ...
- 黑马程序员mfc中分割窗口---ctreeview未定义基类的解决方法
在跟班黑马程序学mfc中分割窗口,vs2019出现了以下的错误.解决方法很简单. 首先我们点击错误,自动定位到出错的类,会发现出错的是CSelcetView的头文件和源文件出错, 我们找到头文件中 在 ...
- MFC中关闭窗口的几种方法
MFC中关闭窗口的几种办法: 退出程序用AfxGetMainWnd()->SendMessage(WM_CLOSE); 关闭当前窗口用DestroyWindow( ); 关闭模式对话框用EndD ...
- MFC PreTranslateMessage(MSG* pMsg)中调用DoModal()模态窗口问题
在PreTranslateMessage(MSG* pMsg)中调用DoModal()模态窗口如下: 1 BOOL CMainDlg::PreTranslateMessage(MSG* pMsg) ...
- 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 简介和缘 ...
- MFC中的GDI绘图
MFC中的GDI绘图 目录(?)[+] 什么是GDI 什么是DC MFC中与GDI有关的类 获取设备环境 设置坐标映射 创建绘图工具并选入DC 调用DC绘图函数绘图 三坐标映射实例 一.关于GDI的基 ...
- MFC中CPropertySheet与CTabCtrl的使用
转载地址:http://blog.chinaunix.net/uid-16444831-id-65792.html MFC中CPropertySheet与CTabCtrl的使用 2011-01-03 ...
- MFC中Create()函数的用法
Create是一个可从CFrameWnd继承而来的成员函数,用于窗口的创建和设置. Create是MFC中的一个构造函数,用于生成在屏幕上可见的窗口. 示例如下: Create(NULL,_T(&qu ...
最新文章
- idea 中使用@Autowired注入mybatis Mapper接口时报错
- 微型计算机的三级存储体系是,简述存储系统的三级存储体系及分级的目的。
- java 将一个非空文件夹拷贝到另一个地方
- Linux 命令之 compress -- unix 档案压缩命令
- display:flex
- django--通过model拿到字段对象
- Ionic4 Camera插件在iOS13上选取视频失败 上传时候提示权限不足
- highcharts.js两种数据绑定方式和异步加载数据的使用
- Linux上vi(vim)编辑器使用教程
- QQ安装目录下各文件用途不完全揭密(转)
- 优化1——数据库优化面试题
- python标准库6张思维导图学明白
- Learn OpenGL 笔记6.2 Gamma Correction(伽马校正)
- 关于BASE编码 16 32 36 58 64 58 91
- 当今主流软件产品家族及其开发语言
- CV战神常用代码-----kj15
- 教你制作QQ空间超高连通率背景音乐链接。
- 源表搭建光电器件LIV特性测试实验平台
- 前端算法及手写算法JavaScript
- 66页三级医院智慧医院 信息化建设规划