如何实现窗体的渐变透明

时间:2022-12-24 11:46:10
相信很多人都知道如何让窗体变得半透明。
那么有谁知道如何实现让窗体的不同部分透明度不同。
比如这个区域透明些,另一个区域更透明些。

见过好几个软件有这种功能,系统应该有这样的api支持吧。

26 个解决方案

#1


帮你顶

#2


自己顶,高手们,来吧

#3


函数估计是一样的
只是把一大块分成了好几小块

#4


应该是没有现成的API,自己处理吧。

#5


alpha透明太伤了
自己做的话效率会比较低
activeskin就处理的很好

#6


把窗口分成几部分,分别设置透明度

#7


是否用多个窗口拼接在一起,对每个窗口分别用SetLayeredWindowAttributes设置透明度

#8


自己做个绘制透明度的函数,参数就是窗口坐标。根据坐标(X,或者Y)来计算一个透明度设置上去就行了。
估计效率也不会太低,因为是用底层API嘛

#9


图片的话可以用PHOTOSHOP处理成渐变透明,然后贴到对话框

#10


可以使用 WS_EX_LAYER 窗口属性

#11


SetLayeredWindowAttributes是对整个窗口的
用图片自己处理再贴图的话,效率肯定低。而且,抓取窗口后面
原来显示的图像也不太容易。

继续出招吧。

#12


你可以使用spy++试试看,不同透明是否是一个窗体!

BYTE eff=(BYTE)m_slide.GetPos(); //µÃµ½»¬¶¯ÌõµÄλÖÃ
HINSTANCE hInst = LoadLibrary("User32.DLL"); //¼ÓÔØDLL
if(hInst) 
{            
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);          
MYFUNC fun = NULL;
//È¡µÃSetLayeredWindowAttributesº¯ÊýÖ¸Õë     
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
//µ÷ÓÃSetLayeredWindowAttributes
if(fun)fun(this->GetSafeHwnd(),0,eff,2);  
FreeLibrary(hInst); 
};
CString str;
str.Format("%d",100*eff/255);
GetDlgItem(IDC_EDIT1)->SetWindowText(str);//ÏÔʾ͸Ã÷Öµ

#13


试了,完全是一个窗体。

#14


自己提前

#15


自己提前

#16


曾经有一份代码,不过不知道还能不能找到
使用的是 WS_EX_LAYERED 属性
而不是使用 SetLayeredWindowAttributes
两者之间是有一些区别的

#17


..

#18


to 空气:
哦?那通过WS_EX_LAYERED 可以实现么?

#19


SetLayeredWindowAttributes只对有WS_EX_LAYERED风格的窗口有效,呵呵,如果CSDN支持贴图就好了

#20


对呀,所以WS_EX_LAYERED风格 只是 SetLayeredWindowAttributes的必要条件,深夜不眠者,你有高招?

#21


其实对于一个屏幕的一个像素是可以取到它不同程度的透明值的,只要将得到窗口的不同区域的像素然后用运算后的值取代,但这种算法比较费时

#22


晕,我在我的问题里都提过这种解法,
不现实哦

#23


是吗??也
我顶

#24


应该把窗口分成几部分,然后将各个部分分别自己设置透明度!

#25


我想,不管怎么实现要首先知道操作系统是什么

#26


如果做区域合并的话,应该可以做到,先用几个窗口,对这些窗口显示成不同的透明度,接着用区域rgn合并,合成后的dc放在目标窗口上

#1


帮你顶

#2


自己顶,高手们,来吧

#3


函数估计是一样的
只是把一大块分成了好几小块

#4


应该是没有现成的API,自己处理吧。

#5


alpha透明太伤了
自己做的话效率会比较低
activeskin就处理的很好

#6


把窗口分成几部分,分别设置透明度

#7


是否用多个窗口拼接在一起,对每个窗口分别用SetLayeredWindowAttributes设置透明度

#8


自己做个绘制透明度的函数,参数就是窗口坐标。根据坐标(X,或者Y)来计算一个透明度设置上去就行了。
估计效率也不会太低,因为是用底层API嘛

#9


图片的话可以用PHOTOSHOP处理成渐变透明,然后贴到对话框

#10


可以使用 WS_EX_LAYER 窗口属性

#11


SetLayeredWindowAttributes是对整个窗口的
用图片自己处理再贴图的话,效率肯定低。而且,抓取窗口后面
原来显示的图像也不太容易。

继续出招吧。

#12


你可以使用spy++试试看,不同透明是否是一个窗体!

BYTE eff=(BYTE)m_slide.GetPos(); //µÃµ½»¬¶¯ÌõµÄλÖÃ
HINSTANCE hInst = LoadLibrary("User32.DLL"); //¼ÓÔØDLL
if(hInst) 
{            
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);          
MYFUNC fun = NULL;
//È¡µÃSetLayeredWindowAttributesº¯ÊýÖ¸Õë     
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
//µ÷ÓÃSetLayeredWindowAttributes
if(fun)fun(this->GetSafeHwnd(),0,eff,2);  
FreeLibrary(hInst); 
};
CString str;
str.Format("%d",100*eff/255);
GetDlgItem(IDC_EDIT1)->SetWindowText(str);//ÏÔʾ͸Ã÷Öµ

#13


试了,完全是一个窗体。

#14


自己提前

#15


自己提前

#16


曾经有一份代码,不过不知道还能不能找到
使用的是 WS_EX_LAYERED 属性
而不是使用 SetLayeredWindowAttributes
两者之间是有一些区别的

#17


..

#18


to 空气:
哦?那通过WS_EX_LAYERED 可以实现么?

#19


SetLayeredWindowAttributes只对有WS_EX_LAYERED风格的窗口有效,呵呵,如果CSDN支持贴图就好了

#20


对呀,所以WS_EX_LAYERED风格 只是 SetLayeredWindowAttributes的必要条件,深夜不眠者,你有高招?

#21


其实对于一个屏幕的一个像素是可以取到它不同程度的透明值的,只要将得到窗口的不同区域的像素然后用运算后的值取代,但这种算法比较费时

#22


晕,我在我的问题里都提过这种解法,
不现实哦

#23


是吗??也
我顶

#24


应该把窗口分成几部分,然后将各个部分分别自己设置透明度!

#25


我想,不管怎么实现要首先知道操作系统是什么

#26


如果做区域合并的话,应该可以做到,先用几个窗口,对这些窗口显示成不同的透明度,接着用区域rgn合并,合成后的dc放在目标窗口上