CE上如何实现对话框背景半透明?

w12 2004-07-02 05:49:18
试了很多PC上的方法,都没有效果,难道不行吗?
...全文
229 点赞 收藏 13
写回复
13 条回复
w12 2004年07月09日
谢谢,也可能没有其它更快的办法了。
回复 点赞
载舟之水 2004年07月08日
补充一下,半透明其实不需要每个象素都算一次,可以跳跃,只要眼睛认为是半透明就行了。
回复 点赞
ricky460 2004年07月07日
mark 。 。 。
回复 点赞
buptpki 2004年07月07日
摘录一段别人实现的代码,可能对你有帮助,



做两个BMP,一个是背景图,一个是有蒙板的图。
下面这个函数用来显示透明位图,关键是最后一个参数,它提供了蒙板的颜色。在调用下面这个函数前先可以定义mask颜色

COLORREF crMask = RGB(0x00,0x00,0xff); //mask颜色
这里的MASK颜色是纯蓝色,其实是一个需要显示透明位图的文件里没有使用过的颜色,你需要在那个BMP文件中把透明部分都填成这种蓝色。然后调用下面这个TransparentBlt2函数即可,比如:

TransparentBlt2(hdc,IMAGEX_KONGXI*3+IMAGEX*2, IMAGEY_SHANG*2+IMAGEY+IMAGEY_XIA,24, 24,hMemDC,0,0,24,24,crMask);

void TransparentBlt2( HDC hdcDest, // 目标DC
int nXOriginDest, // 目标X偏移
int nYOriginDest, // 目标Y偏移
int nWidthDest, // 目标宽度
int nHeightDest, // 目标高度
HDC hdcSrc, // 源DC
int nXOriginSrc, // 源X起点
int nYOriginSrc, // 源Y起点
int nWidthSrc, // 源宽度
int nHeightSrc, // 源高度
UINT crTransparent // 透明色,COLORREF类型
)
{
HBITMAP hOldImageBMP, hImageBMP = CreateCompatibleBitmap(hdcDest, nWidthDest, nHeightDest); // 创建兼容位图
HBITMAP hOldMaskBMP, hMaskBMP = CreateBitmap(nWidthDest, nHeightDest, 1, 1, NULL); // 创建单色掩码位图
HDC hImageDC = CreateCompatibleDC(hdcDest);
HDC hMaskDC = CreateCompatibleDC(hdcDest);
hOldImageBMP = (HBITMAP)SelectObject(hImageDC, hImageBMP);
hOldMaskBMP = (HBITMAP)SelectObject(hMaskDC, hMaskBMP);

// 将源DC中的位图拷贝到临时DC中
if (nWidthDest == nWidthSrc && nHeightDest == nHeightSrc)
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hdcSrc, nXOriginSrc, nYOriginSrc, SRCCOPY);
else
StretchBlt(hImageDC, 0, 0, nWidthDest, nHeightDest,
hdcSrc, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc, SRCCOPY);

// 设置透明色
SetBkColor(hImageDC, crTransparent);

// 生成透明区域为白色,其它区域为黑色的掩码位图
BitBlt(hMaskDC, 0, 0, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCCOPY);

// 生成透明区域为黑色,其它区域保持不变的位图
SetBkColor(hImageDC, RGB(0,0,0));
SetTextColor(hImageDC, RGB(255,255,255));
BitBlt(hImageDC, 0, 0, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

// 透明部分保持屏幕不变,其它部分变成黑色
SetBkColor(hdcDest,RGB(0xff,0xff,0xff));
SetTextColor(hdcDest,RGB(0,0,0));
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hMaskDC, 0, 0, SRCAND);

// "或"运算,生成最终效果
BitBlt(hdcDest, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest, hImageDC, 0, 0, SRCPAINT);

SelectObject(hImageDC, hOldImageBMP);
DeleteDC(hImageDC);
SelectObject(hMaskDC, hOldMaskBMP);
DeleteDC(hMaskDC);
DeleteObject(hImageBMP);
DeleteObject(hMaskBMP);

}

回复 点赞
buptpki 2004年07月07日
实现归实现,可惜效率不高。如果区域大,就要等上好几秒钟。

不错,确实存在这个问题,但是这个算法还是可以优化,具体实现参考游戏的做法,采用游戏API,这是DirectX没有出现时,微软提供的一个临时解决办法,这些API在动态链接库gx.dll中,可以直接操作视频缓冲区,速度大大提高,在Smartphone, pocketpc的SDK中有相关的源代码。
回复 点赞
载舟之水 2004年07月06日
应该不会,你的算法需要优化
回复 点赞
w12 2004年07月06日
实现归实现,可惜效率不高。如果区域大,就要等上好几秒钟。
回复 点赞
lqlq99612 2004年07月05日
nbcool(载舟之水),说详细一点撒,贴写代码上来我也想看看
回复 点赞
载舟之水 2004年07月05日
我这里的alpha 是指图像半透明叠加象素处理
具体的做法。参考我的C友:buptpki 的回答

http://community.csdn.net/Expert/topic/2899/2899695.xml?temp=.6300012
回复 点赞
w12 2004年07月05日
不支持alpha吧。
回复 点赞
载舟之水 2004年07月03日
你在WM_PAINT中做alpha混合不就行了
回复 点赞
jiayodo 2004年07月03日
gz
回复 点赞
101monster 2004年07月02日
呵呵,UP!
回复 点赞
发动态
发帖子
嵌入开发(WinCE)
创建于2007-09-28

8171

社区成员

4.1w+

社区内容

硬件/嵌入开发 嵌入开发(WinCE)
社区公告
暂无公告