文章目录
  1. 1. 工程创建
  2. 2. 加载控件
  3. 3. 为什么要用代码布局

其实网上的教程大都是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
21
LRESULT 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,我们首先需要在代码把xmlwindows字段的信息用代码添加。例如:

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
14
void 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就有点繁琐了;或者是根据服务端返回的数目在一个容器里放上几十个Buttonxml就很难搞定了。

总之,大家选择最适合的方式就好。

文章目录
  1. 1. 工程创建
  2. 2. 加载控件
  3. 3. 为什么要用代码布局