zoukankan      html  css  js  c++  java
  • 2、duilib 基本控件学习

    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的内容跟普通控件的属性列表一样包含需要显示的信息。

    5、时间控件

    时间控件是继承label,当处于选中状态的时候会弹出对应的选择日期。这个子控件在lostfocus之后就会自动调用OnFinalMessage进行自己销毁。

    当时间控件显示的时候是以label的方式显示,所以想移动字符的相对位置可以看label的SetAttribute的设置,如:textpadding="4,0,0,0" 将正常显示的时间右移四个像素。

     
  • 相关阅读:
    CSS实现雨滴动画效果
    大型网站架构系列:电商网站架构案例
    CSS 不定宽高的垂直水平居中方式总汇
    js中尺寸类样式
    Tiling
    排序二叉树
    算术表达式的转换
    Area
    catch that cow
    R中双表操作学习[转载]
  • 原文地址:https://www.cnblogs.com/cxiaoln/p/4376013.html
Copyright © 2011-2022 走看看