AutoIt3 子类化随笔

关于Au3编程中使用子类化处理ListView+Combobox原地编辑的一点随笔:

Source Code:

#include <GuiListView.au3>
#include <GuiComboBox.au3>
#include <WinAPI.au3>

Global $hGUI, $g_ListView, $g_Combo, $g_Item, $hOldC
Opt("GUIOnEventMode", 1)
_CreateGUI()

While 1
        Sleep(100)
WEnd

Func _CreateGUI()
        $hGUI = GUICreate("ListViewClass", 600, 300, -1, -1)
        GUISetOnEvent(-3, "_Exit")
        $g_Combo = GUICtrlCreateCombo('', -100, -100)
        GUICtrlSetFont(-1,11)
        $g_ListView = GUICtrlCreateListView("", 60, 50, 480, 200, -1, 0x00000221)
        For $i = 1 To 5
                _GUICtrlListView_AddColumn(-1, "col1", 80)
        Next
        For $i = 0 To 9
                _GUICtrlListView_AddItem($g_ListView, "Item" & $i)
                For $j = 1 To 4
                        _GUICtrlListView_AddSubItem($g_ListView, $i, "SubItem" & $j, $j)
                Next
        Next

        $hCall = DllCallbackRegister("_ListViewProc", "ptr", "hWnd;uint;wparam;lparam")
        $hOldC = _WinAPI_SetWindowLong(GUICtrlGetHandle($g_ListView), -4, DllCallbackGetPtr($hCall))
        GUISetState(@SW_SHOW)
EndFunc   ;==>_CreateGUI

Func _Exit()
        Exit
EndFunc   ;==>_Exit

Func _ListViewProc($hWnd, $iMsg, $wparam, $lparam)
        Switch $iMsg
                Case 0x0203
                        $iX = BitAND($lparam, 0xFFFF)
                        $iY = BitShift($lparam, 16)
                        $tLVHITTESTINFO = DllStructCreate("int X;int Y;uint Flags;int Item;int SubItem")
                        DllStructSetData($tLVHITTESTINFO, "X", $iX)
                        DllStructSetData($tLVHITTESTINFO, "Y", $iY)
                        _SendMessage($hWnd, $LVM_SUBITEMHITTEST, 0, DllStructGetPtr($tLVHITTESTINFO))
                        Dim $g_Item[2]
                        $g_Item[0] = DllStructGetData($tLVHITTESTINFO, "Item")
                        $g_Item[1] = DllStructGetData($tLVHITTESTINFO, "SubItem")
                        $aRect = _GUICtrlListView_GetSubItemRect($g_ListView, $g_Item[0], $g_Item[1])
                        $aPos = ControlGetPos($hGUI, "", $g_ListView)
                        $sData = _GUICtrlListView_GetItemText($g_ListView, $g_Item[0], $g_Item[1])
                        _WinAPI_SetParent(GUICtrlGetHandle($g_Combo), $g_ListView)
                        _WinAPI_BringWindowToTop(GUICtrlGetHandle($g_Combo))
                        GUICtrlSetPos($g_Combo, $aPos[0] + $aRect[0] +5, $aPos[1] + $aRect[1] + 3, _GUICtrlListView_GetColumnWidth($g_ListView, $g_Item[1]))
                        GUICtrlSetData($g_Combo,"")
                        _GUICtrlComboBox_AddString($g_Combo,"添加")
                        _GUICtrlComboBox_SetEditText($g_Combo, $sData)
                Case 0x0201
                        If IsArray($g_Item) Then _UdpData()

        EndSwitch
        Return _WinAPI_CallWindowProc($hOldC, $hWnd, $iMsg, $wparam, $lparam)
EndFunc   ;==>_ListViewProc

Func _UdpData()
        If Not IsArray($g_Item) Then Return
        _GUICtrlListView_SetItemText($g_ListView, $g_Item[0], GUICtrlRead($g_Combo), $g_Item[1])
        GUICtrlSetPos($g_Combo, -1000, -100)
        GUICtrlSetData($g_Combo, "")
        Dim $g_Item = 0
EndFunc   ;==>_UdpData

朋友redapple2008优化:

#include <GuiListView.au3>
#include <GuiComboBox.au3>
#include <WinAPI.au3>

Global $hGUI, $g_ListView, $g_Combo, $g_Item, $hOldC
Global $g_bComboVisible = False ; 添加组合框可见状态跟踪
Opt("GUIOnEventMode", 1)
_CreateGUI()

While 1
        Sleep(100)
WEnd

Func _CreateGUI()
        $hGUI = GUICreate("ListViewClass", 600, 300, -1, -1)
        GUISetOnEvent(-3, "_Exit")
        $g_Combo = GUICtrlCreateCombo('', -100, -100)
        GUICtrlSetFont(-1,11)
        $g_ListView = GUICtrlCreateListView("", 60, 50, 480, 200, -1, 0x00000221)
        For $i = 1 To 5
                _GUICtrlListView_AddColumn(-1, "col1", 80)
        Next
        For $i = 0 To 9
                _GUICtrlListView_AddItem($g_ListView, "Item" & $i)
                For $j = 1 To 4
                        _GUICtrlListView_AddSubItem($g_ListView, $i, "SubItem" & $j, $j)
                Next
        Next

        $hCall = DllCallbackRegister("_ListViewProc", "ptr", "hWnd;uint;wparam;lparam")
        $hOldC = _WinAPI_SetWindowLong(GUICtrlGetHandle($g_ListView), -4, DllCallbackGetPtr($hCall))
        GUISetState(@SW_SHOW)
