Winforms 带图像的透明Winform

Winforms 带图像的透明Winform,winforms,transparency,Winforms,Transparency,我有一个图像(PNG文件),其alpha通道设置为50%不透明。当我尝试在透明键设置为白色,背景色设置为白色的窗体上绘制图像时,我希望图像绘制时50%透明。然而,它是混合形式的背景色第一,因此它是完全不透明的。这有什么办法吗?我不想设置窗体的不透明属性,因为窗体上的某些图像需要半透明,而某些图像需要不透明。我认为您不能。我们有一个启动屏幕,在那里我们做了类似的事情,但我们最终捕获了屏幕并将其设置为表单的背景图像。显然,这似乎只起作用,如果屏幕改变,窗体的背景就不会改变,事情看起来很奇怪。如果你能

我有一个图像(PNG文件),其alpha通道设置为50%不透明。当我尝试在透明键设置为白色,背景色设置为白色的窗体上绘制图像时,我希望图像绘制时50%透明。然而,它是混合形式的背景色第一,因此它是完全不透明的。这有什么办法吗?我不想设置窗体的不透明属性,因为窗体上的某些图像需要半透明,而某些图像需要不透明。

我认为您不能。我们有一个启动屏幕,在那里我们做了类似的事情,但我们最终捕获了屏幕并将其设置为表单的背景图像。显然,这似乎只起作用,如果屏幕改变,窗体的背景就不会改变,事情看起来很奇怪。如果你能找到更好的方法,我很想知道

下面是捕获屏幕的代码,只需将ScreenRect设置为窗体屏幕坐标并调用Process():

使用系统;
使用系统图;
使用System.Runtime.InteropServices;
命名空间TourFactory.Core.Drawing
{
公共类capturescreen命令
{
#区域初始化和销毁
公共捕获屏幕命令()
{
}
#端区
#区域字段和属性
//BitBlt是一个多用途函数,采用ROP(光栅操作)代码
//0xCC0020是ROP代码SRCCOPY,即。
//执行从源到目标的简单复制。
私有常量int cRasterOp_SrcCopy=0xCC0020;//13369376;
私有矩形mScreenRect;
/// 
///获取或设置要捕获的屏幕坐标。
/// 
公共矩形ScreenRect
{
获取{return mscreentrect;}
设置{mScreenRect=value;}
}
#端区
#区域方法
公众形象处理()
{
//使用GDI调用并为整个显示器创建DC
var dc1=CreateDC(“显示”,null,0,0);
var g1=图形。来自HDC(dc1);
//创建窗体大小的兼容位图
var bmp=新位图(mScreenRect.Width,mScreenRect.Height,g1);
var g2=Graphics.FromImage(bmp);
//现在返回我们的步骤,获取位图和屏幕的设备上下文
//注意:显然您必须这样做,并且不能直接从获取的dc进入,否则会抛出异常
//当您尝试释放dcs时
dc1=g1.GetHdc();
var dc2=g2.GetHdc();
//将屏幕放大到位图中
BitBlt(dc2,0,0,mScreenRect.Width,mScreenRect.Height,dc1,mScreenRect.Left,mScreenRect.Top,crasteropsrcCopy);
//记住释放dc,否则会出现问题
g1.释放HDC(dc1);
g2.释放HDC(dc2);
//返回位图
返回bmp;
}
#端区
#区域gdi32.dll
[DllImport(“gdi32”)]
私有静态外部IntPtr CreateDC(字符串lpDriverName、字符串lpDeviceName、int lpOutput、int lpInitData);
[DllImport(“gdi32”)]
私有静态外部bool BitBlt(IntPtr hdcDest、intxdest、intydest、intwidth、intheight、IntPtr hdcSrc、intxsrc、intysrc、intdwrop);
#端区
}
}

我想你做不到。我们有一个启动屏幕,在那里我们做了类似的事情,但我们最终捕获了屏幕并将其设置为表单的背景图像。显然,这似乎只起作用,如果屏幕改变,窗体的背景就不会改变,事情看起来很奇怪。如果你能找到更好的方法,我很想知道

下面是捕获屏幕的代码,只需将ScreenRect设置为窗体屏幕坐标并调用Process():

