找回密码
 加入
搜索
查看: 7381|回复: 32

[图形处理] 【已解决】关于控件重叠且响应鼠标点击的问题讨论!

  [复制链接]
发表于 2016-7-18 09:00:37 | 显示全部楼层 |阅读模式
本帖最后由 水木子 于 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
发表于 2016-7-18 11:44:52 | 显示全部楼层
Windows 程序还真没做过类似的功能。在 JavaScript 中,这些是现成的。。http://blog.csdn.net/iefreer/article/details/8573940

期待大家的实现思路。
发表于 2016-7-18 11:46:53 | 显示全部楼层
注册消息事件,当鼠标点击某个控件时获取其父控件句柄,给其发送某自定义消息。我觉得可以这么干。

评分

参与人数 1金钱 +50 收起 理由
水木子 + 50 谢谢你的思路!

查看全部评分

发表于 2016-7-18 11:56:58 | 显示全部楼层
本帖最后由 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

评分

参与人数 1金钱 +100 收起 理由
水木子 + 100 学习了!谢谢!

查看全部评分

发表于 2016-7-18 12:07:31 | 显示全部楼层
楼主的办法不合适,控件其实就是窗口,它的很多属性是继承父窗口的,当父窗口未激活,控件置顶也会出问题。

而且,用这种办法控件是圆角的时候,多余部分会出现白边。

我的思路是新建子窗口,一种是把Label1放在子窗口上,另一种是把其他控件放在子窗口上,我用的是第二种。

如果对纯API编写窗口了解的话,这些问题就好解决了。
发表于 2016-7-18 12:12:32 | 显示全部楼层
为了对比未删除楼主代码中的其他控件
 楼主| 发表于 2016-7-18 12:25:56 | 显示全部楼层
回复 5# vuivui

不知你有没有发现,Label1 无法响应了。
发表于 2016-7-18 12:37:51 | 显示全部楼层
回复  vuivui

不知你有没有发现,Label1 无法响应了。
水木子 发表于 2016-7-18 12:25



    点其余绿色的地方都弹出的是Label1啊,你指的是什么响应。
发表于 2016-7-18 12:44:35 | 显示全部楼层
是这个意思吗?

本帖子中包含更多资源

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

×
 楼主| 发表于 2016-7-18 12:46:54 | 显示全部楼层
回复 9# vuivui

是这意思,但是我完全复制你的代码,我这里不行。点击没有反应。
发表于 2016-7-18 12:55:10 | 显示全部楼层
$gui2 = GUICreate("其他控件", 400, 300, -1, -1, 0x80000000, 0x00080040, $gui1)
我把子窗口设成父窗口一样大了,你改成小一点试试,比如刚好放下新的三个控件。
你原来那三个控件有响应吗?我这里正常,也不知道怎么改了。
发表于 2016-7-18 12:58:12 | 显示全部楼层
我最先做的就是子窗口跟控件一样大,只有一个控件,这样应该没问题,你测试一下。
可能是版本或者系统的问题。
 楼主| 发表于 2016-7-18 13:33:59 | 显示全部楼层
回复 12# vuivui
嗯!我明白你的意思,我试了,确实是这样,但是子窗口的很多空白区域还是会遮住Label1,其实你这个方法我之前就想过了,不是很适合的样子,谢谢!
发表于 2016-7-18 14:15:06 | 显示全部楼层
一个子窗口一个控件,子窗口大小跟控件大小相等,不会有空白区了。
控件就是特殊窗口,一个控件配一个子窗口,控件不多的情况下应该是可以的。

另外你那里实现不了不知是什么原因,透明窗体我经常用的,没出现过透明层无法响应的情况。你不妨试试其他途径实现子窗口透明。或者修改样式,看鼠标穿透有什么问题。

还有个办法就是Label1用API直接编写,作为其他控件的父窗口。
 楼主| 发表于 2016-7-18 14:30:44 | 显示全部楼层
回复 14# vuivui

一个控件一个子窗口,这个我倒是想过,感觉太繁琐了,想弄个简单直接点的方法,因为控件会非常多。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-19 13:00 , Processed in 0.080032 second(s), 24 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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