使用方法
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);
}
}
}