找回密码
 加入
搜索
查看: 14174|回复: 23

[GUI管理] [已解决]WinAPI_SetLayeredWindowAttributes 后透明LISTVIEW的点击问题(色值设置)

  [复制链接]
发表于 2011-7-23 13:27:07 | 显示全部楼层 |阅读模式
本帖最后由 powerofos 于 2011-7-29 21:12 编辑

出于使 listview 控件背景透明的目的,使用了_WinAPI_SetLayeredWindowAttributes ,

listview 背景色 和 GUI背景色 设为统一, 目的是达到了,但发现透明背景的 listview点击,

受限于“透明色”,也就是我设置的背景色。


经测试,R = G = B 时(PHOTOSHOP中的灰度??),透明的 listview 点击受限,只有点中

内容中文字时才生效。

当我微调颜色, 打个比方:R = 254, G = 254, B = 253,使用这类R,G,B值相近的颜色来

设置 GUI 和 listview 的背景色时,情况是有时点击有效(能点击透明处),有时点击受限。


对于_WinAPI_SetLayeredWindowAttributes  函数不了解,为什么会出现这类问题呢??


请参考例子脚本:
#AutoIt3Wrapper_au3check_parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)


Global $listview, $hWndListView, $GUI, $hgui, $iIndex = -1


;========================================================== ; 【测试值在此】
Global $BKColor = 0xABCDEF
;~ Global $BKColor = 0xABABAB  ; 纯 灰度 色值   , R = G = B


;==========================================================

_Main()

