C#制作半透明等待窗体的类

使用方法

private Zgke.WindowFrom.Window.LoadLoginingImage _Image = new Zgke.WindowFrom.Window.LoadLoginingImage();
private void Form1_Load(object sender, EventArgs e)
{

_Image.Opactiy = 100;
_Image.Show(Image.FromFile(@"C:\FormBackImage.png"));
_Image.FormPoint = new Point(700, 700);

}

在关闭的时候

Opactiy 为透明程度 0-255  byte

FormPoint  位置  Point

Show 显示窗体的方法 这里要注意 如果使用 Opactiy 设置为半透明  图形必须为32位真彩图形

FormMove  窗体是否能移动  (这个移动是通过消息出里来的,效果可能不理想 有需要自己改把)

Hide 终止窗体的显示

下面是全部代码

 

using System;  
using System.Collections.Generic;  
using System.Text;  
using System.Threading;  
using System.Windows.Forms;  
using System.Drawing;  
using System.Drawing.Imaging;  
using System.Runtime.InteropServices;  
  
namespace Zgke.WindowFrom.Window  
{  
    /// <summary>  
    /// 显示半透明等待窗体  
    /// zgke@sina.com  
    /// qq:116149  
    /// </summary>  
    public class LoadLoginingImage  
    {  
  
        private class ShowForm : Form  
        {  
            public bool m_FormMove = false;  
  
            public ShowForm()  
            {  
                base.FormBorderStyle = FormBorderStyle.None;  
                base.TopMost = true;  
                base.ShowInTaskbar = false;  
                base.StartPosition = FormStartPosition.Manual;  
            }  
  
            protected override CreateParams CreateParams  
            {  
                get  
                {  
                    CreateParams cp = base.CreateParams;  
                    cp.ExStyle |= 0x00080000; // This form has to have the WS_EX_LAYERED extended style  
                    return cp;  
                }  
            }  
  
            protected override void WndProc(ref Message m)  
            {  
                if (m.Msg == 0x0084 && m_FormMove)  
                {  
                    m.Result = (IntPtr)2;   // HTCLIENT  
                    return;  
                }  
                base.WndProc(ref m);  
            }  
        }  
  
  
  
        private byte m_Opactiy = 255;  
  
        /// <summary>   
        /// 透明度 图形必须是32位的这个值才有效果  
        /// </summary>  
        public byte Opactiy { get { return m_Opactiy; } set { m_Opactiy = value; m_SetOpactiy = true; } }  
        /// <summary>  
        /// 是否可以移动  
        /// </summary>  
        public bool FormMove { get { return m_Form.m_FormMove; } set { m_Form.m_FormMove = value; } }  
        /// <summary>  
        /// 设置位置  
        /// </summary>  
        public Point FormPoint { get { return m_Form.Location; } set { m_Form.Location = value; } }  
  
        /// <summary>  
        /// 设置图形为半透明  
        /// </summary>  
        /// <param name="p_Form"></param>  
        /// <param name="p_Bitmap"></param>  
        private void SetBitmap(Form p_Form, Bitmap p_Bitmap)  
        {  
            m_SetOpactiy = false;  
            if (p_Bitmap.PixelFormat != PixelFormat.Format32bppArgb) return;  
            IntPtr _ScreenDC = Win32API.GetDC(IntPtr.Zero);  
            IntPtr _DC = Win32API.CreateCompatibleDC(_ScreenDC);  
            IntPtr _BitmapIntPtr = IntPtr.Zero;  
            IntPtr _OldBitmapIntPtr = IntPtr.Zero;  
            try  
            {  
                _BitmapIntPtr = p_Bitmap.GetHbitmap(Color.FromArgb(0));  // grab a GDI handle from this GDI+ bitmap  
                _OldBitmapIntPtr = Win32API.SelectObject(_DC, _BitmapIntPtr);  
  
                SIZE _Size = new SIZE();  
                _Size.cx = p_Bitmap.Width;  
                _Size.cy = p_Bitmap.Height;  
  
                POINT _Point = new POINT();  
                _Point.x = p_Form.Left;  
                _Point.y = p_Form.Top;  
  
                POINT _SourcePoint = new POINT();  
  
                BLENDFUNCTION _Blend = new BLENDFUNCTION();  
                _Blend.BlendOp = (byte)AlphaFlags.AC_SRC_OVER;  
                _Blend.BlendFlags = 0;  
                _Blend.SourceConstantAlpha = m_Opactiy;  
                _Blend.AlphaFormat = (byte)AlphaFlags.AC_SRC_ALPHA;  
  
                Win32API.UpdateLayeredWindow(p_Form.Handle, _ScreenDC, ref _Point, ref _Size, _DC, ref _SourcePoint, 0, ref _Blend, (int)UpdateLayeredWindowsFlags.ULW_ALPHA);  
            }  
            finally  
            {  
                Win32API.ReleaseDC(IntPtr.Zero, _ScreenDC);  
                if (_BitmapIntPtr != IntPtr.Zero)  
                {  
                    Win32API.SelectObject(_DC, _OldBitmapIntPtr);  
  
                    Win32API.DeleteObject(_BitmapIntPtr);  
                }  
                Win32API.DeleteDC(_DC);  
            }  
        }  
  