使用系统;
使用系统图;
使用System.Runtime.InteropServices;
命名空间TourFactory.Core.Drawing
{
公共类capturescreen命令
{
#区域初始化和销毁
公共捕获屏幕命令()
{
}
#端区
#区域字段和属性
//BitBlt是一个多用途函数,采用ROP(光栅操作)代码
//0xCC0020是ROP代码SRCCOPY,即。
//执行从源到目标的简单复制。
私有常量int cRasterOp_SrcCopy=0xCC0020;//13369376;
私有矩形mScreenRect;
/// 
///获取或设置要捕获的屏幕坐标。
/// 
公共矩形ScreenRect
{
获取{return mscreentrect;}
设置{mScreenRect=value;}
}
#端区
#区域方法
公众形象处理()
{
//使用GDI调用并为整个显示器创建DC
var dc1=CreateDC(“显示”,null,0,0);
var g1=图形。来自HDC(dc1);
//创建窗体大小的兼容位图
var bmp=新位图(mScreenRect.Width,mScreenRect.Height,g1);
var g2=Graphics.FromImage(bmp);
//现在返回我们的步骤,获取位图和屏幕的设备上下文
//注意:显然您必须这样做,并且不能直接从获取的dc进入,否则会抛出异常
//当您尝试释放dcs时
dc1=g1.GetHdc();
var dc2=g2.GetHdc();
//将屏幕放大到位图中
BitBlt(dc2,0,0,mScreenRect.Width,mScreenRect.Height,dc1,mScreenRect.Left,mScreenRect.Top,crasteropsrcCopy);
//记住释放dc,否则会出现问题
g1.释放HDC(dc1);
g2.释放HDC(dc2);
//返回位图
返回bmp
using System;
using System.Drawing;
using System.Runtime.InteropServices;

namespace TourFactory.Core.Drawing
{
    public class CaptureScreenCommand
    {

        #region Initialization and Destruction

        public CaptureScreenCommand()
        {
        }

        #endregion

        #region Fields and Properties

        // BitBlt is a multipurpose function that takes a ROP (Raster OPeration) code
        // that controls exactly what it does. 0xCC0020 is the ROP code SRCCOPY, i.e.
        // do a simple copy from the source to the destination.
        private const int cRasterOp_SrcCopy = 0xCC0020; // 13369376;

        private Rectangle mScreenRect;
        /// <summary>
        /// Gets or sets the screen coordinates to capture.
        /// </summary>
        public Rectangle ScreenRect
        {
            get { return mScreenRect; }
            set { mScreenRect = value; }
        }

        #endregion

        #region Methods

        public Image Process()
        {
            // use the GDI call and create a DC to the whole display
            var dc1 = CreateDC("DISPLAY", null, 0, 0);
            var g1 = Graphics.FromHdc(dc1);

            // create a compatible bitmap the size of the form
            var bmp = new Bitmap(mScreenRect.Width, mScreenRect.Height, g1);
            var g2 = Graphics.FromImage(bmp);

            // Now go retrace our steps and get the device contexts for both the bitmap and the screen
            // Note: Apparently you have to do this, and can't go directly from the aquired dc or exceptions are thrown
            // when you try to release the dcs
            dc1 = g1.GetHdc();
            var dc2 = g2.GetHdc();

            // Bit Blast the screen into the Bitmap
            BitBlt(dc2, 0, 0, mScreenRect.Width, mScreenRect.Height, dc1, mScreenRect.Left, mScreenRect.Top, cRasterOp_SrcCopy);

            // Remember to release the dc's, otherwise problems down the road
            g1.ReleaseHdc(dc1);
            g2.ReleaseHdc(dc2);

            // return bitmap
            return bmp;
        }

        #endregion

        #region gdi32.dll

        [DllImport("gdi32")]
        private static extern IntPtr CreateDC(string lpDriverName, string lpDeviceName, int lpOutput, int lpInitData);

        [DllImport("gdi32")]
        private static extern bool BitBlt(IntPtr hdcDest, int xDest, int yDest, int width, int height, IntPtr hdcSrc, int xSrc, int ySrc, int dwRop);

        #endregion

    }
}