duilib将xml和图片合并到exe资源中或者dll中

直接上demo的编写步骤了。

1.创建一个win32的空的工程用作demo工程。从其他工程复制stdafx.h、stdafx.cpp、testmain.cpp、mainwnd.h、mainwnd.cpp文件过来使用。我是从TestAlphaWindow工程中复制过来的。

2.添加现有文件,改写代码等,使之正常编译通过。具体的改写就略过了。主要是删除无用的代码。预编译头等工程设置自己也设置好。

3.这里我们是要将xml和图片等从exe的资源中加载,duilib已经考虑并提供了相关的接口。

1)在WinMain函数中设置duilib的资源路径。

CPaintManagerUI::SetInstance(hInstance);
CPaintManagerUI::SetResourceDll(hInstance);

SetResourceDll就是设置资源的dll的,意思是资源也可以放到其他dll中。这里我们是将资源放到了exe中,所以直接就设置当前的实例句柄即可,当然了,也可以省略,因为默认就是使用当前exe的实例句柄。最好还是显式的写出来。

2)添加xml到资源文件中。首先看到资源文件那里是空的,也没有resource.h等,我们先右键资源文件-添加-资源-Version双击。现在有resource.h了。也有了rc文件。此时在源代码目录下新建一个文件夹叫res。将事先准备好的xml和图片放进去。右键VS里面的资源文件,然后选择添加-资源-导入-选择图片导入。然后再次右键VS里面的资源文件,然后选择添加-现有项-选择xml添加进去。

3)图片和xml都添加进去之后,双击打开resource.h会发现,图片有对应的资源ID,然而xml却没有,不要紧,我们自己添加。右键VS资源文件下面的PackagingResToExeDemo.rc,然后查看代码,复制

/
//
// PNG
//

IDB_PNG1                PNG                     "res\\close.png"
IDB_PNG2                PNG                     "res\\min.png"
#endif    // 中文(中华人民共和国) resources
/
这里代码到它下面,然后改写。最终为(注意删掉了PNG下面的)#endif    // 中文(中华人民共和国) resources
/
//
// PNG
//

IDB_PNG1                PNG                     "res\\close.png"
IDB_PNG2                PNG                     "res\\min.png"

/

/
//
// XML
//

IDF_XML1                 XML                     "res\\MainWnd.xml"
#endif    // 中文(中华人民共和国) resources
/
然后在双击打开resource.h,给这个xml的标识IDF_XML1分配一个资源ID,比如
#define IDF_XML1						500
在stdafx.h中添加  #include "resource.h",这样添加工作就完成了。

4)在OnCreate函数中,builder.Create接口采用CControlUI* Create(STRINGorID xml, LPCTSTR type = NULL, IDialogBuilderCallback* pCallback = NULL, CPaintManagerUI* pManager = NULL, CControlUI* pParent = NULL);这个接口即可。代码如下

LRESULT CMainWnd::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
	LONG styleValue = ::GetWindowLong(*this, GWL_STYLE);
	styleValue &= ~WS_CAPTION;	//取消标题框
	styleValue &= ~WS_SIZEBOX;	//取消自动调整边框的风格,可以放置贴边自动最大化
	::SetWindowLong(*this, GWL_STYLE, styleValue | WS_CLIPSIBLINGS | WS_CLIPCHILDREN);

	m_PM.Init(m_hWnd);
	CDialogBuilder builder; 
	CControlUI* pRoot = builder.Create(IDF_XML1, _T("xml"),  this, &m_PM);
	ASSERT(pRoot && "Failed to parse XML");
	m_PM.AttachDialog(pRoot);
	m_PM.AddNotifier(this);

	return 0;
}
5)在xml中使用图片资源。首先查看PackagingResToExeDemo.rc的代码,发现close图片用的是IDB_PNG1,min用的IDB_PNG2;在双击打开resource.h查看IDB_PNG1对应的ID值是102,IDB_PNG2对应值是103。双击Mainwnd.xml在vs中打开(其他编辑器打开也行).写法如下
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<Window size="800,600" caption="0,0,0,45">
  <Font shared="true" id="0" name="微软雅黑" size="14" default="true"/>
  <VerticalLayout bordersize="1" bordercolor="#FF4B4B4B" inset="1,0,1,1" bkcolor="#FFFFFFFF">     
	<HorizontalLayout height="45" bkcolor="#FF507ED3">
      <Control />
      <Button name="minBtn" tooltip="最小化" normalimage="res='103' restype='png' source='0,0,18,18'" hotimage="res='103' restype='png' source='18,0,36,18'" width="18" padding="40,13,0,14"/>     
      <Button name="closeBtn" tooltip="关闭" normalimage="res='102' restype='png' source='0,0,18,18'" hotimage="res='102' restype='png' source='18,0,36,18'" width="18" padding="10,13,10,14"/>
    </HorizontalLayout>
  </VerticalLayout>
</Window>
不再写file='xxxx.png'了而是写res='103' restype='png'代替。

至此,已经全部结束,编译运行看结果吧。这样就是exe和dll就行了。资源文件就不用带了。有的朋友连duilib_u.dll也不想带,也简单,使用静态库即可。

静态库的使用也简单,在工程-C++-预处理器里面加上UILIB_STATIC,然后改写下stdafx.h中链接的duilib.lib为静态库的lib即可。不做细说了。具体可以去我的github代码仓库中看。我会把这个demo代码提交上去。地址:https://github.com/juhuaguai/duilib

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
您可以使用duilib库来在C++的DLL程序使用XML设计的UI界面。duilib是一个开源的UI库,提供了丰富的控件和工具,支持使用XML来设计UI界面。您可以使用duilib的页面设计器工具来设计您的UI界面,并将其保存为XML格式,然后在您的DLL程序使用duilib的UI模块来加载和显示这个XML文件。在使用duilib的UI模块时,您需要连接到duilib的核心库和UI库,以便在您的程序使用duilib的UI组件。 以下是使用duilib的基本步骤: 1. 下载duilib库,并解压到您的项目目录。 2. 在您的C++项目添加duilib的头文件和库文件。 3. 在您的代码调用duilib的初始化函数和反初始化函数。 4. 使用duilib的页面设计器工具来设计您的UI界面,并将其保存为XML格式。 5. 在您的代码使用duilib的UI模块来加载和显示这个XML文件。 下面是一个简单的示例代码,展示了如何使用duilib来加载和显示XML界面: ```c++ #include <Windows.h> #include "Duilib/UIlib.h" using namespace DuiLib; int APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: // 初始化duilib ::CoInitialize(NULL); CPaintManagerUI::SetInstance(hModule); break; case DLL_PROCESS_DETACH: // 反初始化duilib CPaintManagerUI::Term(); ::CoUninitialize(); break; } return TRUE; } // 显示XML界面 void ShowXmlUI(HWND hWndParent) { // 创建duilib窗口,并加载XML文件 CPaintManagerUI paint_manager; CDialogBuilder builder; CControlUI* pRoot = builder.Create(_T("myui.xml"), NULL, NULL, &paint_manager); if (pRoot == NULL) return; // 设置duilib窗口的父窗口为hWndParent,并显示窗口 HWND hWnd = paint_manager.Create(hWndParent, _T("duilib window")); paint_manager.AttachDialog(pRoot); paint_manager.ShowWindow(true); } ``` 在上面的示例代码,`DllMain`函数用于初始化和反初始化duilib,`ShowXmlUI`函数用于创建duilib窗口,并加载并显示XML界面。您可以将上面的代码集成到您的DLL程序,以便在需要时显示XML界面。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值