EndFunc   ;==>_CreateGUI

Func _Exit()
        Exit
EndFunc   ;==>_Exit

Func _ListViewProc($hWnd, $iMsg, $wparam, $lparam)
        Switch $iMsg
                Case 0x0203 ; WM_LBUTTONDBLCLK
                        $iX = BitAND($lparam, 0xFFFF)
                        $iY = BitShift($lparam, 16)
                        $tLVHITTESTINFO = DllStructCreate("int X;int Y;uint Flags;int Item;int SubItem")
                        DllStructSetData($tLVHITTESTINFO, "X", $iX)
                        DllStructSetData($tLVHITTESTINFO, "Y", $iY)
                        _SendMessage($hWnd, $LVM_SUBITEMHITTEST, 0, DllStructGetPtr($tLVHITTESTINFO))
                        Dim $g_Item[2]
                        $g_Item[0] = DllStructGetData($tLVHITTESTINFO, "Item")
                        $g_Item[1] = DllStructGetData($tLVHITTESTINFO, "SubItem")
                        $aRect = _GUICtrlListView_GetSubItemRect($g_ListView, $g_Item[0], $g_Item[1])
                        $aPos = ControlGetPos($hGUI, "", $g_ListView)
                        $sData = _GUICtrlListView_GetItemText($g_ListView, $g_Item[0], $g_Item[1])
                        _WinAPI_SetParent(GUICtrlGetHandle($g_Combo), $g_ListView)
                        _WinAPI_BringWindowToTop(GUICtrlGetHandle($g_Combo))
                        GUICtrlSetPos($g_Combo, $aPos[0] + $aRect[0] +5, $aPos[1] + $aRect[1] + 3, _GUICtrlListView_GetColumnWidth($g_ListView, $g_Item[1]))
                        GUICtrlSetData($g_Combo,"")
                        _GUICtrlComboBox_AddString($g_Combo,"添加")
                        _GUICtrlComboBox_SetEditText($g_Combo, $sData)
                        $g_bComboVisible = True ; 标记组合框可见
                        
                Case 0x0201 ; WM_LBUTTONDOWN
                        If $g_bComboVisible Then
                            ; 检查点击位置是否在组合框内
                            Local $hCombo = GUICtrlGetHandle($g_Combo)
                            Local $aComboPos = WinGetPos($hCombo)
                            Local $tPoint = DllStructCreate("int X;int Y")
                            DllStructSetData($tPoint, "X", BitAND($lparam, 0xFFFF))
                            DllStructSetData($tPoint, "Y", BitShift($lparam, 16))
                            _WinAPI_ClientToScreen($hWnd, $tPoint)
                            Local $iX = DllStructGetData($tPoint, "X")
                            Local $iY = DllStructGetData($tPoint, "Y")
                            
                            If $iX < $aComboPos[0] Or $iX > $aComboPos[0] + $aComboPos[2] Or _
                               $iY < $aComboPos[1] Or $iY > $aComboPos[1] + $aComboPos[3] Then
                                _UdpData()
                            EndIf
                        EndIf
                        
                Case 0x0100 ; WM_KEYDOWN - 添加键盘支持
                        If $g_bComboVisible And $wParam = 0x0D Then ; 回车键
                            _UdpData()
                        EndIf
                        
        EndSwitch
        Return _WinAPI_CallWindowProc($hOldC, $hWnd, $iMsg, $wparam, $lparam)
EndFunc   ;==>_ListViewProc

Func _UdpData()
        If Not IsArray($g_Item) Then Return
        _GUICtrlListView_SetItemText($g_ListView, $g_Item[0], GUICtrlRead($g_Combo), $g_Item[1])
        GUICtrlSetPos($g_Combo, -1000, -100)
        GUICtrlSetData($g_Combo, "")
        Dim $g_Item = 0
        $g_bComboVisible = False ; 重置组合框可见状态
EndFunc   ;==>_UdpData

下载方式:https://pan.quark.cn/s/c9b9b647468b ### 初级JSP程序设计教程核心内容解析#### 一、JSP基础概述JSP(JavaServer Pages)是由Sun Microsystems公司创建的一种动态网页技术规范,主要应用于构建动态网站及Web应用。JSP技术使得开发者能够将动态数据与静态HTML文档整合,从而实现网页内容的灵活性和可变性。##### JSP的显著特性:1. **动态与静态内容的分离**:JSP技术支持将动态数据(例如数据库查询结果、实时时间等)嵌入到静态HTML文档中。这种设计方法增强了网页的适应性和可维护性。2. **易用性**:开发者可以利用常规的HTML编辑工具来编写静态部分,并通过简的标签技术将动态内容集成到页面中。3. **跨平台兼容性**:基于Java平台的JSP具有优良的跨操作系统运行能力,能够在多种不同的系统环境中稳定工作。4. **强大的后台支持**:JSP能够通过JavaBean组件访问后端数据库及其他资源,以实现复杂的数据处理逻辑。5. **执行效率高**:JSP页面在初次被请求时会被转换为Servlet,随后的请求可以直接执行编译后的Servlet代码,从而提升了服务响应的效率。#### 二、JSP指令的运用JSP指令用于设定整个JSP页面的行为规范。这些指令通常放置在页面的顶部,向JSP容器提供处理页面的相关指导信息。##### 主要的指令类型:1. **Page指令**: - **语法结构**:`<%@ page attribute="value" %>` - **功能**:定义整个JSP页面的运行特性,如设定页面编码格式、错误处理机制等。 - **实例**: ...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值