[C#] GDI+能实现PNG格式背景图片的透明吗?
我在窗体的OnPaintBackground事件中绘制了多个区域,使用了png格式的Image,但是无法实现png图片的透明特性.网上说用API的什么Layer,但是那个...
我在窗体的OnPaintBackground事件中绘制了多个区域, 使用了png格式的Image, 但是无法实现png图片的透明特性.
网上说用API的什么Layer, 但是那个api方法的参数代表什么都不太清楚, 有什么方法可以实现? 展开
网上说用API的什么Layer, 但是那个api方法的参数代表什么都不太清楚, 有什么方法可以实现? 展开
2个回答
展开全部
能实现,以下为步骤:
1、IntPtr代表指针变量,是c#的基本类型。
2、BLENDFUNCTION是我定义的结构体,用于对应UpdateLayeredWindow这个API函数的BLENDFUNCTION类型参数:定义如下,UpdateLayeredWindow函数下面有说。
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct BLENDFUNCTION
{
public byte BlendOp;
public byte BlendFlags;
public byte SourceConstantAlpha;
public byte AlphaFormat;
}
3、SelectObject是API函数,这里把其作为常函数定义在Win32API这个类里面,作用是将对象选进DC。具体怎么在c#里面引用API函数,可以参考MSDN
[DllImport("gdi32.dll", ExactSpelling = true)]
public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
4、UpdateLayeredWindow也是API函数,定义在Win32API这个类里面,作用是把设置窗口的透明度或透明方式(Alapha还是透明指定颜色),下面是这个函数在c#里面引用的方法。
[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
public static extern Bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref Point pptDst, ref Size psize, IntPtr hdcSrc, ref Point pprSrc, Int32 crKey, ref BLENDFUNCTION pblend, Int32 dwFlags);
5、createParams.ExStyle |= 0x80000;是为了把窗口设为Layer窗口,一定要设置这个,不然窗口无法透明。其实这是API里面的CreateWindowEx函数创建窗口时用的扩展属性,可以参考MSDN。
1、IntPtr代表指针变量,是c#的基本类型。
2、BLENDFUNCTION是我定义的结构体,用于对应UpdateLayeredWindow这个API函数的BLENDFUNCTION类型参数:定义如下,UpdateLayeredWindow函数下面有说。
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct BLENDFUNCTION
{
public byte BlendOp;
public byte BlendFlags;
public byte SourceConstantAlpha;
public byte AlphaFormat;
}
3、SelectObject是API函数,这里把其作为常函数定义在Win32API这个类里面,作用是将对象选进DC。具体怎么在c#里面引用API函数,可以参考MSDN
[DllImport("gdi32.dll", ExactSpelling = true)]
public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);
4、UpdateLayeredWindow也是API函数,定义在Win32API这个类里面,作用是把设置窗口的透明度或透明方式(Alapha还是透明指定颜色),下面是这个函数在c#里面引用的方法。
[DllImport("user32.dll", ExactSpelling = true, SetLastError = true)]
public static extern Bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref Point pptDst, ref Size psize, IntPtr hdcSrc, ref Point pprSrc, Int32 crKey, ref BLENDFUNCTION pblend, Int32 dwFlags);
5、createParams.ExStyle |= 0x80000;是为了把窗口设为Layer窗口,一定要设置这个,不然窗口无法透明。其实这是API里面的CreateWindowEx函数创建窗口时用的扩展属性,可以参考MSDN。
2013-07-26
展开全部
可以的,不过一定要使用API来做。先把窗口设为Layer窗口,在form中重写CreateParams属性,如下:
protected override CreateParams CreateParams
{
get
{
CreateParams createParams = base.CreateParams;
createParams.ExStyle |= Win32API.0x80000;
return createParams;
}
}
再用UpdateLayeredWindow设置一下要重绘的透明图片,范例如下,用到的API和结构要自己查MSDN哦:
IntPtr screenDc = Win32API.GetDC(IntPtr.Zero);
IntPtr memDc = Win32API.CreateCompatibleDC(screenDc);
IntPtr hBitmap = IntPtr.Zero;
IntPtr hOldBitmap = IntPtr.Zero;
try
{
hBitmap = bitmap.GetHbitmap(Color.FromArgb(0));
hOldBitmap = Win32API.SelectObject(memDc, hBitmap);
Win32API.Size newSize = new Win32API.Size(bitmap.Width, bitmap.Height);
Win32API.Point sourceLocation = new Win32API.Point(0, 0);
Win32API.Point newLocation = new Win32API.Point(this.Left, this.Top);
Win32API.BLENDFUNCTION blend = new Win32API.BLENDFUNCTION();
blend.BlendOp = 0x00;
blend.BlendFlags = 0;
blend.SourceConstantAlpha = 255;
blend.AlphaFormat = 0x00;
Win32API.UpdateLayeredWindow(Handle, screenDc, ref newLocation, ref newSize,
memDc, ref sourceLocation, 0, ref blend, 0x02);
}
finally
{
Win32API.ReleaseDC(IntPtr.Zero, screenDc);
if (hBitmap != IntPtr.Zero)
{
Win32API.SelectObject(memDc, hOldBitmap);
Win32API.DeleteObject(hBitmap);
}
Win32API.DeleteDC(memDc);
}
protected override CreateParams CreateParams
{
get
{
CreateParams createParams = base.CreateParams;
createParams.ExStyle |= Win32API.0x80000;
return createParams;
}
}
再用UpdateLayeredWindow设置一下要重绘的透明图片,范例如下,用到的API和结构要自己查MSDN哦:
IntPtr screenDc = Win32API.GetDC(IntPtr.Zero);
IntPtr memDc = Win32API.CreateCompatibleDC(screenDc);
IntPtr hBitmap = IntPtr.Zero;
IntPtr hOldBitmap = IntPtr.Zero;
try
{
hBitmap = bitmap.GetHbitmap(Color.FromArgb(0));
hOldBitmap = Win32API.SelectObject(memDc, hBitmap);
Win32API.Size newSize = new Win32API.Size(bitmap.Width, bitmap.Height);
Win32API.Point sourceLocation = new Win32API.Point(0, 0);
Win32API.Point newLocation = new Win32API.Point(this.Left, this.Top);
Win32API.BLENDFUNCTION blend = new Win32API.BLENDFUNCTION();
blend.BlendOp = 0x00;
blend.BlendFlags = 0;
blend.SourceConstantAlpha = 255;
blend.AlphaFormat = 0x00;
Win32API.UpdateLayeredWindow(Handle, screenDc, ref newLocation, ref newSize,
memDc, ref sourceLocation, 0, ref blend, 0x02);
}
finally
{
Win32API.ReleaseDC(IntPtr.Zero, screenDc);
if (hBitmap != IntPtr.Zero)
{
Win32API.SelectObject(memDc, hOldBitmap);
Win32API.DeleteObject(hBitmap);
}
Win32API.DeleteDC(memDc);
}
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询