图片显示和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;
}