【已解决】关于控件重叠且响应鼠标点击的问题讨论!
本帖最后由 水木子 于 2016-7-20 12:45 编辑我要的效果是控件 $Label1 以及在他上面创建的其他控件都能响应鼠标点击。
通常我们的做法是禁用$Label1,但是这样一来$Label1自身却无法响应点击。
我尝试了给其他控件添加状态 GUICtrlSetState(-1, $GUI_SHOW + $GUI_ONTOP)
虽然有点效果,但是控件显示却有问题,比如文本控件无法显示,按钮、复选框等控件显示异常等情况!
不知大家有没有更好的方法,望指点,谢谢!
问题示范代码如下:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
GUICreate('', 400, 300)
$Label1 = GUICtrlCreateLabel('Label1', 10, 10, 380, 280, $WS_BORDER)
GUICtrlSetBkColor(-1, 0xC0DCC0)
$Label2 = GUICtrlCreateLabel('Label2', 150, 50, 100, 30, 0x01 + 0x0200 + $WS_BORDER)
GUICtrlSetCursor(-1, 0)
GUICtrlSetState(-1, $GUI_SHOW + $GUI_ONTOP)
GUICtrlCreateLabel('Label2', 150, 50, 100, 30, 0x01 + 0x0200 + $WS_BORDER)
$Button1 = GUICtrlCreateButton('Button1', 150, 120, 100, 30)
GUICtrlSetState(-1, $GUI_SHOW + $GUI_ONTOP)
$Checkbox1 = GUICtrlCreateCheckbox('Checkbox1', 150, 190, 100, 30)
;~ GUICtrlSetState (-1, $GUI_SHOW + $GUI_ONTOP)
GUISetState()
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
Case $Label1
MsgBox(0, 'Label1', 'CtrlID = ' & $nMsg)
Case $Label2
MsgBox(0, 'Label2', 'CtrlID = ' & $nMsg)
Case $Button1
MsgBox(0, 'Button1', 'CtrlID = ' & $nMsg)
Case $Checkbox1
MsgBox(0, 'Checkbox1', 'CtrlID = ' & $nMsg)
EndSwitch
WEnd
Windows 程序还真没做过类似的功能。在 JavaScript 中,这些是现成的。。http://blog.csdn.net/iefreer/article/details/8573940
期待大家的实现思路。 注册消息事件,当鼠标点击某个控件时获取其父控件句柄,给其发送某自定义消息。我觉得可以这么干。 本帖最后由 vuivui 于 2016-7-18 12:09 编辑
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$gui1=GUICreate('', 400, 300)
$Label1 = GUICtrlCreateLabel('Label1', 10, 10, 380, 280, $WS_BORDER)
GUICtrlSetBkColor(-1, 0xC0DCC0)
$Label2 = GUICtrlCreateLabel('Label2', 150, 50, 100, 30, 0x01 + 0x0200 + $WS_BORDER)
GUICtrlSetCursor(-1, 0)
GUICtrlSetState(-1, $GUI_SHOW + $GUI_ONTOP)
GUICtrlCreateLabel('Label2', 150, 50, 100, 30, 0x01 + 0x0200 + $WS_BORDER)
$Button1 = GUICtrlCreateButton('Button1', 150, 120, 100, 30)
GUICtrlSetState(-1, $GUI_SHOW + $GUI_ONTOP)
$Checkbox1 = GUICtrlCreateCheckbox('Checkbox1', 150, 190, 100, 30)
;~ GUICtrlSetState (-1, $GUI_SHOW + $GUI_ONTOP)
GUISetState()
$gui2 = GUICreate("其他控件", 400, 300, -1, -1, 0x80000000, 0x00080040, $gui1)
$Label3 = GUICtrlCreateLabel('Label3', 40, 60, 100, 30)
GUICtrlSetBkColor(-1, 0xC0DCC0)
$Button2 = GUICtrlCreateButton('Button2', -1, 120, 100, 30)
$Checkbox2 = GUICtrlCreateCheckbox('Checkbox2', -1, 190, 100, 30)
GUICtrlSetBkColor(-1, 0xC0DCC0)
GUISetBkColor(0xFFFFFE)
$tms = 0xFFFFFE
$tms = Int(BinaryMid($tms, 3, 1) & BinaryMid($tms, 2, 1) & BinaryMid($tms, 1, 1))
DllCall("user32.dll", "bool", "SetLayeredWindowAttributes", "hwnd", $gui2, "dword", $tms, "byte", 0, "dword", 1)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case -3
Exit
Case $Label1
MsgBox(0, 'Label1', 'CtrlID = ' & $nMsg)
Case $Label2
MsgBox(0, 'Label2', 'CtrlID = ' & $nMsg)
Case $Button1
MsgBox(0, 'Button1', 'CtrlID = ' & $nMsg)
Case $Checkbox1
MsgBox(0, 'Checkbox1', 'CtrlID = ' & $nMsg)
Case $Label3
MsgBox(0, 'Label3', 'CtrlID = ' & $nMsg)
Case $Button2
MsgBox(0, 'Button2', 'CtrlID = ' & $nMsg)
Case $Checkbox2
MsgBox(0, 'Checkbox2', 'CtrlID = ' & $nMsg)
EndSwitch
WEnd 楼主的办法不合适,控件其实就是窗口,它的很多属性是继承父窗口的,当父窗口未激活,控件置顶也会出问题。
而且,用这种办法控件是圆角的时候,多余部分会出现白边。
我的思路是新建子窗口,一种是把Label1放在子窗口上,另一种是把其他控件放在子窗口上,我用的是第二种。
如果对纯API编写窗口了解的话,这些问题就好解决了。 为了对比未删除楼主代码中的其他控件 回复 5# vuivui
不知你有没有发现,Label1 无法响应了。 回复vuivui
不知你有没有发现,Label1 无法响应了。
水木子 发表于 2016-7-18 12:25 http://www.autoitx.com/images/common/back.gif
点其余绿色的地方都弹出的是Label1啊,你指的是什么响应。 是这个意思吗? 回复 9# vuivui
是这意思,但是我完全复制你的代码,我这里不行。点击没有反应。 $gui2 = GUICreate("其他控件", 400, 300, -1, -1, 0x80000000, 0x00080040, $gui1)
我把子窗口设成父窗口一样大了,你改成小一点试试,比如刚好放下新的三个控件。
你原来那三个控件有响应吗?我这里正常,也不知道怎么改了。 我最先做的就是子窗口跟控件一样大,只有一个控件,这样应该没问题,你测试一下。
可能是版本或者系统的问题。 回复 12# vuivui
嗯!我明白你的意思,我试了,确实是这样,但是子窗口的很多空白区域还是会遮住Label1,其实你这个方法我之前就想过了,不是很适合的样子,谢谢! 一个子窗口一个控件,子窗口大小跟控件大小相等,不会有空白区了。
控件就是特殊窗口,一个控件配一个子窗口,控件不多的情况下应该是可以的。
另外你那里实现不了不知是什么原因,透明窗体我经常用的,没出现过透明层无法响应的情况。你不妨试试其他途径实现子窗口透明。或者修改样式,看鼠标穿透有什么问题。
还有个办法就是Label1用API直接编写,作为其他控件的父窗口。 回复 14# vuivui
一个控件一个子窗口,这个我倒是想过,感觉太繁琐了,想弄个简单直接点的方法,因为控件会非常多。