SOUI图片显示,button,treeview控件

图片显示和treeview控件

<!-- [相对于前一个窗口,在x位置时是相对于前一个同级窗口的right,
    在y时是相对于前一个窗口的bottom
    2个-5表示相对于父窗口向内缩5个像素-->  
<window pos="5,[2,-5,-5">
    <!--文字按钮,tip表示鼠标移上去的提示内容,focusable是否获取焦点,获取焦点会显示虚线框-->
    <button pos="50, 0" name="btn_test" size="50,30" tip="tips test" focusable="0">test</button>
    <!--静态文字展示,pos第3,4位置加@表示值为宽高-->
    <text pos="50,90,@100,@30">文字测试</text>

imgframe是把输入的图片当成一个图片
imglist是把输入的图片当成一组图片

比如下面一个skin,其中的status就表示图片中含有5个图片

<imglist name="skin_test" src="jpg:abc" states="5"/>

按钮上面叠加图片

<button class="normalbtn" name="btn_img" skin="skin_abc" pos="50, 50,@57,@40" enable="1"/>


每个按钮有正常,鼠标移上去即hover,鼠标点击几个状态
比如上面的图片,应该至少有3个小图,对应按钮的每个状态

按钮的点击事件
在布局相应的dialog里面,添加如下代码:

protect:
EVENT_MAP_BEGIN()
    EVENT_NAME_COMMAND(L"btn_test", buttonClick)
EVENT_MAP_END()

在cpp中添加函数buttonClick,如下:

bool CMainDlg::buttonClick()
{
    ::OutputDebugString(_T("button click"));
    return true;
}

即可响应鼠标的点击事件

treeview控件

布局添加

<treeview pos="0,[0,-100,-0" name="tree_view" itemHeight="-1" colorItemBkgnd="#FFFFFF" colorItemSelBkgnd="#cccccc" indent="30">
    <template height="60" colorHover="#cccccc" colorSelected="#0000ff" trackMouseEvent="1">
        <!--item展示箭头定义,使用系统自带skin-->
        <toggle pos="[0,|0,@20,@20"  offset="0,-0.5" name="tgl_switch" skin="_skin.sys.tree.toggle" tip="show how to use switch"/>
        <!--item图标-->
        <img pos="[10,{0,@30,@30" skin="skin_test" name="ani_test" tip="animateimg is used here" msgTransparent="0" />
        <!--item文字,colortext表示颜色rgb,十六进制,每2位一个颜色,#ff0000,即为红色-->
        <text pos="[20,{0" colorText="#ff0000" name="txt_red">text item</text>
    </template>
</treeview>

控件展示自定义数据需要对控件添加adapter    

BOOL CMainDlg::OnInitDialog(HWND hWnd, LPARAM lParam)
{
        ......

        STreeView *pTreeView = FindChildByName2<STreeView>("tree_view");
        if (pTreeView)
        {
            TreeViewAdapter *adapter = new TreeViewAdapter;
            pTreeView->SetAdapter(adapter);
            adapter->Release();
            //((TreeViewAdapter *)(pTreeView->GetAdapter()))->init();
        }
        
        ......

        return 0;
 }

其中TreeViewAdapter是自定义类,继承自STreeAdapterBase<T> :
  

 #include "string/tstring.h"
    #include "helper/SAdapterBase.h"

    struct TreeItem
    {
        SStringT itemId;
        SStringT itemName;
    };

    class TreeViewAdapter : public STreeAdapterBase<TreeItem>
    {
    public:
        TreeViewAdapter();
        ~TreeViewAdapter();

        void init();
        HSTREEITEM getItemByinfo(SStringT infoid);

        void getView(SOUI::HTREEITEM,SOUI::SWindow *,pugi::xml_node);

        bool OnSwitchClick(EventArgs *pEvt);
    private:
        bool checkItemMatch(HSTREEITEM item, SStringT infoid);
        HSTREEITEM checkNodes(HSTREEITEM item, SStringT infoid);
    };

其中getView方法是必须重载的,其他都属于自定义

treeview控件添加展示数据的方法:    

TreeItem data;
    data.itemId = L"root";
    data.itemName = _T("root node");

    HSTREEITEM root = InsertItem(data);
    SetItemExpanded(root, true);
    for (int i = 0; i < 4; i++)
    {
        TreeItem item;
        item.itemId.Format(_T("%d"), i + 1);
        item.itemName.Format(_T("%d test"), i + 1);
        HSTREEITEM treeitem = InsertItem(item, root);
    }


    
    //真正组织自定义数据展示的地方
    

void TreeViewAdapter::getView(SOUI::HTREEITEM loc,SOUI::SWindow *pItem,pugi::xml_node xmlTemplate)
    {
        if(pItem->GetChildrenCount() == 0)
        {
            pItem->InitFromXml(xmlTemplate);
        }
        //将自定义的name展示出来
        ItemInfo & ii = m_tree.GetItemRef((HSTREEITEM)loc);
        SWindow *pTxtRed = pItem->FindChildByID(R.id.txt_red);
        SASSERT(pTxtRed);
        pTxtRed->SetWindowText(ii.data.itemName);
        
        //设置使用第几个图片
        SImageWnd *pPic = (SImageWnd*)pItem->FindChildByName(L"ani_test");
        SASSERT(pPic);
        pPic->SetSkin(pPic->GetSkin(), 3);
        //设置是否可见
        pSwitch->SetVisible(HasChildren(loc));
        //设置toggle状态
        pSwitch->SetToggle(IsItemExpanded(loc));
        //监听事件,事件类型为EVT_CMD
        pSwitch->GetEventSet()->subscribeEvent(EVT_CMD,Subscriber(&TreeViewAdapter::OnSwitchClick,this));
    }
    
    
    bool TreeViewAdapter::OnSwitchClick(EventArgs *pEvt)
    {
        SToggle *pToggle = sobj_cast<SToggle>(pEvt->sender);
        SASSERT(pToggle);
        SItemPanel *pItem = sobj_cast<SItemPanel>(pToggle->GetRoot());
        SASSERT(pItem);
        SOUI::HTREEITEM loc = (SOUI::HTREEITEM)pItem->GetItemIndex();
        ExpandItem(loc,ITvAdapter::TVC_TOGGLE);
        return true;
    }


    
重新编译,运行    添加了一个遍历tree查找指定字段的方法:
    

bool TreeViewAdapter::checkItemMatch(HSTREEITEM item, SStringT infoid)
    {
        if (item == ITvAdapter::ITEM_ROOT || 
            item == ITvAdapter::ITEM_NULL)
        {
            return false;
        }

        ItemInfo itemInfo = m_tree.GetItem(item);
        TreeItem itemdata = itemInfo.data;
        if (itemdata.itemId == infoid)
        {
            return true;
        }

        return false;
    }

    HSTREEITEM TreeViewAdapter::checkNodes(HSTREEITEM item, SStringT infoid)
    {
        HSTREEITEM node = item;
        if (node == ITEM_NULL)
        {
            return ITEM_NULL;
        }
        if (checkItemMatch(node, infoid))
        {
            return node;
        }

        if (HasChildren(node))
        {
            HSTREEITEM childnode = GetFirstChildItem(node);
            HSTREEITEM item = checkNodes(childnode, infoid);
            if (item != ITvAdapter::ITEM_NULL)
            {
                return item;
            }
        }

        while (true) 
        {
            if (node == ITEM_NULL)
            {
                break;
            }
            HSTREEITEM siblingNode = GetNextSiblingItem(node);
            HSTREEITEM item = checkNodes(siblingNode, infoid);
            if (item != ITvAdapter::ITEM_NULL)
            {
                return item;
            }
            node = siblingNode;
        }
        
        return ITEM_NULL;
    }

    HSTREEITEM TreeViewAdapter::getItemByinfo(SStringT infoid)
    {
        HSTREEITEM root = ITvAdapter::ITEM_ROOT;
        HSTREEITEM item = checkNodes(root, infoid);

        return item;
    }

猜你喜欢

转载自blog.csdn.net/ybn187/article/details/81668544