koflion 发表于 2012-4-6 05:15:29

【已解决】ListView控件重叠如何指定响应,使用SetWindowPos无效

本帖最后由 koflion 于 2012-4-6 22:20 编辑



目的:在input中输入字符后,显示listview2,但是Listview1和2重叠的地方响应的是Listview1的事件,2没反应,不能选择也不能拉动,使用_WinAPI_SetWindowPos置顶也无效,不知道哪里做错了,望指教。

另。。本来if $ZT=-1 想用读取控件状态,如果是隐藏就显示出来,但GUICtrlRead 无法满足这个要求,不知道是不是我没找对。。额。。

望各位赐教,不胜感激!!!

处理办法:
1、使用GUICtrlSetState($ListView1, $GUI_DISABLE) 设置禁用,2控件能正常使用了。感谢:xiehuahere
2、ListView、TAB 之类的最好考虑用子窗口的形式叠加感谢a大。。。都帮小弟好多次了。。。

附测试代码#include <Array.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <Constants.au3>
#include <WinAPI.au3>
#include <ListViewConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Include <GuiListView.au3>

Opt("GUIOnEventMode", 1)
Opt("GUICoordMode", 1)
Global $ZT=-1

$Form = GUICreate("ListView重叠控件响应测试", 276, 272, 194, 137)
GUISetOnEvent($GUI_EVENT_CLOSE, "_CLOSE")
$Label = GUICtrlCreateLabel("搜 索", 65, 9, 68, 20)
GUICtrlSetFont(-1, 12, 400, 0, "宋体")
$Input = GUICtrlCreateInput("", 130, 6, 97, 21)
$H = GUICtrlGetHandle($Input)
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
$ListView1 = GUICtrlCreateListView("", 9, 63, 257, 200)
$ListView2 = GUICtrlCreateListView("A|B", 36, 31, 203, 135)

Dim $Array
For $i=0 To 15
        $Array[$i]=$I
        $Array[$i]=$I+6
Next
_GUICtrlListView_AddArray($ListView2, $Array)
GUICtrlSetState ($ListView2,$GUI_HIDE)


GUISetState(@SW_SHOW)



Func _CLOSE()
        Switch @GUI_CtrlId
                Case $GUI_EVENT_CLOSE
                                Exit
                       
        EndSwitch
EndFunc   ;==>_ZYLOG

Func WM_COMMAND($hWnd, $msg, $wParam, $lParam)
      Local $iCode = BitShift($wParam, 16)      ; get the high word
      Switch $lParam
                Case $H
                        Switch $iCode
                                                        Case $EN_CHANGE
                                                                If $ZT=-1 Then
                                                                GUICtrlSetState ($ListView2,$GUI_SHOW)
                                                                _WinAPI_SetWindowPos($ListView2, $HWND_TOP, 36, 31, 203, 135, $SWP_SHOWWINDOW )
                                                                $ZT=0
                                                                EndIf       
                        EndSwitch
      EndSwitch
      Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND




While 1
       
WEnd

xiehuahere 发表于 2012-4-6 09:12:05

:

本帖最后由 xiehuahere 于 2012-4-6 09:15 编辑

试试这个:#include <Array.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <Constants.au3>
#include <WinAPI.au3>
#include <ListViewConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#Include <GuiListView.au3>

Opt("GUIOnEventMode", 1)
Opt("GUICoordMode", 1)

$Form = GUICreate("ListView重叠控件响应测试", 276, 272, 194, 137)
GUISetOnEvent($GUI_EVENT_CLOSE, "_CLOSE")
$Label = GUICtrlCreateLabel("搜 索", 65, 9, 68, 20)
GUICtrlSetFont(-1, 12, 400, 0, "宋体")
$Input = GUICtrlCreateInput("", 130, 6, 97, 21)
$H = GUICtrlGetHandle($Input)
GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
$ListView1 = GUICtrlCreateListView("", 9, 63, 257, 200)
$ListView2 = GUICtrlCreateListView("A|B", 36, 31, 203, 135)

Dim $Array
For $i=0 To 15
      $Array[$i]=$i
      $Array[$i]=$i+6