Func _Main()

        $hgui = GUICreate("ListView Hit Test", 600, 400)
        GUISetBkColor(0x00ff00)
        
        $GUI = GUICreate("ListView Hit Test", 400, 300,-1,-1,$WS_POPUP,BitOR($WS_EX_LAYERED,$WS_EX_MDICHILD),$hgui)
        
        GUISetBkColor($BKColor)
        
        
        $ListView = GUICtrlCreateListView("", 2, 10, 394, 248)
        GUIctrlSetBkColor(-1,$BKColor)
        $hWndListView = GUICtrlGetHandle($ListView)
        _GUICtrlListView_SetExtendedListViewStyle($hWndListView, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
        
                ; Add columns
        _GUICtrlListView_AddColumn($ListView, "Column 1", 100)
        _GUICtrlListView_AddColumn($ListView, "Column 2", 100)
        _GUICtrlListView_AddColumn($ListView, "Column 3", 100)
        
        
        GUICtrlCreateListViewItem("1|ITEM|C:",$listview)
        GUICtrlCreateListViewItem("1|ITEM|C:",$listview)
        GUICtrlCreateListViewItem("1|ITEM|C:",$listview)
        GUICtrlCreateListViewItem("1|ITEM|C:",$listview)
        GUICtrlCreateListViewItem("1|ITEM|C:",$listview)
        GUICtrlCreateListViewItem("1|ITEM|C:",$listview)
        GUICtrlCreateListViewItem("1|ITEM|C:",$listview)
        GUICtrlCreateListViewItem("1|ITEM|C:",$listview)
        GUICtrlCreateListViewItem("1|ITEM|C:",$listview)
        GUICtrlCreateListViewItem("1|ITEM|C:",$listview)
        
        
        

    _WinAPI_SetLayeredWindowAttributes($GUI, $BKColor, 255)
        
        GUISetState(@SW_SHOW,$gui)
        GUISetState(@SW_SHOW,$hgui)
        
;~         GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

        ; Loop until user exits
        While 1
                Switch GUIGetMsg()
                        Case $GUI_EVENT_CLOSE
                                ExitLoop
                EndSwitch
        WEnd
EndFunc   ;==>_Main
补充一下: 为何我要去了解这个问题? 设置成能点击的颜色不就成了吗? 是这样的, 由于listview背景透明后,列表内容中文字的颜色 也相应
受到“透明色”影响
, 为了使透明背景后的列表文字与背景(我有个背景层图片)产生对比,我需要调整文字颜色(单单使用guictrlsetcolor不完美),
让人容易清楚看见。
呵呵,纯属自虐,又要透明,又要反差...


本帖子中包含更多资源

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

×
发表于 2011-7-23 13:53:45 | 显示全部楼层
56行改为这句试试:
_WinAPI_SetLayeredWindowAttributes($GUI, 0x32efcdab, 255,0x01,True)
 楼主| 发表于 2011-7-23 13:58:12 | 显示全部楼层
本帖最后由 powerofos 于 2011-7-23 14:00 编辑

初步测试成功达到目的。

能解释下吗? 从你提供的这行,我是不是可以理解为不受“透明色”的限制呢? 参数4 如何理解?
 楼主| 发表于 2011-7-23 14:03:31 | 显示全部楼层
56行改为这句试试:
_WinAPI_SetLayeredWindowAttributes($GUI, 0x32efcdab, 255,0x01,True)
3mile 发表于 2011-7-23 13:53



初步测试成功达到目的。

能解释下吗? 从你提供的这行,我是不是可以理解为不受“透明色”的限制呢? 参数4 如何理解?
 楼主| 发表于 2011-7-23 14:12:21 | 显示全部楼层
本帖最后由 powerofos 于 2011-7-23 14:15 编辑

高兴得早了些:



0XABCDEF使用你提供的这行是成功的,我换了下其他的颜色,也是不一定成功的,

是不是RGB 颜色模式的问题?

感谢3mile,希望得到你对这问题的解释。

本帖子中包含更多资源

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

×
发表于 2011-7-23 14:50:31 | 显示全部楼层
我的语言表达能力有限,还是上代码解释吧.
根据_WinAPI_SetLayeredWindowAttributes函数原型可知使用的是ABGR颜色
#AutoIt3Wrapper_au3check_parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#include <GuiConstantsEx.au3>
#include <GuiListView.au3>
#include <WindowsConstants.au3>

Opt('MustDeclareVars', 1)


Global $listview, $hWndListView, $GUI, $hgui, $iIndex = -1


;========================================================== ; 【测试值在此】
Global $BKColor = 0xFF0000
;~ Global $BKColor = 0xABABAB  ; 纯 灰度 色值   , R = G = B


;==========================================================
;~ _SetLayered(0xABCDEF)
_Main()

Func _Main()

        $hgui = GUICreate("ListView Hit Test", 600, 400)
        GUISetBkColor(0x00ffFF)
        
        $GUI = GUICreate("ListView Hit Test", 400, 300,-1,-1,$WS_POPUP,BitOR($WS_EX_LAYERED,$WS_EX_MDICHILD),$hgui)
        
        GUISetBkColor($BKColor)
        
        
        $ListView = GUICtrlCreateListView("", 2, 10, 394, 248)
        GUIctrlSetBkColor(-1,$BKColor)
        $hWndListView = GUICtrlGetHandle($ListView)
        _GUICtrlListView_SetExtendedListViewStyle($hWndListView, BitOR($LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES))
        
                ; Add columns
        _GUICtrlListView_AddColumn($ListView, "Column 1", 100)
        _GUICtrlListView_AddColumn($ListView, "Column 2", 100)
        _GUICtrlListView_AddColumn($ListView, "Column 3", 100)
        
        
        GUICtrlCreateListViewItem("1|ITEM|C:\",$listview)
        GUICtrlCreateListViewItem("1|ITEM|C:\",$listview)
        GUICtrlCreateListViewItem("1|ITEM|C:\",$listview)
        GUICtrlCreateListViewItem("1|ITEM|C:\",$listview)
        GUICtrlCreateListViewItem("1|ITEM|C:\",$listview)
        GUICtrlCreateListViewItem("1|ITEM|C:\",$listview)
        GUICtrlCreateListViewItem("1|ITEM|C:\",$listview)
        GUICtrlCreateListViewItem("1|ITEM|C:\",$listview)
        GUICtrlCreateListViewItem("1|ITEM|C:\",$listview)
        GUICtrlCreateListViewItem("1|ITEM|C:\",$listview)
        
        
        

    _WinAPI_SetLayeredWindowAttributes($GUI, _SetLayered($BKColor), 255,0x03,True)
        
        GUISetState(@SW_SHOW,$gui)
        GUISetState(@SW_SHOW,$hgui)
        
;~         GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")

        ; Loop until user exits
        While 1
                Switch GUIGetMsg()
                        Case $GUI_EVENT_CLOSE
                                ExitLoop
                EndSwitch
        WEnd
EndFunc   ;==>_Main
        
Func _SetLayered($Rgb2Bgr)
        $Rgb2Bgr = Hex(String($Rgb2Bgr), 6)
        $Rgb2Bgr = Execute('0x32' & StringMid($Rgb2Bgr, 5, 2) & StringMid($Rgb2Bgr, 3, 2) & StringMid($Rgb2Bgr, 1, 2))
        Return $Rgb2Bgr
EndFunc

评分

参与人数 1贡献 +5 收起 理由
lynfr8 + 5

查看全部评分

 楼主| 发表于 2011-7-23 15:00:10 | 显示全部楼层
呵呵,看到3mile 的回复了,先不看,先回复。

请看下面的链接:

http://www.autoitx.com/forum.php ... B8%C3%F7&page=1

不知道我对贴主的理解有没有错,他要的效果,和我是一样的,因为我也在我的GUI上 添加了 EDIT ,INPUT 控件,

同理,对这些控件设置背景色后,是可以透明的,但是设置的背景色是有考究的,设置错误后,虽然同样是能达到

背景透明的效果,但是却不能回去鼠标点击的信息,edit 和 input 控件为例,就是获取不了输入焦点,

listview的话就是不能点击项目。

OK,现在去看3mile的解答。
 楼主| 发表于 2011-7-23 15:48:57 | 显示全部楼层
本帖最后由 powerofos 于 2011-7-23 15:50 编辑

回复 6# 3mile


_WinAPI_GetLayeredWindowAttributes 是通过参数5控制 颜色模式的吧?

如参数5为true,则使用 AGBR, 为false,则使用RGB,

我不了解,使用AGBR,多了一个 ALPHA 通道,对于我这个问题,能产生什么影响。

而我测试你提供的代码,也达不到随意使用“背景色”的效果,0XABABAB就无效。

因为长期使用的RGB模式,习惯了......

有点“肉送到嘴边都不会吃”的感觉,惭愧惭愧。
发表于 2011-7-23 16:19:17 | 显示全部楼层
用0XABABAB不透明吗?
还是无法点击?
看下MSDN的社区内容吧.
http://msdn.microsoft.com/en-us/library/ms633540%28VS.85%29.aspx
发表于 2011-7-23 19:35:32 | 显示全部楼层

也来测试下..........
 楼主| 发表于 2011-7-23 22:34:41 | 显示全部楼层
回复 9# 3mile


刚外出了,抱歉

0XABABAB作背景色,能透明,但无法点击透明区域。

感谢3mile提供的链接。
 楼主| 发表于 2011-7-23 22:51:23 | 显示全部楼层
补充一下,用某些颜色是既能使LISTVIEW背景透明,也能兼顾点击某项目中透明区域的,即能选中项目。

我为此努力是想弄明白为何是只有某些颜色能达到,或者说有方法能帮助我规避无效颜色。

点选如下图效果:

本帖子中包含更多资源

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

×
发表于 2011-7-23 23:25:52 | 显示全部楼层
回复 12# powerofos
子窗体以及子窗体控件的背景色主要是为了分层,也就是说这个背景色是会过滤掉的,所以以个人的观点来看设置成纯色会比较好,其中又以0X00FF00,也就是绿色是最不容易出错的.不管RGB还是BGR绿色的位置是不会变化的.
另外主窗体的背景图片是可以用GDI+画上去的,可以在HDC上面作二次修改,比如直接增加文本.这样虽然多付出了一点效率.

但我发现有一个问题.当点击子窗体或LISTVIEW时,因为焦点在子窗体上,所以主窗体的标题栏还是很难看的.尝试过很多次也没有办法解决.

本帖子中包含更多资源

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

×

评分

参与人数 1贡献 +3 收起 理由
lynfr8 + 3

查看全部评分

 楼主| 发表于 2011-7-24 00:22:01 | 显示全部楼层
本帖最后由 powerofos 于 2011-7-24 08:49 编辑

回复 13# 3mile


哈哈,3mile,我俩想法越来越“接近”了,因为你以上提到的GDI+画背景,正是我使用的方法。

而且,你提到的标题栏问题,却恰恰是我之前努力去KILL掉的,我不需要标题栏,我的标题栏是伪做的。

我是这样写的:

首层: 样式:BitOR($WS_POPUP,$WS_CAPTION), _WinAPI_DwmExtendFrameIntoClientArea,客户区全填上玻璃效果,无控件。

次层:GDI+ 画背景图片层,弹出式 + 内嵌 +设置父句柄,调整大小以符合首层,圆角

再次层:

再次层:

。。。。。。

我觉得,这方法不太高明....

再谈及listview背景透明问题,很遗憾你也暂无办法....

评分

参与人数 1金钱 +20 收起 理由
lynfr8 + 20

查看全部评分

发表于 2011-7-24 12:19:17 | 显示全部楼层
回复 14# powerofos
如果用弹出窗体的话,很好奇你的窗体最小化,窗体还原以及窗体关闭这几个图标是那里去找来的?
能共享下吗?
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-6-1 09:11 , Processed in 0.086776 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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