duilib加载xml以及资源文件的路径问题
一.问题描述Duilib一般通过加载写好的xml文件显示界面,xml中包含了各种资源图片以及显示属性等,最近使用时遇见两个问题,第一个就是没有设置duilib的主程序句柄,导致加载xml文件时找不到相对路径。第二个问题就是在一个程序中多个界面的xml只能放在同一个文件夹,不能一个xml一个文件夹这种方式二.解决方法问题1解决方法在创建duilib窗口之前,设置主程序句柄,如下代码,在注释1,2,3
一.问题描述
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文件放在一个目录下,比较方便维护,更整洁,更人性化,因此还是遵照这种方式。
更多推荐
所有评论(0)