透明窗体问题

windrey 2008-05-20 10:26:38
要实现在一个透明窗体上绘制图片!我把窗体设为透明,在窗体上绘图,运行时整个窗体透明了,图片也看不见,请问如何实现窗体透明,绘的图不透明!
...全文
169 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
你妹的特盗不 2009-08-14
  • 打赏
  • 举报
回复
我这有个例子程序,给我你的mail,我发给你~希望对你有帮助 ~
chogimoga 2009-08-14
  • 打赏
  • 举报
回复
QQ音乐 歌词 透明效果! 应该就是8楼的做法!
piaopiaohu123 2009-08-14
  • 打赏
  • 举报
回复
可以用PNG掩图的方式,使用ALPHA通道的PNG透明图片,然后使用updatelayeredwindow(),可以将窗口作成类似全透明效果(如果PNG差不多是透明效果的时候),但是不是全透明..全透明的窗口,鼠标肯定会漏过去...缺点是貌似只能显示一幅图,如果你想自己捕捉鼠标画线或者图形之类的,我目前也还没找到可行的办法.
给个建议是,把窗口设为透明之后,鼠标漏过去了,可以在他的下层窗口捕捉消息,然后使用二次缓存,设置定时器,不停的重绘试试...只是个想法,不知道行的通不
「已注销」 2009-08-14
  • 打赏
  • 举报
回复
兄弟,你的意思是:绘制一个图片形的窗口吧,就是说要绘制的窗口模型跟你的图片一样吧。我觉得你应该换一种思路,其实就是绘制不规则窗口的问题。下面提供一些代码,希望能帮助你解决问题:
1.图片的形状显示的窗体

BOOL CPictureDlg::OnInitDialog()

// TODO: Add extra initialization here
CDC* pDC;
CDC memDC;
CBitmap cBitmap;
COLORREF col;
CRect rect;
int x,y;
CRgn Rgn,rgn;
pDC = GetDC();
GetWindowRect(&rect);
cBitmap.LoadBitmap(IDB_BITMAP1);
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(&cBitmap);
Rgn.CreateRectRgn(0,0,rect.Width(),rect.Height());
for(x=0;x <rect.Width();x++)
{
for(y=0;y <rect.Height();y++)
{
col=memDC.GetPixel(x,y);
if(col==RGB(255,255,255))
{
rgn.CreateRectRgn(x,y,x+1,y+1);
Rgn.CombineRgn(&Rgn,&rgn,RGN_XOR);
rgn.DeleteObject();
}
}
}
SetWindowRgn((HRGN)Rgn,true);
ReleaseDC(pDC);


BOOL CPictureDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CRect rect;
GetWindowRect(&rect);
CDC memDC;
CBitmap cBitmap;
//将背景位图加到设备场景中
cBitmap.LoadBitmap(IDB_BITMAP1);
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(&cBitmap);
//将背景位图显示出来
pDC->BitBlt(0, 0, rect.Width(), rect.Height(), &memDC, 0, 0, SRCCOPY);
return TRUE;
// return CDialog::OnEraseBkgnd(pDC);
}
piaopiaohu123 2009-08-13
  • 打赏
  • 举报
回复
使用UpdateLayeredWindow的话,图片的颜色不会跟着变淡吗?
lhc_picture 2009-08-13
  • 打赏
  • 举报
回复
UpddateLayeredWindow用这个函数试试,把图画在它参数的HDC中,这样窗口的其他部分透明了,而画在HDC中的图还能被更新出来。
lhc_picture 2009-08-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 piaopiaohu123 的回复:]
  使用UpdateLayeredWindow的话,图片的颜色不会跟着变淡吗?
[/Quote]
不会,它会更新它自己的HDC中画的图,窗口的不会对它产生影响。
wyxz555 2009-08-02
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 vocanicy 的回复:]
SetLayeredWindowAttributes的LWA_COLORKEY的效果和LWA_ALPHA完全不同
设置了LWA_COLORKEY颜色的窗口部分是完全消失了,效果和SetWindowRgn一样

另外SetLayeredWindowAttributes对子窗口无效
因此如果楼主真的要实现这个效果,只能将图放在一个POPUP的窗口中,
然后通过重载父窗口的OnMove消息处理函数跟着主窗口一起移动来模拟子窗口。

[/Quote]
这种方式不太好,如果用这种方式,其它窗体就不能用了
rageliu 2008-05-20
  • 打赏
  • 举报
回复
可以用设置key color的方式透明
vocanicy 2008-05-20
  • 打赏
  • 举报
回复
SetLayeredWindowAttributes的LWA_COLORKEY的效果和LWA_ALPHA完全不同
设置了LWA_COLORKEY颜色的窗口部分是完全消失了,效果和SetWindowRgn一样

另外SetLayeredWindowAttributes对子窗口无效
因此如果楼主真的要实现这个效果,只能将图放在一个POPUP的窗口中,
然后通过重载父窗口的OnMove消息处理函数跟着主窗口一起移动来模拟子窗口。
windrey 2008-05-20
  • 打赏
  • 举报
回复
具体一点,不太明白!

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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