duilib加载xml以及资源文件的路径问题

一.问题描述

Duilib一般通过加载写好的xml文件显示界面,xml中包含了各种资源图片以及显示属性等,最近使用时遇见两个问题,第一个就是没有设置duilib的主程序句柄,导致加载xml文件时找不到相对路径。第二个问题就是在一个程序中多个界面的xml只能放在同一个文件夹,不能一个xml一个文件夹这种方式

二.解决方法

 

问题1解决方法

在创建duilib窗口之前,设置主程序句柄,如下代码,在注释1,2,3中分别表示了主程序句柄的设置过程,这一步是必要的,因为代码中继承自duilib的通用窗口类WindowImplBase的GetSkinFolder函数指定的路径是相对于此处主程序模块的所在路径。

其实这里也可以不设置主程序路径,而在GetSkinFolder函数下指定xml文件的绝对路径即可。

但是还是第一种设置主程序句柄的方式比较方便。

bool CXCalculatorUI::CalcCreatDlg(int x, int y, int width, int height, HWND hwnd)
{
	//获取主程序句柄(代表主程序内存的基地址,hwnd表示的是一个窗口的句柄,即一个窗口资源的基地址),并在后续初始化使用,否则会出现找不到资源文件,导致断言失败
	HINSTANCE hInstance = GetModuleHandle(NULL);   //1 获取主程序句柄
	CPaintManagerUI::SetInstance(hInstance);       //2 在duilib中设置主程序句柄
	
	CWndShadow::Initialize(hInstance);             //3 初始化操作
	if (pCalcDlg != NULL)
	{
		::ShowWindow(*pCalcDlg, SW_SHOW);
		return true;
	}

	pCalcDlg = new CMainFrame();
	if (pCalcDlg == NULL)
		return false;


	DWORD dwStyle = UI_WNDSTYLE_FRAME;
	dwStyle = dwStyle^WS_MAXIMIZEBOX;

#if defined(WIN32) && !defined(UNDER_CE)
	pCalcDlg->Create(hwnd, _T("Calc计算"), UI_WNDSTYLE_CHILD, WS_EX_STATICEDGE | WS_EX_APPWINDOW, x, y, 0, 0);
#else
	pDialog->Create(NULL, _T("PIN库计算"), dwStyle | WS_POPUP, NULL, 0, 0, 0, 0);
#endif

	return true;
}

问题2解决方法

假如一个程序包含多个duilib显示界面,每一个界面对应一个xml文件,此时多个xml文件应该共同放在一个目录之下,比如skin目录,而且xml文件必须放在当前skin目录,其他一些资源文件(图片,视频等)可以在skin目录下新建子目录存放。

为什么这样呢,通过调试代码发现,在duilib加载第一个xml并且创建显示界面的时,会读取该xml文件的所在目录,并以此目录为默认目录,在下次加载第二个xml文件并且创建时并不会重新刷新这个目录,而是在这个目录下继续查找第二个xml文件,如果此时单独指定第二个xml文件的路径并不会生效,而是以第一个加载的xml文件的坐在目录为准,所以,每个界面的xml文件必须保持在一个文件夹下。

这种方式也可以更改,修改一下duilib的源代码即可,但是感觉没必要,所有的xml文件放在一个目录下,比较方便维护,更整洁,更人性化,因此还是遵照这种方式。

©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页