Next
_GUICtrlListView_AddArray($ListView2, $Array)
GUICtrlSetState ($ListView2, $GUI_DISABLE + $GUI_HIDE)
GUISetState(@SW_SHOW)

Func _CLOSE()
        Switch @GUI_CtrlId
                Case $GUI_EVENT_CLOSE
                        Exit
                                       
        EndSwitch
EndFunc   ;==>_ZYLOG

Func WM_COMMAND($hWnd, $msg, $wParam, $lParam)
        Local $iCode = BitShift($wParam, 16)      ; get the high word
        Switch $lParam
                Case $H
                        Switch $iCode
                                Case $EN_CHANGE
                                        If BitAND(GUICtrlGetState($ListView2),$GUI_HIDE) And GUICtrlRead($Input) <> "" Then
                                                GUICtrlSetState($ListView1, $GUI_DISABLE)
                                                GUICtrlSetState($ListView2, $GUI_SHOW + $GUI_ENABLE)
                                        EndIf
                                        If BitAND(GUICtrlGetState($ListView2),$GUI_SHOW) And GUICtrlRead($Input) == "" Then                                               
                                                GUICtrlSetState($ListView2, $GUI_DISABLE + $GUI_HIDE)
                                                GUICtrlSetState($ListView1, $GUI_ENABLE)
                                        EndIf
                        EndSwitch
        EndSwitch
        Return $GUI_RUNDEFMSG
EndFunc   ;==>WM_COMMAND

While 1
        Sleep(10)
WEnd

半芯竹 发表于 2012-4-6 09:18:46

本帖最后由 半芯竹 于 2012-4-6 09:20 编辑

读取控件状态,可以使用:
IfGUICtrlGetState($ListView2)=-1 Then
GUICtrlSetState ($ListView2,$GUI_SHOW)                                                                       
EndIf

我修改的现在重叠的,可以选择了,只是还有些问题。。稍等看是否能解决。。。

病毒专收员 发表于 2012-4-6 10:18:13

这个好玩,关注下。

shinco1 发表于 2012-4-6 13:03:48

关注下。。。。

koflion 发表于 2012-4-6 13:09:53

读取控件状态,可以使用:


我修改的现在重叠的,可以选择了,只是还有些问题。。稍等看是否能解决。。 ...
半芯竹 发表于 2012-4-6 09:18 http://www.autoitx.com/images/common/back.gif

我好郁闷,我就是记得有这个函数,要用的时候又找不到了。。无语。。灰常感谢了。。

koflion 发表于 2012-4-6 13:13:55

试试这个:
xiehuahere 发表于 2012-4-6 09:12 http://www.autoitx.com/images/common/back.gif



非常感谢,其实这个想法之前也有想过,包括隐藏、禁用都是可以实现的,只不过这个测试的目的是想了解下控件叠加后的处理方法,再有就是想知道为什么SetWindowPos会没有效果

xiehuahere 发表于 2012-4-6 13:57:11

回复 7# koflion


    _WinAPI_SetWindowPos 是对窗口的操作,能用于控件吗?

控件相对于窗口置顶,用GUICtrlSetState。
GUICtrlSetState ($ListView2, $GUI_SHOW + $GUI_ONTOP)

但不知道为什么这样后,ListView2与ListView1重叠部分还是显示在后面。

afan 发表于 2012-4-6 15:00:24

ListView、TAB 之类的最好考虑用子窗口的形式叠加。

koflion 发表于 2012-4-6 22:16:55

ListView、TAB 之类的最好考虑用子窗口的形式叠加。
afan 发表于 2012-4-6 15:00 http://www.autoitx.com/images/common/back.gif


若主窗口移动的话就需要父窗口和子窗口同时移动。。又麻烦了。。哎。。

看来最简单还是禁用。。。额。。先暂时这样处理吧。。反正能满足要求



_WinAPI_SetWindowPos 是对窗口的操作。。。一语点醒梦中人啊。。。又是不专心的结果。。可以结贴了。。谢谢你
页: [1]
查看完整版本: 【已解决】ListView控件重叠如何指定响应,使用SetWindowPos无效