透明窗口的问题(两天内必定结贴)

时间:2022-11-14 19:52:27
我最近写了个透明窗口的程序,用的方法是WS_EX_LAYERED属性,但是这样的属性做出来的透明部分并不属于你的应用程序 而是属于桌面,比如你点击透明部分,响应的将会是桌面的消息,而不是你的应用程序消息,有什么方法可以做出透明的程序,并且透明部分也是属于自己的应用程序呢?给出方法的介绍给10分到30分,如果给出源代码,或者给代码的链接给60分到100分。谢谢了

9 个解决方案

#1


::SetWindowLong(m_hWnd, GWL_EXSTYLE, ::GetWindowLong(m_hWnd, GWL_EXSTYLE)^0x80000);
SetLayeredWindowAttributes(m_hWnd, RGB(0, 0, 0), 255, LWA_ALPHA);

#2


引用楼主 wuliao0419 的回复:
我最近写了个透明窗口的程序,用的方法是WS_EX_LAYERED属性,但是这样的属性做出来的透明部分并不属于你的应用程序 而是属于桌面,比如你点击透明部分,响应的将会是桌面的消息,而不是你的应用程序消息,有什么方法可以做出透明的程序,并且透明部分也是属于自己的应用程序呢?给出方法的介绍给10分到30分,如果给出源代码,或者给代码的链接给60分到100分。谢谢了

没明白,我尝试了下步行,而且改变窗口风格的时候采取异或的方法 实在不解,可否指点一二

#4


设置透明度为1就可以了  如果按颜色透明就是全透明了,那样不会收到消息

#5


但是我现在需要的是只有白色的部分为透明,而非白色部分的为不透明? 按你的意思可以使得白色的部分为透明度为1,其他地方为255,但是这如何可以做的到?看过那个函数,我不知道如何可以实现你说的这种方式

#6


引用 3 楼 zgl7903 的回复:
使用SetLayeredWindowAttributes API 实现透明窗口

但是我现在需要的是只有白色的部分为透明,而非白色部分的为不透明? 按你的意思可以使得白色的部分为透明度为1,其他地方为255,但是这如何可以做的到?看过那个函数,我不知道如何可以实现你说的这种方式

#7


引用 4 楼 yxwsbobo 的回复:
设置透明度为1就可以了 如果按颜色透明就是全透明了,那样不会收到消息

但是我现在需要的是只有白色的部分为透明,而非白色部分的为不透明? 按你的意思可以使得白色的部分为透明度为1,其他地方为255,但是这如何可以做的到?看过那个函数,我不知道如何可以实现你说的这种方式

#8


SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE, 
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000); 
HINSTANCE hInst = LoadLibrary("User32.DLL"); 
if(hInst) 

typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD); 
MYFUNC fun = NULL; 
//取得SetLayeredWindowAttributes函数指针 
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); 
if(fun)fun(this->m_hWnd,0,220,2); 
FreeLibrary(hInst); 
}

#9


你的只能加载png图片了吧,那个参数是做不到的。

#1


::SetWindowLong(m_hWnd, GWL_EXSTYLE, ::GetWindowLong(m_hWnd, GWL_EXSTYLE)^0x80000);
SetLayeredWindowAttributes(m_hWnd, RGB(0, 0, 0), 255, LWA_ALPHA);

#2


引用楼主 wuliao0419 的回复:
我最近写了个透明窗口的程序,用的方法是WS_EX_LAYERED属性,但是这样的属性做出来的透明部分并不属于你的应用程序 而是属于桌面,比如你点击透明部分,响应的将会是桌面的消息,而不是你的应用程序消息,有什么方法可以做出透明的程序,并且透明部分也是属于自己的应用程序呢?给出方法的介绍给10分到30分,如果给出源代码,或者给代码的链接给60分到100分。谢谢了

没明白,我尝试了下步行,而且改变窗口风格的时候采取异或的方法 实在不解,可否指点一二

#3


#4


设置透明度为1就可以了  如果按颜色透明就是全透明了,那样不会收到消息

#5


但是我现在需要的是只有白色的部分为透明,而非白色部分的为不透明? 按你的意思可以使得白色的部分为透明度为1,其他地方为255,但是这如何可以做的到?看过那个函数,我不知道如何可以实现你说的这种方式

#6


引用 3 楼 zgl7903 的回复:
使用SetLayeredWindowAttributes API 实现透明窗口

但是我现在需要的是只有白色的部分为透明,而非白色部分的为不透明? 按你的意思可以使得白色的部分为透明度为1,其他地方为255,但是这如何可以做的到?看过那个函数,我不知道如何可以实现你说的这种方式

#7


引用 4 楼 yxwsbobo 的回复:
设置透明度为1就可以了 如果按颜色透明就是全透明了,那样不会收到消息

但是我现在需要的是只有白色的部分为透明,而非白色部分的为不透明? 按你的意思可以使得白色的部分为透明度为1,其他地方为255,但是这如何可以做的到?看过那个函数,我不知道如何可以实现你说的这种方式

#8


SetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE, 
GetWindowLong(this->GetSafeHwnd(),GWL_EXSTYLE)^0x80000); 
HINSTANCE hInst = LoadLibrary("User32.DLL"); 
if(hInst) 

typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD); 
MYFUNC fun = NULL; 
//取得SetLayeredWindowAttributes函数指针 
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes"); 
if(fun)fun(this->m_hWnd,0,220,2); 
FreeLibrary(hInst); 
}

#9


你的只能加载png图片了吧,那个参数是做不到的。