绿色风's Blog
专注AutoIT(Au3)
  • 首页
  • 流●年
  • 笔●记
    • 学习随记
    • 源码示例
  • 脚●本
    • UDF(收集)
    • 工作室UDF
    • 工具●教程
    • 教程之GDI
  • 作●品
  • 下●载
  • 情怀ExcelTip
3月192015

ListView 单元格实时编辑

作者:绿色风   发布:2015-3-19 2:43 Thursday   分类:   阅读:5167次   评论:1条  
#include <GUIConstantsEx.au3>
#include <ListViewConstants.au3>
#include <WindowsConstants.au3>
#include <GuiListView.au3>
;2011.11.09 by bbs.wglm.net 小A  修改至:yhxhappy 
;[修改] 代码精简,简单易懂
;[增加] 支持回车换行,支持TAB换行.支持多项子项原位修改 
;[增加] 按回车listview跳到最后一行时,自动滚动listview例表
$Form1 = GUICreate("LIST原位编辑支持子项 支持回车换行 by 小A", 1166, 709)
GUISetFont(9, 400, 0, "Arial")
$ListView1 = GUICtrlCreateListView("1|2|3|4|5|6|7", 8, 8, 1153, 697)
GUICtrlSendMsg($ListView1, $LVM_SETEXTENDEDLISTVIEWSTYLE, $LVS_EX_GRIDLINES, $LVS_EX_GRIDLINES);扩展风格
For $i = 0 To 9
        GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, $i, 150)
Next
$label = GUICtrlCreateLabel("", -100, -100,1,1)
Dim $AccelKeys[2][2] = [["{Enter}", $label],["{TAB}", $label]]
GUISetAccelerators($AccelKeys)
GUISetState(@SW_SHOW)

Global $Input, $oIndex = -1, $iIndex = -1, $OSubItem = -1 , $iSubIndex = -1
For $i = 0 To 120
        GUICtrlCreateListViewItem("A" & $i & "|b" & $i & "|C" & $i & "|D" & $i & "|E" & $i & "|F" & $i & "|G" & $i, $ListView1)
Next
;~ MsgBox(0,'', _GUICtrlListView_GetCounterPage($ListView1))
While 1
        $nMsg = GUIGetMsg()
        Switch $nMsg
                Case $GUI_EVENT_CLOSE
                        Exit
                Case $label
                        _Enterkey()
                Case $GUI_EVENT_PRIMARYUP
                        $InputState = ControlCommand($Form1, "", $Input, "IsVisible")
                        $InputText = GUICtrlRead($Input)
                        $Pos = GUIGetCursorInfo($Form1)
                        Local $aHit
                        $aHit = _GUICtrlListView_SubItemHitTest(GUICtrlGetHandle($ListView1))
                        _GUICtrlListView_SetItemSelected($ListView1, $aHit[0], False, False) ;使LV内所有行失去焦点
                        If ($aHit[0] <> -1) And (($aHit[0] <> $iIndex) Or ($aHit[1] <> $iSubIndex)) Then
                                $CPos = ControlGetPos($Form1, "", $ListView1)
                                $xy = _GUICtrlListView_GetSubItemRect($ListView1, $aHit[0], $aHit[1])
                                $text = _GUICtrlListView_GetItemText($ListView1, $aHit[0], $aHit[1]) ;读取所点击单元格的文本
                                If $OSubItem <> $aHit[1] Or $oIndex <> $aHit[0] And $InputState = 1 Then ;如果列或行不与上一次相等,说明点的是新行或新列
                                        _GUICtrlListView_SetItemText($ListView1, $oIndex, $InputText, $OSubItem)
                                        GUICtrlDelete($Input)
                                EndIf
                                If $Pos[4] = $ListView1 Then
                                        $Input = GUICtrlCreateInput($text, $xy[0] + $CPos[0] + 4, $xy[1] + $CPos[1] + 2, _GUICtrlListView_GetColumnWidth($ListView1, $aHit[1]) - 2, $xy[3] - $xy[1]) ;创建一个与单元格差不多大小的输入框
                                        GUICtrlSetState(-1, $GUI_ONTOP + $GUI_FOCUS) ;使输入框具有焦点及置顶
                                        $OSubItem = $aHit[1]
                                        $oIndex = $aHit[0] ;新的项目索引
                                EndIf
                        EndIf
        EndSwitch
