请问:如何实现半透明显示效果(就象金山词霸中的效果)?

y_zj 2000-05-19 09:27:00
有没有例子?
...全文
572 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
y_zj 2000-06-28
  • 打赏
  • 举报
回复
对不起大家。大家的回答给我提供了很大帮助,本来想给你们多加几分,没想到加给了robo之后再也不能给大家加分了。
y_zj 2000-06-28
  • 打赏
  • 举报
回复
robo,能否给我mail一份?我已经给你加分了。
舟中夜起 2000-06-27
  • 打赏
  • 举报
回复
ZPoing:
我也不好意思, 我拿到的也不是ZIP文件,而是a00.txt,打开是乱码,再发一次好吗?谢谢!!
kronus@sina.com
walkinrain 2000-06-27
  • 打赏
  • 举报
回复
ft,居然忘记了写邮件地址:yinganhua@sina.com
给我一个吧,谢谢!
walkinrain 2000-06-27
  • 打赏
  • 举报
回复
也给我一个好么?
xielm 2000-06-27
  • 打赏
  • 举报
回复
robo,你可以到csdn源碼區發佈,或者mail給我一份
robo 2000-06-27
  • 打赏
  • 举报
回复
金山词霸的透明窗口不能移动,我的这个窗口允许移动。
robo 2000-06-27
  • 打赏
  • 举报
回复
感谢ZPoint的帮助,我已经全部模仿出来,只是代码比较多,不知该怎么发布。
dark 2000-06-26
  • 打赏
  • 举报
回复
to ZPoing
能否给我也寄一个darktang@etang.com,谢谢!
robo 2000-06-26
  • 打赏
  • 举报
回复
Dear y_zj,
你还没有给我们分数呢。

我最近比较忙,还没有弄出个东东来,抱歉。
我看y_zj上面的解决方法比较好。

ZPoing,
能给我您的DEMO?请寄robo@263.net
FlowWind 2000-06-26
  • 打赏
  • 举报
回复
ZPoing:
不好意思,我拿到的是不是附件形式的zip文件,是一堆乱码,能重发一次吗?谢谢!
FlowWind 2000-06-26
  • 打赏
  • 举报
回复
ZPoing
我也很感兴趣,给我一份flowwind@yeah.net
舟中夜起 2000-06-26
  • 打赏
  • 举报
回复
Hi, ZPoing
我也要,kronus@sina.com, 多谢!
舟中夜起 2000-06-26
  • 打赏
  • 举报
回复
tp ZPoing,
我也要,kronus@sina.com, 多谢!
ZPoint 2000-06-24
  • 打赏
  • 举报
回复
我有这方面的DEMO程序,需要的话可以给我你的E-MAIL。
1 建立一个可以半透明的窗口
2 盘透明的颜色(滤镜)可以随意调节
3 透明具有记忆功能
xielm 2000-06-23
  • 打赏
  • 举报
回复
感覺zjy同志的方法可行。稍稍擴展了一下。
BOOL BitBlt_HT(
HDC hdc,//目標DC
RECT rect,//目標區域
COLORREF maskColor,//半透明前景
UINT maskRatio//半透明前景比重 ( 0 - 100 )
)
{
int x,y;
COLORREF bColor;
BYTE b_R,b_G,b_B,f_R,f_G,f_B;

maskRatio = maskRatio % 100;
f_R = GetRValue(maskColor);f_G = GetGValue(maskColor);f_B = GetBValue(maskColor);

HDC hMemDC = ::CreateCompatibleDC(hdc);
if (hMemDC == NULL) return 0;
HBITMAP hOldBmp,hNewBmp = ::CreateCompatibleBitmap(hdc,rect.right - rect.left ,rect.bottom - rect.top );
if (hNewBmp == NULL)
{
::DeleteDC (hMemDC);
return 0;
}
hOldBmp = (HBITMAP)::SelectObject(hMemDC,hNewBmp);
::BitBlt (hMemDC,0,0 ,rect.right-rect.left ,rect.bottom - rect.top ,hdc,rect.left ,rect.top,SRCCOPY);

for (y = 0 ; y <rect.bottom - rect.top ; y ++)
{
for (x = 0 ; x <= rect.right - rect.top; x++)
{
bColor = GetPixel(hMemDC,x,y);
b_R = GetRValue(bColor);b_G = GetGValue(bColor);b_B = GetBValue(bColor);
bColor = RGB(f_R*maskRatio/100+b_R*(100-maskRatio)/100,f_G*maskRatio/100+b_G*(100-maskRatio)/100,f_B*maskRatio/100+b_B*(100-maskRatio)/100);
SetPixel(hMemDC,x,y,bColor);
}
}
::BitBlt (hdc,rect.left ,rect.top ,rect.right-rect.left ,rect.bottom - rect.top ,hMemDC,0,0,SRCCOPY);
::SelectObject(hMemDC,hOldBmp);
::DeleteObject (hNewBmp);
::DeleteDC (hMemDC);
return 1;
}
xielm 2000-06-22
  • 打赏
  • 举报
回复
To ZJY,
256,high16,true24是每個分量處理,還是整體處理?
y_zj 2000-06-21
  • 打赏
  • 举报
回复
robo:
非常感谢。不过,前面的那段代码处理的结果好象不是金山词霸中的效果。至于“黑白相间”的方法,我在MSDN中也曾经看到过,但那是“虚”的半透明,不是金山词霸的那种。
我的想法是这样的:先取得屏幕上的背景图象,把这块图象的各像素的RGB分量饱和减相同的值subRGB(如RGB(25,25,25), 相当于各像素的亮度降低,好象图象上面覆盖了一层有一定透明度的玻璃),再画到窗口上。改变subRGB的值,就可以产生各种不同的半透明效果。如subRGB=RGB(255,0,0),处理后的图象红色分量就被去掉了,好象图象上面覆盖了一层能滤除红光的玻璃。
但是,上面的方法有一个技术问题。我担心性能。如100*100的窗口,有10000个像素,就要作10000次GetPixel(x,y)和SetPixel(x,y,rgb)调用,还要作10000次饱和减法运算,估计有一定延时。如果能够得到要处理位图数据的存储地址,再用MMX指令一次处理8个像素(其中一个颜色分量),速度会提高好几倍,不知这样可不可行。
我听说,可以通过DirectX或OpenGL达到半透明效果,可惜这两项技术我从未接触过,不知如何使用。
上面只是我的想法,还没有经过实践。我目前正在做一个项目,没有时间尝试。
robo,抱歉,只能给你20分。想法是否可行,还请大侠们多指点。


zjy 2000-06-21
  • 打赏
  • 举报
回复
将底色与前景色分别/2再相加:
新的Pixel Color = 底色/2 + 前景色/2
robo 2000-06-21
  • 打赏
  • 举报
回复
我在尝试弄出一个完整的半透明窗口,成功后再展示给大家共享。
加载更多回复(7)

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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