GDI+ 实现对话框背景的半透明

时间:2022-05-24 06:05:44
在OnPaint或者在OnEraseBkgnd消息中,添加如下代码:

    CRect rect;
    GetClientRect( &rect );
    Bitmap *bmp = ::new Bitmap( rect.Width(), rect.Height() );
    Graphics *graph= Graphics::FromImage( bmp ); 
    Image img2(L"img\\client.png");
    TextureBrush brush2(&img2, WrapModeTile );
    graph->FillRectangle(&brush2, RectF(0.0f, 0.0f, REAL(rect.right), REAL(rect.bottom)));
    Graphics g(dc.m_hDC);
    g.DrawImage( bmp, 0,0 );
    ::delete bmp;

其中 client.png是一张半透明的PNG图片,但是贴在背景上,不能使背景半透明,请问大侠指点下。
或者如何利用GDI+ 实现背景半透明

7 个解决方案

#1


需要WS_EX_LAYERED样式,分层窗口.然后UpdateLayeredWindow
可参考: 模仿酷狗7(Kugou7)界面源码 http://blog.csdn.net/CometNet/archive/2011/06/22/6561912.aspx
GDI+ 实现对话框背景的半透明

#2




楼主 你想说 是你的窗口不能透明 还是说贴上的图片不能透明?


#3


引用 2 楼 likang0712 的回复:
楼主 你想说 是你的窗口不能透明 还是说贴上的图片不能透明?

我把半透明的图片,贴在对话框上,但是图片不能透明,就是没有实现对话框的半透明效果。

#4


引用 3 楼 loyoo2540598 的回复:
引用 2 楼 likang0712 的回复:
楼主 你想说 是你的窗口不能透明 还是说贴上的图片不能透明?

我把半透明的图片,贴在对话框上,但是图片不能透明,就是没有实现对话框的半透明效果。


意思就是说你要对话框半透明吧

可以看看1楼的东东 用PNG图片实现 窗体就是图片的效果  做的不错的 


如果单纯让对话框透明 用SetLayeredWindowAttributes()

#5


要想让窗口透明需要指定WS_EX_LAYERED风格
http://www.vckbase.com/document/viewdoc/?id=1745梒

#6


引用 1 楼 cometnet 的回复:
需要WS_EX_LAYERED样式,分层窗口.然后UpdateLayeredWindow
可参考:模仿酷狗7(Kugou7)界面源码http://blog.csdn.net/CometNet/archive/2011/06/22/6561912.aspx


我个人感觉这个代码还存在小小的BUG,我当时研究了下,鼠标点击窗口移动的时候,这个时候上下左右的4个子窗体还没有绘制完,所以想等鼠标移到窗体上 等窗体完全绘制后,在移动。个人见解而已,希望大家指点.

#7


引用 6 楼 coii1314 的回复:
我个人感觉这个 代码还存在小小的BUG,我当时研究了下,鼠标点击窗口移动的时候,这个时候……


确实存在该BUG,不过我当时也只是尝试一下,并没有计划继续编写.就留给大家去完善吧.

#1


需要WS_EX_LAYERED样式,分层窗口.然后UpdateLayeredWindow
可参考: 模仿酷狗7(Kugou7)界面源码 http://blog.csdn.net/CometNet/archive/2011/06/22/6561912.aspx
GDI+ 实现对话框背景的半透明

#2




楼主 你想说 是你的窗口不能透明 还是说贴上的图片不能透明?


#3


引用 2 楼 likang0712 的回复:
楼主 你想说 是你的窗口不能透明 还是说贴上的图片不能透明?

我把半透明的图片,贴在对话框上,但是图片不能透明,就是没有实现对话框的半透明效果。

#4


引用 3 楼 loyoo2540598 的回复:
引用 2 楼 likang0712 的回复:
楼主 你想说 是你的窗口不能透明 还是说贴上的图片不能透明?

我把半透明的图片,贴在对话框上,但是图片不能透明,就是没有实现对话框的半透明效果。


意思就是说你要对话框半透明吧

可以看看1楼的东东 用PNG图片实现 窗体就是图片的效果  做的不错的 


如果单纯让对话框透明 用SetLayeredWindowAttributes()

#5


要想让窗口透明需要指定WS_EX_LAYERED风格
http://www.vckbase.com/document/viewdoc/?id=1745梒

#6


引用 1 楼 cometnet 的回复:
需要WS_EX_LAYERED样式,分层窗口.然后UpdateLayeredWindow
可参考:模仿酷狗7(Kugou7)界面源码http://blog.csdn.net/CometNet/archive/2011/06/22/6561912.aspx


我个人感觉这个代码还存在小小的BUG,我当时研究了下,鼠标点击窗口移动的时候,这个时候上下左右的4个子窗体还没有绘制完,所以想等鼠标移到窗体上 等窗体完全绘制后,在移动。个人见解而已,希望大家指点.

#7


引用 6 楼 coii1314 的回复:
我个人感觉这个 代码还存在小小的BUG,我当时研究了下,鼠标点击窗口移动的时候,这个时候……


确实存在该BUG,不过我当时也只是尝试一下,并没有计划继续编写.就留给大家去完善吧.