You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 19:06:05