【已解决】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: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:20 编辑
读取控件状态,可以使用:
IfGUICtrlGetState($ListView2)=-1 Then
GUICtrlSetState ($ListView2,$GUI_SHOW)
EndIf
我修改的现在重叠的,可以选择了,只是还有些问题。。稍等看是否能解决。。。 这个好玩,关注下。 关注下。。。。 读取控件状态,可以使用:
我修改的现在重叠的,可以选择了,只是还有些问题。。稍等看是否能解决。。 ...
半芯竹 发表于 2012-4-6 09:18 http://www.autoitx.com/images/common/back.gif
我好郁闷,我就是记得有这个函数,要用的时候又找不到了。。无语。。灰常感谢了。。 试试这个:
xiehuahere 发表于 2012-4-6 09:12 http://www.autoitx.com/images/common/back.gif
非常感谢,其实这个想法之前也有想过,包括隐藏、禁用都是可以实现的,只不过这个测试的目的是想了解下控件叠加后的处理方法,再有就是想知道为什么SetWindowPos会没有效果 回复 7# koflion
_WinAPI_SetWindowPos 是对窗口的操作,能用于控件吗?
控件相对于窗口置顶,用GUICtrlSetState。
GUICtrlSetState ($ListView2, $GUI_SHOW + $GUI_ONTOP)
但不知道为什么这样后,ListView2与ListView1重叠部分还是显示在后面。 ListView、TAB 之类的最好考虑用子窗口的形式叠加。 ListView、TAB 之类的最好考虑用子窗口的形式叠加。
afan 发表于 2012-4-6 15:00 http://www.autoitx.com/images/common/back.gif
若主窗口移动的话就需要父窗口和子窗口同时移动。。又麻烦了。。哎。。
看来最简单还是禁用。。。额。。先暂时这样处理吧。。反正能满足要求
_WinAPI_SetWindowPos 是对窗口的操作。。。一语点醒梦中人啊。。。又是不专心的结果。。可以结贴了。。谢谢你
页:
[1]