SOUI官方论坛

 找回密码
 立即注册
查看: 224|回复: 1

SHeaderCtrl扩展,增加列宽、列头、顺序、显隐的记忆功能

[复制链接]
  • TA的每日心情
    开心
    5 天前
  • 签到天数: 942 天

    [LV.10]以坛为家III

    580

    主题

    1340

    帖子

    2万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    28797
    发表于 2023-2-28 11:50:33 | 显示全部楼层 |阅读模式
    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)


    上面两个只是能过消息实现了列宽、拖动位置的记忆,而自定义列头、列的显隐、列过滤就需要对话框和用户交互才可实现。

    录制_2023_02_28_10_53_54_573.gif

    以上动画演示了扩展SHeaderCtrl后,点击新增加的一个按钮,弹出列信息的过程,继续完善后即可达到要求。

    下面我讲解一下整个原理是什么
    2023-02-28_113258.png
    在headerStyle中添加了imgbtnStyle,用于在SHeaderCtrl中添加一个按钮(我是放在表头右侧的位置,位置不太合理,也会遮挡原有文字,@setoutsoft 的思路是不要这个按钮,只提供函数,由开发者自己调用)
    2023-02-28_113633.png
    新增加的部分在红框内,这里创建一个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中内容如下,红框均为新增的
    2023-02-28_114105.png

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



    对话框类内容如下
    2023-02-28_114359.png
    类中重写了OnLoadLayoutFromResourceID函数,可以直接从模板中加载。我在对话框中使用SListView,也要相应的加上class CTestAdapterFixHorz : public SAdapterBase来处理内容的显示和交互。

    代码见下方附件,弹出对话框部分的可根据自己期望再优化。每列的内容过滤也可再添加一个对话框来实现。
    游客,如果您要查看本帖隐藏内容请回复

    实现此功能中也遇到了布局方面的问题,可参考
    SListView中使用linearLayout布局上下居中weight自动计算
    http://119.91.211.105:9999/forum.php?mod=viewthread&tid=1495
    (出处: SOUI官方论坛)






  • TA的每日心情
    奋斗
    2023-12-28 08:35
  • 签到天数: 84 天

    [LV.6]常住居民II

    0

    主题

    35

    帖子

    803

    积分

    04:00化神期

    Rank: 4

    积分
    803
    发表于 2023-3-5 20:54:21 | 显示全部楼层
    学习学习
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|SOUI官方论坛

    GMT+8, 2024-5-3 23:35

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表