DuiLib入门(代码版)
其实网上的教程大都是XML控制布局的,不过之前看我们浏览器代码时直接使用代码控制,而且本人也比较倾向于用代码直接搞,有什么问题好查,能对DuiLib理解的更深刻些。
工程创建
其实这个和XML
的入门基本一样,只是在处理WM_CREATE
时,略作修改。
示例放上我的OnCreate
函数:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21LRESULT CMainUI::OnCreate(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
m_pm.Init(m_hWnd);
m_pm.SetInitSize(MAIN_UI_WIDTH, MAIN_UI_HEIGHT);
m_pm.AddFont(FONT_SONG_TI_INDEX, FONT_SONG_TI_NAME, 12, false, false, false, false);
m_pm.AddFont(FONT_HEI_TI_INDEX, FONT_HEI_TI_NAME, 14, false, false, false, false);
m_pm.AddFont(FONT_SONG_TI_INDEX_BIG, FONT_SONG_TI_NAME, 14, false, false, false, false);
m_pm.AddFont(FONT_SONG_TI_INDEX_SMALL, FONT_SONG_TI_NAME, 12, false, false, false, false);
RECT rect = MAIN_UI_CAPTION;
m_pm.SetCaptionRect(rect);
m_pm.AttachDialog(m_pMainLayout);
m_pm.AddNotifier(this);
std::thread getCategoryInfoThread(&NetMisc::GetCategoryContent, std::ref(m_strCategoryInfoJson));
getCategoryInfoThread.detach();
return 0;
}
如果不用xml
,我们首先需要在代码把xml
里windows
字段的信息用代码添加。例如:1
<Window size="250,330" caption="0,0,0,0">
我们就需要在代码SetInitSize(250, 330)
,然后再SetCaptionRect({0, 0, 0, 0})
。至于怎么把字段和函数对应上,你自己根据名字猜测也好,去代码里搜索字段名也行。不过要注意到是,有些字段与其名字差不多的函数并不完全一样。比如pos
字段和SetPos
函数的效果就不一样,具体的大家可以慢慢体会。
至于各种控件,我们先声明一个容器m_pMainLayout
,然后把把各种控制初始化好加到这个容器里,最后再m_pm.AttachDialog(m_pMainLayout)
就行了。
这里m_pMainLayout
是个指针,也可以先加载个空容器,然后根据需要慢慢添加控件。
加载控件
使用xml
时我们直接在文本里定义控件的各种样式就好了。但用代码就需要我们去声明各种控件了,比如声明一个Button
就可以下面这么写:1
2
3
4
5
6
7
8
9
10
11
12
13
14void CSearchContainerUI::InitSearchBtn()
{
m_pSearchBtn = new DuiLib::CButtonUI();
m_pSearchBtn->SetName(SEARCH_BTN_NAME);
m_pSearchBtn->SetMyPos(SEARCH_BTN_POS);
m_pSearchBtn->SetNormalImage(SEARCH_BTN_NORMAL_IMAGE);
m_pSearchBtn->SetHotImage(SEARCH_BTN_HOT_IMAGE);
m_pSearchBtn->SetPushedImage(SEARCH_BTN_CLICK_IMAGE);
// 定义响应事件
m_pSearchBtn->OnNotify += MakeDelegate(this, &CSearchContainerUI::SearchBtnOnClick);
// 加到父类容器里
Add(m_pSearchBtn);
}
如果是直接是在m_pMainLayout
上的控件,用m_pMainLayout->Add()
添加就好。
为什么要用代码布局
如果是一个很简单的小程序,可以使用xml
。但是如果稍微复杂点,我们需要针对各个控件设计不同的响应效果,这时xml
就有点繁琐了;或者是根据服务端返回的数目在一个容器里放上几十个Button
,xml
就很难搞定了。
总之,大家选择最适合的方式就好。