开源API超级列表框单击选中取消选中
功能说明:该程序是一个用于强制将易语言“超级列表框”控件设置为单选模式(即同一时刻仅允许一个表项被选中)的窗口级拦截控制程序。其核心功能是通过Windows底层消息钩子机制,截获并处理列表框的LVN_ITEMCHANGING通知消息,在用户尝试选择新项目或取消原选择时,主动干预选择状态变更行为,确保任何时候列表框中最多只有一个项目处于选中状态。
程序启动时(__启动窗口_创建完毕子程序),首先在超级列表框中动态插入26个表项(对应ASCII码#A键至#Z键,即字母A–Z),每项标题显示其对应字符的ASCII数值(如第0项为“A”,标题显示“65”)。随后,程序调用API_SetWindowLong将主窗口的消息处理函数(“处理”子程序)设为自定义窗口过程,实现对WM_NOTIFY消息的全局拦截。
关键逻辑位于“处理”子程序:当收到WM_NOTIFY消息且通知码为LVN_ITEMCHANGING、且来源控件为该超级列表框时,程序解析NM_LISTVIEW结构体,提取iItem(操作项索引)、uOldState(原状态标志)和uNewState(新状态标志)。依据选中状态变化规则进行判断:
- 若原状态未选中(位与uOldState与#LVIS_SELECTED为0),则调用select子程序选中该项;
- 若原状态已选中且新状态也拟选中(即用户点击已选项),则调用select子程序取消该项选中(实际触发反选逻辑);
- 其他情况(如取消操作)则放行默认行为。
整个过程中通过BSET变量作为互斥开关,防止递归调用导致死循环。
“select”子程序负责执行实际的选择/取消操作:构造LVITEM结构,设置state字段为#LVIS_SELECTED(选中)或0(取消),stateMask指定仅修改选中状态位,并通过LVM_SETITEMSTATE消息生效;同时调用LVM_SETSELECTIONMARK将选择标记设为当前项索引,辅助视觉反馈与内部状态同步。
综上,本程序并非通用列表框增强组件,而是一个精准解决“超级列表框默认支持多选、缺乏原生单选约束”这一易语言开发常见痛点的轻量级定制方案,适用于需要严格单选语义的配置选择、选项向导、字母索引导航等场景。其技术本质是基于Windows SDK的子类化(Subclassing)与LVN_ITEMCHANGING通知拦截,属于典型的UI行为劫持式控制程序。
======窗口程序集1
| |
| |------ __启动窗口_创建完毕
| |
| |------ 处理
| |
| |------ select
| |
| |
======调用的Dll
| |
| |---[dll]------ API_CallWindowProc
| |
| |---[dll]------ API_SetWindowLong
| |
| |---[dll]------ API_SendMessage
| |
| |---[dll]------ API_SendMessage_LVITEM
| |
| |---[dll]------ API_SendMessage_NMHDR
| |
| |---[dll]------ API_GetDlgCtrlID
| |
| |---[dll]------ API_LocalSize_NMLISTVIEW
| |
| |---[dll]------ API_LocalSize_NMHDR
注:本站源码主要来源于网络收集。如有侵犯您的利益,请联系我们,我们将及时删除!
部分源码可能含有危险代码,(如关机、格式化磁盘等),请看清代码在运行。
由此产生的一切后果本站均不负责。源码仅用于学习使用,如需运用到商业场景请咨询原作者。
使用本站源码开发的产品均与本站无任何关系,请大家遵守国家相关法律。