[已解决]WinAPI_SetLayeredWindowAttributes 后透明LISTVIEW的点击问题(色值设置)
本帖最后由 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不完美),
让人容易清楚看见。
呵呵,纯属自虐,又要透明,又要反差...
56行改为这句试试:
_WinAPI_SetLayeredWindowAttributes($GUI, 0x32efcdab, 255,0x01,True) 本帖最后由 powerofos 于 2011-7-23 14:00 编辑
初步测试成功达到目的。
能解释下吗? 从你提供的这行,我是不是可以理解为不受“透明色”的限制呢? 参数4 如何理解? 56行改为这句试试:
_WinAPI_SetLayeredWindowAttributes($GUI, 0x32efcdab, 255,0x01,True)
3mile 发表于 2011-7-23 13:53 http://www.autoitx.com/images/common/back.gif
初步测试成功达到目的。
能解释下吗? 从你提供的这行,我是不是可以理解为不受“透明色”的限制呢? 参数4 如何理解? 本帖最后由 powerofos 于 2011-7-23 14:15 编辑
高兴得早了些:
0XABCDEF使用你提供的这行是成功的,我换了下其他的颜色,也是不一定成功的,
是不是RGB 颜色模式的问题?
感谢3mile,希望得到你对这问题的解释。{:face (229):} 我的语言表达能力有限,还是上代码解释吧.
根据_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 呵呵,看到3mile 的回复了,先不看,先回复。
请看下面的链接:
http://www.autoitx.com/forum.php?mod=viewthread&tid=17834&extra=&highlight=%CD%B8%C3%F7&page=1
不知道我对贴主的理解有没有错,他要的效果,和我是一样的,因为我也在我的GUI上 添加了 EDIT ,INPUT 控件,
同理,对这些控件设置背景色后,是可以透明的,但是设置的背景色是有考究的,设置错误后,虽然同样是能达到
背景透明的效果,但是却不能回去鼠标点击的信息,edit 和 input 控件为例,就是获取不了输入焦点,
listview的话就是不能点击项目。
OK,现在去看3mile的解答。{:face (197):} 本帖最后由 powerofos 于 2011-7-23 15:50 编辑
回复 6# 3mile
_WinAPI_GetLayeredWindowAttributes 是通过参数5控制 颜色模式的吧?
如参数5为true,则使用 AGBR, 为false,则使用RGB,
我不了解,使用AGBR,多了一个 ALPHA 通道,对于我这个问题,能产生什么影响。
而我测试你提供的代码,也达不到随意使用“背景色”的效果,0XABABAB就无效。
因为长期使用的RGB模式,习惯了......
有点“肉送到嘴边都不会吃”的感觉,惭愧惭愧。 用0XABABAB不透明吗?
还是无法点击?
看下MSDN的社区内容吧.
http://msdn.microsoft.com/en-us/library/ms633540%28VS.85%29.aspx {:face (456):}
也来测试下.......... 回复 9# 3mile
刚外出了,抱歉
0XABABAB作背景色,能透明,但无法点击透明区域。
感谢3mile提供的链接。 补充一下,用某些颜色是既能使LISTVIEW背景透明,也能兼顾点击某项目中透明区域的,即能选中项目。
我为此努力是想弄明白为何是只有某些颜色能达到,或者说有方法能帮助我规避无效颜色。
点选如下图效果:
回复 12# powerofos
子窗体以及子窗体控件的背景色主要是为了分层,也就是说这个背景色是会过滤掉的,所以以个人的观点来看设置成纯色会比较好,其中又以0X00FF00,也就是绿色是最不容易出错的.不管RGB还是BGR绿色的位置是不会变化的.
另外主窗体的背景图片是可以用GDI+画上去的,可以在HDC上面作二次修改,比如直接增加文本.这样虽然多付出了一点效率.
但我发现有一个问题.当点击子窗体或LISTVIEW时,因为焦点在子窗体上,所以主窗体的标题栏还是很难看的.尝试过很多次也没有办法解决.
本帖最后由 powerofos 于 2011-7-24 08:49 编辑
回复 13# 3mile
哈哈,3mile,我俩想法越来越“接近”了,因为你以上提到的GDI+画背景,正是我使用的方法。
而且,你提到的标题栏问题,却恰恰是我之前努力去KILL掉的,我不需要标题栏,我的标题栏是伪做的。
我是这样写的:
首层: 样式:BitOR($WS_POPUP,$WS_CAPTION), _WinAPI_DwmExtendFrameIntoClientArea,客户区全填上玻璃效果,无控件。
次层:GDI+ 画背景图片层,弹出式 + 内嵌 +设置父句柄,调整大小以符合首层,圆角
再次层:
再次层:
。。。。。。
我觉得,这方法不太高明....
再谈及listview背景透明问题,很遗憾你也暂无办法.... 回复 14# powerofos
如果用弹出窗体的话,很好奇你的窗体最小化,窗体还原以及窗体关闭这几个图标是那里去找来的?
能共享下吗?
页:
[1]
2