找回密码
 加入
搜索
查看: 5614|回复: 9

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

  [复制链接]
发表于 2012-4-6 05:15:29 | 显示全部楼层 |阅读模式
本帖最后由 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[16][2]
For $i=0 To 15
        $Array[$i][0]=$I
        $Array[$i][1]=$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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×
发表于 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[16][2]
For $i=0 To 15
        $Array[$i][0]=$i
        $Array[$i][1]=$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 编辑

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


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

评分

参与人数 1金钱 +15 收起 理由
koflion + 15 谢谢帮忙

查看全部评分

发表于 2012-4-6 10:18:13 | 显示全部楼层
这个好玩,关注下。
发表于 2012-4-6 13:03:48 | 显示全部楼层
关注下。。。。
 楼主| 发表于 2012-4-6 13:09:53 | 显示全部楼层
读取控件状态,可以使用:


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


我好郁闷,我就是记得有这个函数,要用的时候又找不到了。。无语。。灰常感谢了。。
 楼主| 发表于 2012-4-6 13:13:55 | 显示全部楼层
试试这个:
xiehuahere 发表于 2012-4-6 09:12




非常感谢,其实这个想法之前也有想过,包括隐藏、禁用都是可以实现的,只不过这个测试的目的是想了解下控件叠加后的处理方法,再有就是想知道为什么SetWindowPos会没有效果
发表于 2012-4-6 13:57:11 | 显示全部楼层
回复 7# koflion


    _WinAPI_SetWindowPos 是对窗口的操作,能用于控件吗?
  
控件相对于窗口置顶,用GUICtrlSetState。
GUICtrlSetState ($ListView2, $GUI_SHOW + $GUI_ONTOP)

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

评分

参与人数 1金钱 +15 收起 理由
koflion + 15 谢谢帮忙

查看全部评分

发表于 2012-4-6 15:00:24 | 显示全部楼层
ListView、TAB 之类的最好考虑用子窗口的形式叠加。
 楼主| 发表于 2012-4-6 22:16:55 | 显示全部楼层
ListView、TAB 之类的最好考虑用子窗口的形式叠加。
afan 发表于 2012-4-6 15:00



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

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



_WinAPI_SetWindowPos 是对窗口的操作。。。一语点醒梦中人啊。。。又是不专心的结果。。可以结贴了。。谢谢你
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-11-19 07:46 , Processed in 0.078218 second(s), 25 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表