WEnd

Func _EnterKey()
        $InputState = ControlCommand($Form1, "", $Input, "IsVisible")
        $InputText = GUICtrlRead($Input)
        If $InputState = 1 Then ;鼠标不在LV上,也不是输入框上,而且输入框存在,则更新单元格数据
                ;                                         项目索引             子项的索引
                _GUICtrlListView_SetItemText($ListView1, $oIndex, $InputText, $OSubItem) ;更改子项文本
                GUICtrlDelete($Input)
                If $oIndex < _GUICtrlListView_GetItemCount($ListView1) - 1 Then _Enter()
        EndIf

EndFunc   ;==>_EnterKey

;按回车自动跳行
Func _Enter()
        $CPos = ControlGetPos($Form1, "", $ListView1)
        $oIndex += 1
        $text = _GUICtrlListView_GetItemText($ListView1, $oIndex, $OSubItem) ;获取子项文本
        If $oIndex >= _GUICtrlListView_GetCounterPage($ListView1) Then ;计算在可视区域中,垂直显示的项目数量.
           _GUICtrlListView_EnsureVisible($ListView1,$oIndex + 1);确保列表视图项目全部或部分可见
        EndIf
    $xy = _GUICtrlListView_GetSubItemRect($ListView1, $oIndex, $OSubItem) ;读取所点击行,第1个单元格的框坐标
        $Input = GUICtrlCreateInput($text, $xy[0] + $CPos[0] + 4, $xy[1] + $CPos[1] + 2, _GUICtrlListView_GetColumnWidth($ListView1, $OSubItem) - 2, $xy[3] - $xy[1]) ;创建一个与单元格差不多大小的输入框
        GUICtrlSetState(-1, $GUI_ONTOP + $GUI_FOCUS) ;使输入框具有焦点及置顶                                                                                                              
EndFunc   ;==>_Enter```



本文固定链接: http://www.jianyiit.com/post-78.html

blogger
该日志由 绿色风 于2015-3-19 2:43 Thursday发表在 分类下。
版权所有:《绿色风's Blog》 → 《ListView 单元格实时编辑》;
除特别标注,本博客很多文章均为原创. 互联分享,尊重版权,转载请以链接形式标明本文地址;
本文标签:

扫描二维码,在手机上阅读
上一篇::AU3音频波谱图
下一篇:程序员才看得懂的

热门文章

相关文章

  • AU3调用乐玩插件COM的方式
  • 检测当前网页,并加载返回JQuery
  • Au3获取任务栏的高度
  • ListView列表视图框中焦点的鼠标事件
  • Au3 的时间戳
评论列表 ↓
呦,果断人中龙凤! Panda      2022-06-15 20:52 @回复
厉害,学习了 ~
取消回复

发表评论

亲,头像对么?

33 + 32 =

提交中,请稍候……


木有头像就木JJ啦!还木有头像吗?点这里申请属于你的个性Gravatar头像吧!


    站点统计
    • 运行时间: 20254 天
    • 日志总数: 365 篇
    • 评论数量: 7238 条
    • 微语数量: 6 条
    • 附件总量: 388 件
  • 逝出的青春

  • 打赏"绿色风"



      扫码关注本站公众号 可搜本站内容

  • Autoit V3 脚本交流群

      常驻群1:905774875
      常驻群2:40672266


  • 链接

    • AU3中文论坛
    • Excel资料库
    • 完美者博客
    • 顺网小哥'S Blog
    • 猛牛哥的博客
    • 网吧系统下载
  • 分类

    • 流●年(66)
    • 笔●记(0)
    • 脚●本(0)
    • 作品(21)
    • 学习随记(51)
    • 源码示例(68)
    • UDF(收集)(26)
    • 工作室UDF(30)
    • 工具●教程(62)
    • 教程之GDI(24)
Copyright © 2013 绿色风's Blog. Powered by emlog. Theme by 射雕天龙. 鄂ICP备2021011689号-1 鄂公网安备42102302000078号 sitemap