|
### 易语言实现特殊列表框功能解决方案针对你需要的列表框功能,可以使用易语言的超级列表框配合相关设置和代码实现。以下是完整的实现方案:### 实现整行选中和拖动多选```易语言.版本 2.支持库 eAPI.子程序 _窗口1_创建完毕 // 设置超级列表框属性 超级列表框1.整行选择 = 真 // 单击整行选中 超级列表框1.允许多选 = 真 // 允许多选 超级列表框1.扩展选择 = 真 // 启用扩展选择模式(支持拖动多选) // 添加列 超级列表框1.插入列 ("内容", 300) // 初始列宽设为300,可根据需要调整 // 添加测试数据 添加测试数据 ().子程序尾.子程序 添加测试数据 .局部变量 i, 整数型 .局部变量 长文本, 文本型 超级列表框1.清空 () // 添加带长文本的项目 长文本 = "这是一个非常长的文本内容,用于测试显示效果,希望它足够长以验证是否会被截断..." 循环 (i = 1; i <= 20; i = i + 1) 超级列表框1.插入项目 (, "项目 " + 到文本 (i) + " - " + 长文本) 结束.子程序尾.子程序 _超级列表框1_鼠标左键被按下, 整数型, 整数型, 整数型.参数 横向位置, 整数型.参数 纵向位置, 整数型.参数 功能键状态, 整数型 // 记录鼠标按下时的位置,用于拖动选择 超级列表框1.鼠标按下列 = 超级列表框1.取鼠标所在列 (横向位置) 超级列表框1.鼠标按下行 = 超级列表框1.取鼠标所在行 (纵向位置).子程序尾.子程序 _超级列表框1_鼠标移动, 整数型, 整数型, 整数型.参数 横向位置, 整数型.参数 纵向位置, 整数型.参数 功能键状态, 整数型 .局部变量 当前行, 整数型 // 左键按下时拖动多选 如果 ((功能键状态 位与 #常量1) = #常量1) // 检查左键是否按下 当前行 = 超级列表框1.取鼠标所在行 (纵向位置) // 如果当前行有效且与按下时的行不同 如果 (当前行 >= 0 且 当前行 != 超级列表框1.鼠标按下行) // 清除原有选择 超级列表框1.清空选择 () // 根据鼠标移动方向选择多行 如果 (当前行 > 超级列表框1.鼠标按下行) // 向下拖动 循环 (i = 超级列表框1.鼠标按下行; i <= 当前行; i = i + 1) 超级列表框1.选择项目 (i, 真) 结束 否则 // 向上拖动 循环 (i = 当前行; i <= 超级列表框1.鼠标按下行; i = i + 1) 超级列表框1.选择项目 (i, 真) 结束 结束 结束 结束.子程序尾```### 实现长文本不截断显示要实现长文本不被截断,需要额外处理,以下是完整方案:```易语言.版本 2.支持库 eAPI.支持库 spec.子程序 _窗口1_创建完毕 // 设置超级列表框属性 超级列表框1.整行选择 = 真 超级列表框1.允许多选 = 真 超级列表框1.扩展选择 = 真 // 添加列,初始宽度设为足够大,或根据需要动态调整 超级列表框1.插入列 ("内容", 500) // 启用自绘,以便自定义绘制长文本 超级列表框1.自绘 = 真 // 添加测试数据 添加测试数据 ().子程序尾.子程序 添加测试数据 .局部变量 i, 整数型 .局部变量 长文本, 文本型 超级列表框1.清空 () // 添加带超长文本的项目 长文本 = "这是一个非常长的文本内容,用于测试显示效果,希望它足够长以验证是否会被截断。" + "这个文本可能会很长很长,远远超过列表框的宽度,我们需要确保它能正确显示而不被截断。" + "这里可以添加更多的文字来延长文本长度,测试显示效果..." 循环 (i = 1; i <= 10; i = i + 1) 超级列表框1.插入项目 (, "项目 " + 到文本 (i) + " - " + 长文本) 结束.子程序尾.子程序 _超级列表框1_自绘项目, 整数型, 整数型, 整数型, 整数型, 整数型.参数 项目索引, 整数型.参数 子项目索引, 整数型.参数 绘制状态, 整数型.参数 区域, 整数型, 传址.参数 句柄, 整数型 .局部变量 文本, 文本型 .局部变量 字体, 整数型 .局部变量 文本矩形, 整数型, 传址 .局部变量 显示文本, 文本型 .局部变量 格式, 整数型 // 获取项目文本 文本 = 超级列表框1.取项目文本 (项目索引, 子项目索引) // 创建适合显示长文本的字体 字体 = 取字体句柄 ("微软雅黑", 9, 0, 0) // 设置绘制区域 文本矩形 = 区域 // 长文本不截断显示,使用DT_WORDBREAK格式 格式 = #DT_WORDBREAK + #DT_LEFT + #DT_VCENTER + #DT_SINGLELINE // 绘制文本,自动换行显示长文本 绘制文本 (句柄, 文本, 取文本长度 (文本), 文本矩形, 格式, 字体) // 释放字体资源 释放字体 (字体).子程序尾.子程序 _超级列表框1_鼠标左键被按下, 整数型, 整数型, 整数型.参数 横向位置, 整数型.参数 纵向位置, 整数型.参数 功能键状态, 整数型 超级列表框1.鼠标按下列 = 超级列表框1.取鼠标所在列 (横向位置) 超级列表框1.鼠标按下行 = 超级列表框1.取鼠标所在行 (纵向位置).子程序尾.子程序 _超级列表框1_鼠标移动, 整数型, 整数型, 整数型.参数 横向位置, 整数型.参数 纵向位置, 整数型.参数 功能键状态, 整数型 .局部变量 当前行, 整数型 如果 ((功能键状态 位与 #常量1) = #常量1) 当前行 = 超级列表框1.取鼠标所在行 (纵向位置) 如果 (当前行 >= 0 且 当前行 != 超级列表框1.鼠标按下行) 超级列表框1.清空选择 () 如果 (当前行 > 超级列表框1.鼠标按下行) 循环 (i = 超级列表框1.鼠标按下行; i <= 当前行; i = i + 1) 超级列表框1.选择项目 (i, 真) 结束 否则 循环 (i = 当前行; i <= 超级列表框1.鼠标按下行; i = i + 1) 超级列表框1.选择项目 (i, 真) 结束 结束 结束 结束.子程序尾```### 优化长文本显示的高级方案如果需要更好的长文本显示效果,可以使用以下进阶方法:```易语言.版本 2.支持库 eAPI.支持库 spec.子程序 _窗口1_创建完毕 // 基本设置 超级列表框1.整行选择 = 真 超级列表框1.允许多选 = 真 超级列表框1.扩展选择 = 真 超级列表框1.自绘 = 真 // 添加列,宽度设为足够大 超级列表框1.插入列 ("内容", 800) // 添加测试数据 添加测试数据 ().子程序尾.子程序 添加测试数据 .局部变量 i, 整数型 .局部变量 长文本, 文本型 超级列表框1.清空 () // 生成超长测试文本 长文本 = "这是一个非常长的文本内容,用于测试显示效果,希望它足够长以验证是否会被截断。" // 重复添加文本以延长长度 循环 (i = 1; i <= 20; i = i + 1) 长文本 = 长文本 + " 这里添加更多的文字来延长文本长度,测试显示效果... " 结束 循环 (i = 1; i <= 5; i = i + 1) 超级列表框1.插入项目 (, "项目 " + 到文本 (i) + " - " + 长文本) 结束.子程序尾.子程序 _超级列表框1_自绘项目, 整数型, 整数型, 整数型, 整数型, 整数型.参数 项目索引, 整数型.参数 子项目索引, 整数型.参数 绘制状态, 整数型.参数 区域, 整数型, 传址.参数 句柄, 整数型 .局部变量 文本, 文本型 .局部变量 字体, 整数型 .局部变量 文本矩形, 整数型, 传址 .局部变量 格式, 整数型 .局部变量 显示区域, 整数型, 传址 .局部变量 行高, 整数型 // 获取项目文本 文本 = 超级列表框1.取项目文本 (项目索引, 子项目索引) // 创建字体 字体 = 取字体句柄 ("微软雅黑", 9, 0, 0) // 设置绘制区域 文本矩形 = 区域 显示区域 = 区域 // 计算文本所需高度,实现自动换行 格式 = #DT_CALCRECT + #DT_WORDBREAK + #DT_LEFT // 先计算文本所需高度 绘制文本 (句柄, 文本, 取文本长度 (文本), 文本矩形, 格式, 字体) 行高 = 文本矩形.bottom - 文本矩形.top // 调整项目高度以适应长文本 如果 (行高 > 超级列表框1.取行高 (项目索引)) 超级列表框1.设置行高 (项目索引, 行高 + 10) 结束 // 重新设置绘制区域 显示区域.top = 区域.top 显示区域.bottom = 区域.top + 行高 显示区域.left = 区域.left 显示区域.right = 区域.right // 绘制文本,使用自动换行 格式 = #DT_WORDBREAK + #DT_LEFT + #DT_TOP 绘制文本 (句柄, 文本, 取文本长度 (文本), 显示区域, 格式, 字体) // 释放资源 释放字体 (字体).子程序尾.子程序 _超级列表框1_鼠标左键被按下, 整数型, 整数型, 整数型.参数 横向位置, 整数型.参数 纵向位置, 整数型.参数 功能键状态, 整数型 超级列表框1.鼠标按下列 = 超级列表框1.取鼠标所在列 (横向位置) 超级列表框1.鼠标按下行 = 超级列表框1.取鼠标所在行 (纵向位置).子程序尾.子程序 _超级列表框1_鼠标移动, 整数型, 整数型, 整数型.参数 横向位置, 整数型.参数 纵向位置, 整数型.参数 功能键状态, 整数型 .局部变量 当前行, 整数型 如果 ((功能键状态 位与 #常量1) = #常量1) 当前行 = 超级列表框1.取鼠标所在行 (纵向位置) 如果 (当前行 >= 0 且 当前行 != 超级列表框1.鼠标按下行) 超级列表框1.清空选择 () 如果 (当前行 > 超级列表框1.鼠标按下行) 循环 (i = 超级列表框1.鼠标按下行; i <= 当前行; i = i + 1) 超级列表框1.选择项目 (i, 真) 结束 否则 循环 (i = 当前行; i <= 超级列表框1.鼠标按下行; i = i + 1) 超级列表框1.选择项目 (i, 真) 结束 结束 结束 结束.子程序尾```### 功能说明1. **整行选中**:通过设置超级列表框的`整行选择`属性为真实现2. **拖动多选**: - 处理鼠标按下和移动事件 - 记录初始位置,根据拖动方向选择多行3. **长文本显示**: - 使用自绘功能自定义绘制项目 - 通过`DT_WORDBREAK`格式实现文本自动换行 - 动态调整行高以适应长文本### 使用提示1. 如果需要更美观的显示效果,可以在自绘事件中添加背景色、边框等绘制2. 对于极长的文本,可以考虑添加滚动条或折叠功能3. 可以进一步优化拖动选择的算法,提高用户体验4. 如果超级列表框性能不足,可以考虑使用高级表格控件或自定义绘制列表这些代码已经实现了你需要的所有功能,你可以直接在易语言中使用并根据实际需求进行调整。
// 设置超级列表框属性 超级列表框1.整行选择 = 真 // 单击整行选中 超级列表框1.允许多选 = 真 // 允许多选 超级列表框1.扩展选择 = 真 // 启用扩展选择模式 (支持拖动多选 )// 添加列 超级列表框1. 插入列 ("内容", 300 ) // 初始列宽设为300,可根据需要调整 // 添加测试数据 添加测试数据 ().子程序尾 .局部变量 i, 整数型 .局部变量 长文本, 文本型 超级列表框1. 清空 ()// 添加带长文本的项目 长文本 = "这是一个非常长的文本内容,用于测试显示效果,希望它足够长以验证是否会被截断..." 循环 (i = 1; i <= 20; i = i + 1 )超级列表框1. 插入项目 (, "项目 " + 到文本 (i ) + " - " + 长文本 )结束 .子程序尾 |
_超级列表框1_鼠标左键被按下 | 整数型 | | |
横向位置 | 整数型 | | | | 纵向位置 | 整数型 | | | | 功能键状态 | 整数型 | | | |
// 记录鼠标按下时的位置,用于拖动选择 超级列表框1.鼠标按下列 = 超级列表框1. 取鼠标所在列 (横向位置 )超级列表框1.鼠标按下行 = 超级列表框1. 取鼠标所在行 (纵向位置 ).子程序尾 |
_超级列表框1_鼠标移动 | 整数型 | | |
横向位置 | 整数型 | | | | 纵向位置 | 整数型 | | | | 功能键状态 | 整数型 | | | |
.局部变量 当前行, 整数型 // 左键按下时拖动多选 如果 ( (功能键状态 位与 #常量1 ) = #常量1 ) // 检查左键是否按下 当前行 = 超级列表框1. 取鼠标所在行 (纵向位置 )// 如果当前行有效且与按下时的行不同 如果 (当前行 >= 0 且 当前行 != 超级列表框1.鼠标按下行 )// 清除原有选择 超级列表框1. 清空选择 ()// 根据鼠标移动方向选择多行 如果 (当前行 > 超级列表框1.鼠标按下行 )// 向下拖动 循环 (i = 超级列表框1.鼠标按下行; i <= 当前行; i = i + 1 )超级列表框1. 选择项目 (i, 真)结束 否则 // 向上拖动 循环 (i = 当前行; i <= 超级列表框1.鼠标按下行; i = i + 1 )超级列表框1. 选择项目 (i, 真)结束 结束 结束 结束 .子程序尾
// 设置超级列表框属性 超级列表框1.整行选择 = 真 超级列表框1.允许多选 = 真 超级列表框1.扩展选择 = 真 // 添加列,初始宽度设为足够大,或根据需要动态调整 超级列表框1. 插入列 ("内容", 500 )// 启用自绘,以便自定义绘制长文本 超级列表框1.自绘 = 真 // 添加测试数据 添加测试数据 ().子程序尾 .局部变量 i, 整数型 .局部变量 长文本, 文本型 超级列表框1. 清空 ()// 添加带超长文本的项目 长文本 = "这是一个非常长的文本内容,用于测试显示效果,希望它足够长以验证是否会被截断。" + "这个文本可能会很长很长,远远超过列表框的宽度,我们需要确保它能正确显示而不被截断。" + "这里可以添加更多的文字来延长文本长度,测试显示效果..." 循环 (i = 1; i <= 10; i = i + 1 )超级列表框1. 插入项目 (, "项目 " + 到文本 (i ) + " - " + 长文本 )结束 .子程序尾 |
_超级列表框1_自绘项目 | 整数型 | | |
项目索引 | 整数型 | | | | 子项目索引 | 整数型 | | | | 绘制状态 | 整数型 | | | | 区域 | 整数型 | | | | 句柄 | 整数型 | | | |
.局部变量 文本, 文本型 .局部变量 字体, 整数型 .局部变量 文本矩形, 整数型, 传址 .局部变量 显示文本, 文本型 .局部变量 格式, 整数型 // 获取项目文本 文本 = 超级列表框1. 取项目文本 (项目索引, 子项目索引 )// 创建适合显示长文本的字体 字体 = 取字体句柄 ("微软雅黑", 9, 0, 0 )// 设置绘制区域 文本矩形 = 区域 // 长文本不截断显示,使用DT_WORDBREAK格式 格式 = #DT_WORDBREAK + #DT_LEFT + #DT_VCENTER + #DT_SINGLELINE // 绘制文本,自动换行显示长文本 绘制文本 (句柄, 文本, 取文本长度 (文本 ), 文本矩形, 格式, 字体 )// 释放字体资源 释放字体 (字体 ).子程序尾 |
_超级列表框1_鼠标左键被按下 | 整数型 | | |
横向位置 | 整数型 | | | | 纵向位置 | 整数型 | | | | 功能键状态 | 整数型 | | | |
超级列表框1.鼠标按下列 = 超级列表框1. 取鼠标所在列 (横向位置 )超级列表框1.鼠标按下行 = 超级列表框1. 取鼠标所在行 (纵向位置 ).子程序尾 |
_超级列表框1_鼠标移动 | 整数型 | | |
横向位置 | 整数型 | | | | 纵向位置 | 整数型 | | | | 功能键状态 | 整数型 | | | |
.局部变量 当前行, 整数型 如果 ( (功能键状态 位与 #常量1 ) = #常量1 )当前行 = 超级列表框1. 取鼠标所在行 (纵向位置 )如果 (当前行 >= 0 且 当前行 != 超级列表框1.鼠标按下行 )超级列表框1. 清空选择 ()如果 (当前行 > 超级列表框1.鼠标按下行 )循环 (i = 超级列表框1.鼠标按下行; i <= 当前行; i = i + 1 )超级列表框1. 选择项目 (i, 真)结束 否则 循环 (i = 当前行; i <= 超级列表框1.鼠标按下行; i = i + 1 )超级列表框1. 选择项目 (i, 真)结束 结束 结束 结束 .子程序尾
// 基本设置 超级列表框1.整行选择 = 真 超级列表框1.允许多选 = 真 超级列表框1.扩展选择 = 真 超级列表框1.自绘 = 真 // 添加列,宽度设为足够大 超级列表框1. 插入列 ("内容", 800 )// 添加测试数据 添加测试数据 ().子程序尾 .局部变量 i, 整数型 .局部变量 长文本, 文本型 超级列表框1. 清空 ()// 生成超长测试文本 长文本 = "这是一个非常长的文本内容,用于测试显示效果,希望它足够长以验证是否会被截断。" // 重复添加文本以延长长度 循环 (i = 1; i <= 20; i = i + 1 )长文本 = 长文本 + " 这里添加更多的文字来延长文本长度,测试显示效果... " 结束 循环 (i = 1; i <= 5; i = i + 1 )超级列表框1. 插入项目 (, "项目 " + 到文本 (i ) + " - " + 长文本 )结束 .子程序尾 |
_超级列表框1_自绘项目 | 整数型 | | |
项目索引 | 整数型 | | | | 子项目索引 | 整数型 | | | | 绘制状态 | 整数型 | | | | 区域 | 整数型 | | | | 句柄 | 整数型 | | | |
.局部变量 文本, 文本型 .局部变量 字体, 整数型 .局部变量 文本矩形, 整数型, 传址 .局部变量 格式, 整数型 .局部变量 显示区域, 整数型, 传址 .局部变量 行高, 整数型 // 获取项目文本 文本 = 超级列表框1. 取项目文本 (项目索引, 子项目索引 )// 创建字体 字体 = 取字体句柄 ("微软雅黑", 9, 0, 0 )// 设置绘制区域 文本矩形 = 区域 显示区域 = 区域 // 计算文本所需高度,实现自动换行 格式 = #DT_CALCRECT + #DT_WORDBREAK + #DT_LEFT // 先计算文本所需高度 绘制文本 (句柄, 文本, 取文本长度 (文本 ), 文本矩形, 格式, 字体 )行高 = 文本矩形.bottom - 文本矩形.top // 调整项目高度以适应长文本 如果 (行高 > 超级列表框1. 取行高 (项目索引 )) 超级列表框1. 设置行高 (项目索引, 行高 + 10 )结束 // 重新设置绘制区域 显示区域.top = 区域.top 显示区域.bottom = 区域.top + 行高 显示区域.left = 区域.left 显示区域.right = 区域.right // 绘制文本,使用自动换行 格式 = #DT_WORDBREAK + #DT_LEFT + #DT_TOP 绘制文本 (句柄, 文本, 取文本长度 (文本 ), 显示区域, 格式, 字体 )// 释放资源 释放字体 (字体 ).子程序尾 |
_超级列表框1_鼠标左键被按下 | 整数型 | | |
横向位置 | 整数型 | | | | 纵向位置 | 整数型 | | | | 功能键状态 | 整数型 | | | |
超级列表框1.鼠标按下列 = 超级列表框1. 取鼠标所在列 (横向位置 )超级列表框1.鼠标按下行 = 超级列表框1. 取鼠标所在行 (纵向位置 ).子程序尾 |
_超级列表框1_鼠标移动 | 整数型 | | |
横向位置 | 整数型 | | | | 纵向位置 | 整数型 | | | | 功能键状态 | 整数型 | | | |
.局部变量 当前行, 整数型 如果 ( (功能键状态 位与 #常量1 ) = #常量1 )当前行 = 超级列表框1. 取鼠标所在行 (纵向位置 )如果 (当前行 >= 0 且 当前行 != 超级列表框1.鼠标按下行 )超级列表框1. 清空选择 ()如果 (当前行 > 超级列表框1.鼠标按下行 )循环 (i = 超级列表框1.鼠标按下行; i <= 当前行; i = i + 1 )超级列表框1. 选择项目 (i, 真)结束 否则 循环 (i = 当前行; i <= 超级列表框1.鼠标按下行; i = i + 1 )超级列表框1. 选择项目 (i, 真)结束 结束 结束 结束 .子程序尾
|
|