1、xml仅内嵌xml,不能关联内嵌xml对应的源文件
法1:
<Include source="DlgFiveRange.xml">
法2:
step1:重写CreateControl接口
virtual CControlUI* CreateControl(LPCTSTR pstrClass);
CControlUI * CDlgTradeCommon::CreateControl(LPCTSTR pstrClass)
{
if (_tcsicmp(pstrClass, _T("DlgFiveRange")) == 0)
{
CDialogBuilder builder;
CControlUI* pUI = builder.Create(_T("DlgFiveRange.xml"));
return pUI;
}
return nullptr;
}
step2:在xml中内嵌子xml
<HorizontalLayout name="HLayoutFiveRange" pos="270,80,500,450" width="255" height="360" bkcolor="#FFFF0000">
<DlgFiveRange width="255" height="360"/>
</HorizontalLayout>
2、自己创建内嵌子xml关联的源文件对应的对话框,然后嵌入进来,位置信息等到收到DUI_MSGTYPE_WINDOWINIT消息后再进行布局(一般是WM_PAINT之后发送的该消息,之后才能获取相应的位置信息)
CHorizontalLayoutUI *m_pHLayoutFiveRange = nullptr;
CDlgFiveRange* m_pFiveRange = nullptr;
InitWindow中初始化:
m_pHLayoutFiveRange = static_cast<CHorizontalLayoutUI*>(m_pm.FindControl(_T("HLayoutFiveRange")));
m_pFiveRange = new CDlgFiveRange();
if (nullptr != m_pFiveRange)
{
m_pFiveRange->Create(NULL, _T("DlgFiveRange"), UI_WNDSTYLE_DIALOG, WS_EX_WINDOWEDGE | WS_EX_TOOLWINDOW);
SetParent(m_pFiveRange->GetHWND(), m_hWnd);
}
DUI_ON_MSGTYPE(DUI_MSGTYPE_WINDOWINIT, OnWindowInit)
OnWindowInit中进行布局:
CRect rcFiveRange = m_pHLayoutFiveRange->GetClientPos();
if (rcFiveRange.IsRectEmpty())
{
return TRUE;
}
::SetWindowPos(m_pFiveRange->GetHWND(), NULL, rcFiveRange.left, rcFiveRange.top, rcFiveRange.Width(), rcFiveRange.Height(), SWP_SHOWWINDOW);
参考:duilib初始化无法获取控件位置(所有位置都为0)_lixiang987654321的专栏-CSDN博客
Duilib XML嵌套/自定义控件 - _KikyoBK - 博客园
Duilib的xml嵌套使用_k2322138648的博客-CSDN博客
本文介绍了如何在Duilib中通过两种方法实现内嵌XML控件与源文件关联:一是重写CreateControl接口动态创建;二是预先创建子对话框并根据窗口初始化消息调整布局。详细步骤包括修改XML结构和在窗口初始化时设置控件位置。

2465

被折叠的 条评论
为什么被折叠?



