怎么实现窗口半透明而控件不透明

lotusword 2010-01-23 12:57:34
就像迅雷的悬浮窗的效果似的。
上面的百分比和波浪线是不透明的,而背景是半透明的。

还有如何实现窗口不透明,而窗口上面的控件半透明。
例如窗口上画了一张图片,窗口上面有一个按钮,可以透过这个按钮朦胧的看到窗口上面的图片
...全文
1895 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
rqf1985 2012-04-11
  • 打赏
  • 举报
回复
哎呀,也解决了我的问题。谢了
Gleam_Qian 2010-07-09
  • 打赏
  • 举报
回复
这个厉害.继续学习.
耍宝王 2010-01-26
  • 打赏
  • 举报
回复
哦,对不起,看来是我理解错了,误导了LZ

作为补救,我找到了一个解决办法,在本论坛的VB区中有一篇《如何设置窗体中指定颜色半透明效果》中有。

也是使用SetLayeredWindowAttributes,不同的是,他还用了另一API函数SetParent,基本思路是将某个容器控件用SetParent另外指定一个父窗口,这样控件和主窗体就可以分别使用SetLayeredWindowAttributes函数,控制透明方式,以迅雷的悬浮窗而言就是,将主窗体以窗体透明的方式(LWA_ALPHA标志)半透明,控件以指定颜色的方式(LWA_COLORKEY标志)镂空特定颜色透明,但是由于控件指定了其他的父窗口,因此会有一个不主动跟随窗体移动和显示层次(窗体会覆盖控件)的问题,这些都需要手动控制

大致效果如下(偷懒所以用VB程序演示)

实际上就是等于创建两个窗体使用不同的透明方式,然后叠加在一起
cocat 2010-01-25
  • 打赏
  • 举报
回复
学习了~
lotusword 2010-01-25
  • 打赏
  • 举报
回复
首先感谢上面几位的回复
我用程序试了一下,下面是效果图


而我想要的是这种效果

透过窗口可以朦胧的看到窗口下面的东西,而窗口上的文字还可以清晰地看到

如果把SetLayeredWindowAttributes中的第四个值设置成LWA_ALPHA的话,效果类似于这样

可以看到上面的字也变得模糊了

我又查了一下SetLayeredWindowAttributes的资料
BOOL SetLayeredWindowAttributes(
HWND hwnd, // handle to the layered window 透明窗体的句柄
COLORREF crKey, // specifies the color key 颜色值
BYTE bAlpha, // value for the blend function 透明度,取值范围是[0,255]
DWORD dwFlags // action 透明方式,可以取两个值:
当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;
当取值为LWA_COLORKEY时,bAlpha参数有效,而窗体中的所有颜色为crKey的地方将变为透明。
LWA_ALPHA = 0x2
LWA_COLORKEY=0x1
);
  其中dwFlags有LWA_ALPHA(值为2)和LWA_COLORKEY(值为1)两种设置,如果LWA_ALPHA被设置的话,通过 bAlpha参数指定窗体的透明度;如果LWA_COLORKEY标志被设置的话,则指定关键色为crKey,该颜色所覆盖的区域将从窗体去除,去除后的区域将不再进行点击检测,其他颜色则正常显示。如果阿尔法混合值设置为0,其窗口区域同样不进行点击检测。
wuhuwy 2010-01-25
  • 打赏
  • 举报
回复
顶!学习了!
lotusword 2010-01-24
  • 打赏
  • 举报
回复
我的意思是半透明,就像迅雷的悬浮窗似的
耍宝王 2010-01-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 lotusword 的回复:]
我的意思是半透明,就像迅雷的悬浮窗似的
[/Quote]
我的方法可以啊,不好意思,刚才看了一下,是我的表述不够清楚。这里的透明不是让这个颜色失效,而是像透明窗口那样,即第三个参数(透明度),不在对整个窗体起效,而是对这种颜色起效,比如,背景为蓝色,而控件为白色,指定第二个参数为此蓝色,透明度(第三个参数)为128,第四个参数要设为LWA_COLORKEY,这样就能做到,背景半透明,而控件不透明
耍宝王 2010-01-23
  • 打赏
  • 举报
回复
SetLayeredWindowAttributes的第二个参数,可以指定透明的颜色,基本设想是把要透明的窗体设置成一个你不常用的颜色与控件区分,然后指定透明这种颜色
BOOL SetLayeredWindowAttributes(
HWND hwnd, // handle to the layered window 透明窗体的句柄
COLORREF crKey, // specifies the color key 颜色值
BYTE bAlpha, // value for the blend function 透明度,取值范围是[0,255]
DWORD dwFlags // action 透明方式,可以取两个值:
当取值为LWA_ALPHA时,crKey参数无效,bAlpha参数有效;
当取值为LWA_COLORKEY时,bAlpha参数有效,而窗体中的所有颜色为crKey的地方将变为透明。
LWA_ALPHA = 0x2
LWA_COLORKEY=0x1
);
lotusword 2010-01-23
  • 打赏
  • 举报
回复
是不是setlayeredwindowattributes ?但是这一种方法让整个窗口透明了,包括窗口上面的控件也透明了。我想要的是控件不透明,而窗口透明
tonymyx 2010-01-23
  • 打赏
  • 举报
回复
学习了,我也有这样的想法
z569362161 2010-01-23
  • 打赏
  • 举报
回复
透明就是把对应位置的背景图片“截”下来再“贴”到你的控件上,代码:

CClientDC clDC(GetParent());

CRect rect;

CRect rect1;

GetClientRect(rect);

GetWindowRect(rect1);

GetParent()->ScreenToClient(rect1);

if (m_dcBk.m_hDC == NULL)

{

m_dcBk.CreateCompatibleDC(&clDC);

m_bmpBk.CreateCompatibleBitmap(&clDC, rect.Width(), rect.Height());

m_pbmpOldBk = m_dcBk.SelectObject(&m_bmpBk);

m_dcBk.BitBlt(0, 0, rect.Width(), rect.Height(), &clDC, rect1.left, rect1.top, SRCCOPY);

} // if

pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &m_dcBk, 0, 0, SRCCOPY);
z569362161 2010-01-23
  • 打赏
  • 举报
回复
mfc

应该先得到文本长度,然后用 SetSel 方法。
假如得到的长度是 dwLen ,那么可以这样:
((CEdit*)GetDlgItem(IDC_EDIT2))->SetSel(dwLen,dwLen,TRUE);
z569362161 2010-01-23
  • 打赏
  • 举报
回复
使用LayerWindow可以设置窗口的透明度!

65,184

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