做winform项目时,有可能用到异步耗时加载数据啥的,这个时候就需要我们封装一个正在加载的效果。下面是实现思路:

步骤一:把当前form界面使用句柄的方式截图出一个图片,这个图片会在下面用到,使用句柄获取截图的方式会在最后代码展示里附录上。

步骤二:定义一个和当前form一样大小的panel,让这个panel带到当前form的Z顺序的最前面,把当前界面覆盖住,这样当前form的控件就不可点击。

步骤三:把从步骤一获取的图片设置为步骤而定义的panel的背景,这样让这个panel看起来是和界面一样的。

步骤四:在panel中间定义一个新的panel放置加载Loading图片和文字。

下面是封装的代码:

 public partial class customForm : Form
{
#region properties /// <summary>
/// 显示的等待框
/// </summary>
private System.Windows.Forms.Panel waitingBox; Panel waitingBoxInnerPanel; Label waitingBoxLab; private PictureBox _waitPicBox; private bool _IsWaitingBoxCreated = false; private bool _isOnWaiting = false; #endregion public baseLogin()
{
InitializeComponent(); //设置程序图标
Icon = Icon.FromHandle(Properties.Resources.icon.GetHicon()); //Task.Delay(1000).ContinueWith((t) => { CreateWaitingBox(); });
} public void ShowProgress(string message = "", int second = )
{
if (_isOnWaiting)
{
return;
}
_isOnWaiting = true;
this.Invoke(new Action(() =>
{
CreateWaitingBox();
SetWaitingMessage(message);
waitingBox.Visible = true;
waitingBox.BringToFront();
}));
} public void ShowMessage(string message = "", int second = )
{
if (_isOnWaiting)
{
return;
}
_isOnWaiting = true;
CreateWaitingBox();
SetWaitingMessage(message);
if (IsHandleCreated)
{
this.Invoke(new Action(() =>
{
waitingBox.Visible = true;
waitingBox.BringToFront();
}));
Task.Delay(second * ).ContinueWith((t) =>
{
DisMissMessage();
});
}
} public void DisMissMessage()
{
if (waitingBox == null)
{
return;
}
if (!waitingBox.Visible)
{
return;
}
else
{
this.Invoke(new Action(() =>
{
waitingBox.Visible = false;
this._isOnWaiting = false;
}));
}
} #region private private void CreateWaitingBox()
{ if (this.IsHandleCreated)
{
this.Invoke(new Action(() =>
{
//Image backImg = this.CreateBacgroundImage();
Control frm = this;
Image backImg = CaptureImage(ref frm);
if (!_IsWaitingBoxCreated)
{
waitingBox = new Panel()
{
Visible = false,
};
waitingBox.BackColor = Color.FromArgb(, , ); waitingBoxInnerPanel = new Panel();
waitingBoxInnerPanel.Width = ;
waitingBoxInnerPanel.Height = ;
waitingBoxInnerPanel.BackColor = Color.Gray;
waitingBoxInnerPanel.Padding = new Padding(, , , ); waitingBoxLab = new Label();
waitingBoxLab.TextAlign = ContentAlignment.MiddleLeft;
waitingBoxLab.AutoEllipsis = true;
waitingBoxLab.Dock = DockStyle.Fill; waitingBoxInnerPanel.Controls.Add(waitingBoxLab); PictureBox pb = new PictureBox();
pb.Dock = DockStyle.Left;
pb.Size = new System.Drawing.Size(, );
pb.Image = Properties.Resources.loading;
pb.Margin = new System.Windows.Forms.Padding(, , , );
pb.SizeMode = PictureBoxSizeMode.StretchImage;
this._waitPicBox = pb;
waitingBoxInnerPanel.Controls.Add(pb); waitingBox.Controls.Add(waitingBoxInnerPanel);
//waitingBox.BringToFront();
if (!this.Controls.Contains(waitingBox))
{
this.Controls.Add(waitingBox);
}
//waitingBox.Show(); this._IsWaitingBoxCreated = true; } Rectangle rect = this.ClientRectangle;
waitingBox.Width = rect.Width;
waitingBox.Height = rect.Height;
waitingBox.Location = new Point(rect.X, rect.Y); waitingBox.BackgroundImage = backImg;
waitingBox.BackgroundImageLayout = ImageLayout.Stretch;
}));
}
} /// <summary>
/// 设置等待显示的信息
/// </summary>
/// <param name="message">The message.</param>
/// User:Ryan CreateTime:2012-8-5 16:22.
private void SetWaitingMessage(string message)
{
if (this.IsHandleCreated)
{
this.Invoke(new Action(() =>
{
message = " " + message.Trim();
if (this.waitingBoxLab != null && this.waitingBoxInnerPanel != null)
{
using (Graphics g = this.CreateGraphics())
{
int w = Convert.ToInt32(g.MeasureString(message, this.waitingBoxLab.Font).Width);
w = w >= ? w : ;
w = this.Width - >= w ? w : this.Width - ;
this.waitingBoxInnerPanel.Width = w + ;
waitingBoxInnerPanel.Location = new Point(waitingBox.Bounds.X + waitingBox.Width / - waitingBoxInnerPanel.Width / ,
waitingBox.Bounds.Y + waitingBox.Height / - waitingBoxInnerPanel.Height);
} this.waitingBoxLab.Text = message;
}
}));
}
} private Bitmap CreateBacgroundImage()
{
Rectangle rect = this.ClientRectangle;
int w = rect.Width;
int h = rect.Height;
try
{
Bitmap img = new Bitmap(w, h);
using (Graphics g = Graphics.FromImage(img))
{
g.CopyFromScreen(new Point(this.Location.X, this.Location.Y), new Point(, ), new Size(w, h));
}
//img.Save("a.jpg");
return img;
}
catch (Exception ex)
{
return null;
}
} public Bitmap CaptureImage(ref Control c)
{
int hDC;
int sh;
int sw;
if (c == null)
{
hDC = GetDC();
sw = Screen.PrimaryScreen.Bounds.Width;
sh = Screen.PrimaryScreen.Bounds.Height;
}
else
{
hDC = GetDC((int)c.Handle);
sw = c.Width;
sh = c.Height;
}
int hMDC = CreateCompatibleDC(hDC);
int hBMP = CreateCompatibleBitmap(hDC, sw, sh);
int hBMPOld = SelectObject(hMDC, hBMP);
BitBlt(hMDC, , , sw, sh, hDC, , , 0xcc0020);
hBMP = SelectObject(hMDC, hBMPOld);
Bitmap result = Image.FromHbitmap(new IntPtr(hBMP));
DeleteDC(hDC);
DeleteDC(hMDC);
DeleteObject(hBMP);
return result;
}
[DllImport("gdi32.dll", EntryPoint = "CreateCompatibleBitmap")]
public static extern int CreateCompatibleBitmap(int hdc, int nWidth, int nHeight);
[DllImport("gdi32.dll", EntryPoint = "CreateCompatibleDC")]
public static extern int CreateCompatibleDC(int hdc);
[DllImport("user32.dll", EntryPoint = "GetDC")]
public static extern int GetDC(int hwnd);
[DllImport("gdi32.dll", EntryPoint = "DeleteDC")]
public static extern int DeleteDC(int hdc);
[DllImport("gdi32.dll", EntryPoint = "SelectObject")]
public static extern int SelectObject(int hdc, int hObject);
[DllImport("gdi32.dll", EntryPoint = "DeleteObject")]
public static extern int DeleteObject(int hObject);
[DllImport("gdi32.dll", EntryPoint = "BitBlt")]
public static extern int BitBlt(int hDestDC, int x, int y, int nWidth, int nHeight, int hSrcDC, int xSrc, int ySrc, int dwRop); #endregion }

封装代码

下面是示例代码:

  public partial class Form1:customForm
{
private void button1_Click(object sender,EventArgs e)
{
ShowMessage("我是消息");
}
}

winform Loading效果的更多相关文章

  1. 页面loading效果

    当网页太大,打开太慢的时候,为了增加良好的用户体验(不让用户眼巴巴的等,心中暗骂c,这么慢),我们需要加一个等待动画. 只需把以下代码加入页面中即可,图片可以根据自己的需求更换,更换图片之后需要改变l ...

  2. 网页Loading效果

    问题描述:由于项目要求在页面提交以及加载的时候,有短暂的卡顿,需要用loading过渡. 1.下一个页面加载的时候实现: base-loading.js //获取浏览器页面可见高度和宽度 var _P ...

  3. 一个不错的loading效果--IT蓝豹

    一个不错的loading效果 介绍:一个不错的loading加载效果,弹性收缩,效果不错,学习android动画的朋友可以下载来研究研究本例子其实由SeekBar实现,由MetaballView,Me ...

  4. 【转】 CSS3实现10种Loading效果

    昨晚用CSS3实现了几种常见的Loading效果,虽然很简单,但还是分享一下,顺便也当是做做笔记…… PS:如需转载,请注明出处! 第1种效果: 代码如下: <div class="l ...

  5. jQuery8种不同的瀑布流懒加载loading效果

    优化图片加载插件jQuery8种不同的瀑布流懒加载loading效果  在线预览 下载地址 实例代码 <ul class="grid effect-1" id="g ...

  6. HTML5 Canvas 实现的9个 Loading 效果

    Sonic.js 是一个很小的 JavaScript 类,用于创建基于 HTML5 画布的加载图像.更强大的是 Sonic.js 还提供了基于现成的例子的创建工具,可以帮助你实现更多自定义的(Load ...

  7. 加载状态为complete时移除loading效果

    一.JS代码: //获取浏览器页面可见高度和宽度 var _PageHeight = document.documentElement.clientHeight, _PageWidth = docum ...

  8. CSS3轻松实现清新 Loading 效果

    至今HTML5中国已经为大家分享过几百种基于 CSS3 的Loading加载动画,效果酷炫代码简洁,非常值得学习借鉴;今天就先给大家分享两个常用的CSS3的Loading的案例. 第一种效果: HTM ...

  9. 一个很酷的加载loading效果--IT蓝豹

    一个很酷的加载loading效果,自定义LeafLoadingView实现,LeafLoadingView继承view, 本例子主要由以下几点构成 (1):RotateAnimation实现叶子旋转 ...

随机推荐

  1. Oracle 学习笔记(Windows 环境下安装 + PL/SQL)

    Oracle 安装.PL/SQL 配置使用  前言:因更换机械硬盘为 SSD 固态硬盘装了新 Windows 7 系统,需要重新搭建开发环境,把 Oracle 安装过程和 PL/SQL 配置使用做下笔 ...

  2. 【BZOJ 3620】似乎在梦中见过的样子

    题目 (夢の中で逢った.ような--) 「Madoka,不要相信 QB!」伴随着 Homura 的失望地喊叫,Madoka 与 QB 签订了契约. 这是 Modoka 的一个噩梦,也同时是上个轮回中所发 ...

  3. C++模板编程-模板基础重点

    模板基础 1.模板参数自动推导,如果是已知的参数类型与个数,这调用模板时可以不写类型. Cout<<max<int>(1,3);可以写为Cout<<max(1,3) ...

  4. 【LoadRunner】loadrunner常见问题汇总

    LoadRunner常见问题1.LR 脚本为空的解决方法: 1.去掉ie设置中的第三方支持取消掉 2.在系统属性-高级-性能-数据执行保护中,添加loadrunner安装目录中的vugen.exe文件 ...

  5. JDBC 学习笔记(十二)—— DataSource

    在 JDBC 的实现过程中,最消耗资源的从来不是执行 SQL 之类的过程,而是获取-释放 数据库连接 Connection 的过程. 之前通过 DriverManager 获得的数据库连接对象,每一个 ...

  6. 第六篇:python基础_6 内置函数与常用模块(一)

    本篇内容 内置函数 匿名函数 re模块 time模块 random模块 os模块 sys模块 json与pickle模块 shelve模块 一. 内置函数 1.定义 内置函数又被称为工厂函数. 2.常 ...

  7. 【bzoj3930】[CQOI2015]选数 莫比乌斯反演+杜教筛

    题目描述 我们知道,从区间[L,H](L和H为整数)中选取N个整数,总共有(H-L+1)^N种方案.小z很好奇这样选出的数的最大公约数的规律,他决定对每种方案选出的N个整数都求一次最大公约数,以便进一 ...

  8. git版本控制的常用指令

    使用git版本控制之前,首先安装好git,安装方式比如可以通过下载客户等方式来安装:这里提供网址:http://windows.github.com/ 1.登入远程仓库,创建仓库2.复制仓库地址3.在 ...

  9. poj 3053 优先队列处理

    Fence Repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 39029   Accepted: 12681 De ...

  10. webpack 样式模块打包深入学习

    1. style-loader css-loader sass-loader 分别的作用 style-loader: 将所有的样式嵌入到dom的style属性当中. css-loader: 将css当 ...