TA的每日心情 | 开心 5 天前 |
---|
签到天数: 942 天 [LV.10]以坛为家III
管理员
- 积分
- 28797
|
SMcListView相对于SListCtrl,具有配置灵活、支持用户交互、动画等功能,使用起来非常方便。
第二十九篇:使用SOUI的SMCListView控件
用户在实际使用时希望实现:
1、列宽能够记忆
2、表头的内容可以自定义
3、列的顺序可调且可记忆(SMcListView中默认开启了itemSwapEnable)
4、列的显示隐藏可自定义
5、列的内容过滤
这些功能是共性需求,若是每个SHeaderCtrl都要去添加几个对话框来实现这些功能,就会显得浪费时间,因为要对控件进行扩展。
struct SerializeInfo
{
SerializeInfo():index(0),iOrder(0),width(0),bVisible(true){}
int index; //原始序号
int iOrder; //显示顺序
int width; //列宽
bool bVisible; //是否可见
};
void UpdateSerializeInfo(SStringT iniFile,SStringT sKey);
void SaveSerializeInfo(SStringT iniFile,SStringT sKey);
程序扩展了这两个函数,输入ini文件路径及ini的Key,即可实现信息的记忆。
使用时非常简单,只需要响应这两个消息(列宽变化、拖动位置)时
EVENT_NAME_HANDLER(L"mclv_detail_header", SOUI::EVT_HEADER_ITEMCHANGED,OnDetailMCHeaderItemChangingEvent)
EVENT_NAME_HANDLER(L"mclv_detail_header", SOUI::EVT_HEADER_ITEMSWAP,OnDetailMCHeaderItemSwapEvent)
上面两个只是能过消息实现了列宽、拖动位置的记忆,而自定义列头、列的显隐、列过滤就需要对话框和用户交互才可实现。
以上动画演示了扩展SHeaderCtrl后,点击新增加的一个按钮,弹出列信息的过程,继续完善后即可达到要求。
下面我讲解一下整个原理是什么
在headerStyle中添加了imgbtnStyle,用于在SHeaderCtrl中添加一个按钮(我是放在表头右侧的位置,位置不太合理,也会遮挡原有文字,@setoutsoft 的思路是不要这个按钮,只提供函数,由开发者自己调用)
新增加的部分在红框内,这里创建一个button,SHeaderCtrlImageButton : public SImageButton,要重写InitFromXml函数(因为SButton的InitFromXml不是public方法),这样按钮就能显示出来了,而且有相应的Click响应
pugi::xml_node selItemTemp = xmlNode.child(L"selItemTemp");
if(!selItemTemp) return FALSE;
m_xmlDialog.append_copy(selItemTemp);
这部分读取了headerStyle中的selItemTemp信息,用于创建一个对话框
xml中内容如下,红框均为新增的
在bool SHeaderCtrl::OnImgBtnClick(SOUI::EventArgs* pEvt)中弹出一个模态对话框,
SArray<CTestAdapterFixHorz::SettingInfo> optInfo;
for(int i=0;i<GetItemCount();i++){
SHDITEM item;
item.mask = SHDI_TEXT;
GetItem(i,&item);
CTestAdapterFixHorz::SettingInfo info;
info.strTitleName = item.strText.GetText(TRUE);
info.colWidth = GetItemWidth(i);
info.bVisible = item.bVisible;
optInfo.Add(info);
}
SOptDialog2 optDlg(m_xmlDialog.root().first_child(),&optInfo);
optDlg.DoModal(GetContainer()->GetHostHwnd());
for(int i=0;i<optInfo.GetCount();i++){
//SLOG_INFO("item "<< optInfo.strName.c_str()<<" checked:"<<optInfo.bChecked);
}
对话框类内容如下
类中重写了OnLoadLayoutFromResourceID函数,可以直接从模板中加载。我在对话框中使用SListView,也要相应的加上class CTestAdapterFixHorz : public SAdapterBase来处理内容的显示和交互。
代码见下方附件,弹出对话框部分的可根据自己期望再优化。每列的内容过滤也可再添加一个对话框来实现。
实现此功能中也遇到了布局方面的问题,可参考
SListView中使用linearLayout布局上下居中weight自动计算
http://119.91.211.105:9999/forum.php?mod=viewthread&tid=1495
(出处: SOUI官方论坛)
|
|