码迷,mamicode.com
首页 > 其他好文 > 详细

2、duilib 基本控件学习

时间:2015-03-29 19:30:27      阅读:367      评论:0      收藏:0      [点我收藏+]

标签:

1、关于创建问题:

在创建窗口的时候

CPaintManagerUI::SetResourcePath(CPaintManagerUI::GetInstancePath());
    MainWnd* main_wnd = new MainWnd();
    main_wnd->Create(NULL, L"Demo2", UI_WNDSTYLE_FRAME, WS_EX_WINDOWEDGE);
    main_wnd->CenterWindow();
    main_wnd->ShowModal();
    //delete main_wnd;

这里不用delete,却不会造成内存的泄露,如果手动delete还会报错。

其中的缘由则需要去看CPaintManagerUI的析构函数,里面已经做了相应的操作。

我是自己手动继承CWindowWnd的方式。则需要实现对应的HandleMessage函数。

技术分享
LRESULT MainWnd::OnCreate( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& handled ) {
    m_pm.Init(m_hWnd);
    CDialogBuilder dialog_builder;
    CControlUI* root = dialog_builder.Create(L"DuilibDemo2.xml", (UINT)0, NULL, &m_pm);
    m_pm.AttachDialog(root);
    m_pm.AddNotifier(this);

    return 0;
}
View Code

手动写创建的函数。注意:这里有AddNotifier(this),则需要类继承INotifyUI 并实现对应的Notify函数。当界面上的控件有相应的响应函数的时候,则在这里会接收到对应的通知。相应的发送对应notify消息的是CPaintManagerUI的成员函数SendNotify。而调用该函数的是对应的控件在doevent。

2、关于界面显示问题:

我这里使用的是继承CWindowWnd

需要重载HandleMessage,对相应的消息进行操作

技术分享
LRESULT MainWnd::HandleMessage( UINT uMsg, WPARAM wParam, LPARAM lParam ) {
    BOOL handled = TRUE;
    LRESULT res = 0;
    switch (uMsg) {
        case WM_CREATE:
            res = OnCreate(uMsg, wParam, lParam, handled);
            break;
        case WM_NCACTIVATE:
            res = OnNcActive(uMsg, wParam, lParam, handled);
            break;
        case WM_NCCALCSIZE:
            res = OnNcCalcSize(uMsg, wParam, lParam, handled);
            break;
        case WM_NCPAINT:
            res = OnNcPaint(uMsg, wParam, lParam, handled);
            break;
        case WM_NCHITTEST:
            res = OnNcHitTest(uMsg, wParam, lParam, handled);
            break;
        //case WM_SIZE:
        //    res = OnSize(uMsg, wParam, lParam, handled); break;
        default:
            handled = FALSE;
    }
    if (handled)
        return res;
    if (m_pm.MessageHandler(uMsg, wParam, lParam, res))
        return res;
    return __super::HandleMessage(uMsg, wParam, lParam);
}
View Code

如果去掉这里的NC系列的函数,则会出现界面的上还有对应系统默认的标题栏。这里有一个对应的OnNcHitTest函数

该函数是为了添加标题栏对应的移动那个操作,当鼠标移到标题栏上面的时候则提示系统,当前位置是标题栏。对此可以参照对应的WindowImplBase里面的OnNcHitTest函数。我这里只是将对应的函数的部分内容抄下来。

OnNcActive是接收对应的当前的窗口是否处于活动状态,所以这里要做相应的处理:当前处于最小化的时候则消息不必再传下去

技术分享
LRESULT MainWnd::OnNcActive( UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& handled ) {
    if (::IsIconic(m_hWnd))
        handled = FALSE;
    return wParam == 0;
}
View Code

 

3、关于xml的配置问题:

1、Tab控件:需要编辑对应的Option函数,多少个Tab选项则对应多少个Option

<Option width="78" text="演示列表" name="demo_tab" textcolor="#FF386382" normalimage="file=‘tabbar_normal.png‘" pushedimage="file=‘tabbar_pushed.png‘" hotimage="tabbar_hover.png" selectedimage="tabbar_pushed.png" group="tab_header" selected="true" />
<Option width="78" text="Web演示" name="web_tab" textcolor="#FF386382" normalimage="file=‘tabbar_normal.png‘" pushedimage="file=‘tabbar_normal.png‘" hotimage="tabbar_hover.png" selectedimage="tabbar_pushed.png" group="tab_header" />

       接下去则需要编辑相应的TabLayout函数,它的儿子控件的多少个需要跟Option一一对应(注意孙子控件不算,控件名字也是任意取)

当选择不同的option的时候,Notify会介绍到selectchanged的类型消息

技术分享
if (msg.sType == L"selectchanged") {
        CDuiString com_name = msg.pSender->GetName();
        CTabLayoutUI* tab_switch = static_cast<CTabLayoutUI*>(m_pm.FindControl(L"tab_switch")); 
        ASSERT(tab_switch != NULL);
        if (com_name.CompareNoCase(L"demo_tab") == 0)
            tab_switch->SelectItem(0);
        else if (com_name.CompareNoCase(L"web_tab") == 0)
            tab_switch->SelectItem(1);
    }
View Code

注意:这里调用该Notify的控件是重新被选中的option.

 

2、在编辑图片的时候经常会用到corner="left,top,right,bottom" 的方式,这个的意思是:将该图片的四边不拉伸的方式直接显示。而该图片的出去四边之后中心位置则为任意拉伸(而很容易出现图像变形)。

3、list控件:该list控件将会填充整个VerticalLayout 或者 HorizontalLayout

所以在写入之前尽量先用上面两个封装一遍并限制宽或者高。

技术分享
<List name="list_view" vscrollbar="true" headerbkimage="list_header_bg.png" itemtextstyle="center">
                                        <ListHeader height="24" menu="true">
                                            <ListHeaderItem text="姓名" width="100" hotimage="list_header_hot.png" pushedimage="list_header_pushed.png" sepimage="list_header_sep.png" sepwidth="1" />
                                            <ListHeaderItem text="学号" width="200" hotimage="list_header_hot.png" pushedimage="list_header_pushed.png" sepimage="list_header_sep.png" sepwidth="1" />
                                            <ListHeaderItem text="成绩" width="300" hotimage="list_header_hot.png" pushedimage="list_header_pushed.png" sepimage="list_header_sep.png" sepwidth="1" />
                                        </ListHeader>
                                    </List>
View Code

之后就可以在代码中添加对应的列表

技术分享
CListUI* list_ui = static_cast<CListUI*>(m_pm.FindControl(L"list_view"));
    ASSERT(list_ui != NULL);
    for (int i = 0; i < 10; ++i) {
        CListTextElementUI* list_element = new CListTextElementUI();
        list_element->SetTag(i);
        list_ui->Add(list_element);
        list_element->SetText(0, L"cxiaoln");
        list_element->SetText(1, L"设计");
        list_element->SetText(2, L"0922");
    }
View Code

4、树形控件

首先编辑TreeView

<TreeView bkcolor="#ffffffff" visiblefolderbtn="true" visiblecheckbtn="true" vscrollbar="true">

这里设置了folder跟check均显示,则阶下囚对应的TreeNode需要给出对应的这两个控件的属性设置

<TreeNode folderattr="XXX" checkboxattr="XXX" /> 

对应的XXX的内容跟普通控件的属性列表一样包含需要显示的信息。

 

2、duilib 基本控件学习

标签:

原文地址:http://www.cnblogs.com/cxiaoln/p/4376013.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!