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;
}

手动写创建的函数。注意:这里有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);
}

如果去掉这里的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;
}

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);
    }

注意:这里调用该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>

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

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");
    }

4、树形控件

首先编辑TreeView

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

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

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

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

时间: 2024-12-21 17:01:48

2、duilib 基本控件学习的相关文章

wxPython控件学习之wx.grid.Grid 表格控件

wxPython控件学习之wx.grid.Grid (包括对GridCellEditor和GridCelRender的扩展,以支持更多的grid cell 样式, 以GridCellColorEditor为例) wx.Grid 及其相关的类是用来显示和编辑类表格样式的数据.该控件为显示,编辑数据源提及交互供了丰富的特征. wx.GridTableBase类控制要显示的实际数据.可以call CreateGrid()产生一个该类的实例对象. wx.GridCellRenderer 基类,负责对单元

CComboBox(组合框)控件 学习要点

CComboBox(组合框)控件 CComboBox类常用成员 CComboBox插入数据 CComboBox删除数据 CComboBox运用示例   一.CComboBox控件常用属性    Disabled    Visible    type    数据   二.CComboBox类常用成员   ((CComboBox*)GetDlgItem(IDC_COMBO1))//获取组合框对象指针,这样可以不关联控件变量,也可以操作组合框对象 CComboBox::ResetContent//清空

DbNetGrid控件学习教程及下载使用指南

DbNetGrid是龙博方案网的旗帜产品.它是一款基于网页的报告工具,它能简单地在浏览器中展示数据库信息.通过DbNetGrid,您能在不编写任何代码的情况下搜索.导航.分类.编辑.复制.打印以及导出数据库信息.是一款完全压缩的.用于内网与互联网开发的HTML网格控件.它被设计用来实现能在浏览器环境中展示与更新数据库信息的快速灵活的方法.DbNetGrid能完全开发IE5及更高版本浏览器的功能 具体功能: 搜索.导航.分类.更新.添加.删除.导出.上传.连接.嵌入.打印.复制以及更多-- 不需要

GUI 控件学习一(C#)

代码片段: using UnityEngine; using System.Collections; public class SkinTest : MonoBehaviour { public Texture imgbtn; private string textContent ="Textfield"; private string passwordToEdit ="PasswordField"; private string textAreaToEdit =

DevExpress控件学习总结(转)

DevExpress控件学习总结 1.Navigation & Layout 1.1 Bar Manager 如果想在窗体或用户控件(user control)上添加工具条(bars)或弹出菜单(popup menus),我们需要把一个不可见的控件(component)BarManager(Navigation&Layout)拖放到这个窗体或用户控件上.这个控件维护工具条在窗体上的布局,处理用户的行为(processes an end-user's actions),提供一些定制功能等等.

第二课:IOS(App)UIImage控件与TextField控件学习

作为一名实习生我是1.3.5在办公室工作,2.4.6去另一个地方听课学习IOS(app)课程,为了不落下课程,我准备每天晚上把落下的课程自学一遍,把不懂的记下等去听课的时候问老师,希望自己能跟上学习的步伐,不浪费时间.这一课是前几天听的,今天一起也写上了. 第二课:IOS(App)UIImage控件与TextField控件的学习,代码如下 一:UIImage控件代码:把图片添加到视图中并设置大小,这里没有牵涉到图片背景的颜色设置,我猜想应该是没必要去设置的吧,因为没有按钮功能的话背景颜色也看不到

MFC自绘控件学习总结

前言:从这学期开始就一直在学习自绘控件(mfc),目标是做出一款播放器界面,主要是为了打好基础,因为我基础实在是很烂....说说我自己心得体会以及自绘控件的方法吧,算是吐槽吧,说的不对和不全的地方,或者有更好的方法,请不吝赐教.我的机器环境是:Windows7旗舰版 Service Pack 1,Visual studio 20051).重绘某个控件时,强烈推荐使用子类化方法,比如想自绘Button控件, 首先添加自己的类CMYButton 继承自 CButton ,声明一个CMYButton

蓝懿iOS培训日志8 控件学习2

现在是凌晨一点,准备睡觉,白天学习效率不高的话就得加班. 今天学习了TableView  NavigationController导航控制器 TableViewController   晚上但作业是利用这些控件加上前几天学的正反向传值来实现一个简单的通讯录. 因为白天学的知识点没有掌握好,所以晚上做作业时需要翻看白天的知识点,边看边做.我觉得还是需要抽时间把知识点消化掉.还需要多加练习,不然以后也不能需要实现什么功能,现找对应的代码.下面是我的部分总结,纯个人总结. tableView的复用机制

MFC自绘控件学习总结第二贴

首先感谢大家对第一帖的支持,应一些网友烈要求下面我在关于上一贴的一些补充和说明(老鸟可以无视)这一贴是实战+理论不知道第一帖的先看第一帖:http://topic.csdn.net/u/20110710/19/5209f358-31c8-4057-b108-02155a417fd0.html 1).补充个高级可重载函数PreSubclassWindow(),我的理解是允许用户在子类化之前再做一额外些处理 ,这个重载函数也是非常重要的,要引起相当的注意.可以在这里改变控件的大小,位置,窗口样式,字