        private Thread m_Thread;  
        private ShowForm m_Form = new ShowForm();  
        private Bitmap m_Image;  
        private bool m_SetOpactiy = false;  
  
        /// <summary>  
        /// 私有方法 如果需要改动样式就改动这里  
        /// </summary>  
        /// <param name="p_Image"></param>  
        private void ShowLoginingForm(object p_Image)  
        {  
            lock (p_Image)  
            {  
                m_Image = (Bitmap)p_Image;  
                m_Form.Size = m_Image.Size;  
                m_Form.BackgroundImage = m_Image;  
                m_Form.Show();  
                while (true)  
                {  
                    if (m_SetOpactiy) SetBitmap(m_Form, m_Image);  
                    Application.DoEvents();  
                }  
            }  
        }  
  
        /// <summary>  
        /// 显示图形  
        /// </summary>  
        /// <param name="p_Image"></param>  
        public void Show(Image p_Image)  
        {  
            if (p_Image == null) return;  
            m_Thread = new Thread(new ParameterizedThreadStart(ShowLoginingForm));  
            m_Thread.Start(p_Image);  
        }  
  
        /// <summary>  
        /// 隐藏图形  
        /// </summary>  
        public void Hide()  
        {  
            m_Thread.Abort();  
        }  
  
        [StructLayout(LayoutKind.Sequential)]  
        public struct SIZE  
        {  
            public int cx;  
            public int cy;  
        }  
  
        [StructLayout(LayoutKind.Sequential)]  
        public struct POINT  
        {  
            public int x;  
            public int y;  
        }  
  
        [StructLayout(LayoutKind.Sequential, Pack = 1)]  
        public struct BLENDFUNCTION  
        {  
            public byte BlendOp;  
            public byte BlendFlags;  
            public byte SourceConstantAlpha;  
            public byte AlphaFormat;  
        }  
  
        public enum UpdateLayeredWindowsFlags  
        {  
            ULW_COLORKEY = 0x00000001,  
            ULW_ALPHA = 0x00000002,  
            ULW_OPAQUE = 0x00000004  
        }  
        public enum AlphaFlags : byte  
        {  
            AC_SRC_OVER = 0x00,  
            AC_SRC_ALPHA = 0x01  
        }  
  
  
  
        public class Win32API  
        {  
  
            [DllImport("gdi32.dll")]  
            public static extern IntPtr CreateCompatibleDC(IntPtr hDC);  
  
            [DllImport("gdi32.dll")]  
            public static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);  
  
            [DllImport("user32.dll", CharSet = CharSet.Auto)]  
            public static extern IntPtr GetDC(IntPtr hWnd);  
  
            [DllImport("User32.dll", CharSet = CharSet.Auto)]  
            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);  
  
            [DllImport("user32.dll", CharSet = CharSet.Auto)]  
            public static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);  
  
            [DllImport("gdi32.dll")]  
            public static extern bool DeleteObject(IntPtr hObject);  
  
            [DllImport("gdi32.dll")]  
            public static extern IntPtr DeleteDC(IntPtr hDC);  
        }  
    }  
  
}