打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
怎么实现子窗口的背景透明?
主      题: 怎么实现子窗口的背景透明?
作      者: Bill.Gates
回复次数: 3
发表时间: 2008-3-28 13:56:42
正文内容:
我尝试用父窗口的DC来填充 对应的位置,通常是好的,但是在子窗口重画的时候就 模糊了。。。有解决方法吗?
回复人: 1982c0ffee2008-3-28 14:05:36
无主题
SetWindowLong(GWL_EXSTYLE, GetWindowLong(GWL_EXSTYLE)^WS_EX_LAYERED);
HINSTANCE hInst = LoadLibrary(_T("User32.DLL"));
if(hInst)
{
typedef BOOL (WINAPI *MYFUNC)(HWND,COLORREF,BYTE,DWORD);
MYFUNC fun = NULL; //取得SetLayeredWindowAttributes函数指针
fun=(MYFUNC)GetProcAddress(hInst, "SetLayeredWindowAttributes");
if(fun)fun(m_hWnd,RGB(255,0,255),0,1);
FreeLibrary(hInst);
}
回复人: 1982c0ffee2008-3-28 14:06:21
把这段代码贴到你子窗口初始化函数里去
回复人: 1982c0ffee (得分:10)2008-3-28 14:07:49
无主题
子窗口的透明和主窗口完全不同,   主窗口是通过layeredwindow实现的,   而子窗口则必须自己实现,   尤其是半透明,   必须自己对获取的透明背景图进行操作。   要实现子窗口的透明需要做到下面几步:
1.   windows的ExStyle中需要包含WS_EX_TRANSPARENT属性
2.   windows的Style中要去掉WS_CLIPSIBLING属性
3.   对继承自windows标准控件的子窗口(   比如edit,   scrollbar等等   ),   需要截获WM_CTLCOLORxxx消息并返回一个style为BS_HOLLOW的brush的handle(即一个透明画刷的handle)
4.   需要截获WM_ERASEBKGND消息并不要清除背景(如果做到了3,   则这一步可以省略)
5.   最关键的一点(也是很多人没有想到或不知道的),   必须将parent窗口style中的WS_CLIPCHILDREN标志去掉,   否则PARENT窗口重画时不会重画被子窗口覆盖的部分.
6.   做到以上各步后,   在子窗口收到WM_PAINT消息时就可以获得完整的背景图了,   接下去对这背景进行处理就可以实现半透明效果.
另外一点,   最好同时截获parent窗的WM_PAINT消息,   在parent窗重画前调用InvalidateRect让本子窗口显示实效,   这样子窗口才能同样也收到一个WM_PAINT消息(   这样做是为了保险,   因为我不是很确定主窗口重画系统是否会自动给具有WS_EX_TRANSPARENT属性的子窗口同样发WM_PAINT   ).
(###)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Windows窗口刷新机制详解
Windows程序设计——Windows单选按钮、复选框、分组框控件
很犀利的防止自定义的用户控件闪烁方法
xp下实现窗体透明特效SetLayeredWindowAttributes函数
GetWindowRect,GetClientRect,ScreenToClient MoveWindow SetWindowPos 用法说明
RedrawWindow(NULL, NULL, RDW
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服