NSIS使用nsWindows创建子对话框时如何添加带列的ListView控件?
你可以通过调用Windows原生API直接在nswindows窗口中创建ListView控件,不需要依赖nswindows内置的ListBox宏,具体实现步骤如下:
- 提前引入依赖:确保你已经导入了NSIS的System插件,以及
CommCtrl.nsh头文件(内置了ListView相关的消息常量),同时在脚本开头添加InitCommonControls命令初始化通用控件,避免ListView无法正常渲染。 - 替换原有ListBox创建逻辑:删除原来的
${NSW_CreateListBox}相关代码,改用CreateWindowEx直接创建SysListView32类控件,父窗口句柄传入你创建的nswindows窗口句柄$hwindow3。 - 调用ListView消息添加列:创建完成后发送
LVM_INSERTCOLUMN消息添加你需要的多列,设置列宽、列名即可。 - 后续添加条目时,发送
LVM_INSERTITEM新增行,LVM_SETITEMTEXT设置不同列的内容即可实现多列展示效果。
修改后的参考代码如下:
!include "CommCtrl.nsh" !include "System.nsh" Var hwindow3 Var hCtl_test_ListView Var /GLOBAL LVCF_FMT LVCF_WIDTH LVCF_TEXT LVCF_SUBITEM StrCpy $LVCF_FMT 0x1 StrCpy $LVCF_WIDTH 0x2 StrCpy $LVCF_TEXT 0x4 StrCpy $LVCF_SUBITEM 0x8 Function MyTestListBox ${NSW_CreateWindow} $hwindow3 "TEst" 1018 ${NSW_SetWindowSize} $hwindow3 400 300 ${NSW_CenterWindow} $hwindow3 $hwndparent ${NSW_OnBack} OnBack3 ; 直接创建ListView控件 System::Call 'user32::CreateWindowEx(i 0x0, t "SysListView32", t "", i ${WS_CHILD}|${WS_VISIBLE}|${LVS_REPORT}, i 7u, i 59u, i 193u, i 91u, p $hwindow3, p 0, p 0, p 0)p.r0' Pop $hCtl_test_ListView ; 添加第一列:名称 System::Alloc 64 Pop $1 System::Call '*$1(i $LVCF_FMT|$LVCF_WIDTH|$LVCF_TEXT, i ${LVCFMT_LEFT}, i 80, p t"名称")p' SendMessage $hCtl_test_ListView ${LVM_INSERTCOLUMN} 0 $1 System::Free $1 ; 添加第二列:编号 System::Alloc 64 Pop $1 System::Call '*$1(i $LVCF_FMT|$LVCF_WIDTH|$LVCF_TEXT, i ${LVCFMT_LEFT}, i 100, p t"编号")p' SendMessage $hCtl_test_ListView ${LVM_INSERTCOLUMN} 1 $1 System::Free $1 ${NSW_Show} Create_End: ShowWindow $hwindow3 ${SW_SHOW} FunctionEnd
如果需要实现搜索过滤功能,可以在搜索输入框的内容变动事件中,先清空ListView所有现有条目,再匹配搜索关键词,把符合条件的条目重新插入ListView即可。
内容的提问来源于stack exchange,提问作者Bile Mo
相关产品推荐
相关产品推荐

