RaUI/Source/MyDb/_SCREEN_CAPTURE/FrmCapture.cs
鑫Intel a3f978b187 ### 2021-06-12更新
------
#### Itrycn_Project2    V1.0.2106.1201
- *.[新增]新增加入皮肤功能。
- *.[新增]对话框全部使用皮肤。
- *.[新增]新增加入扫描模板,快速开发扫描功能。
- *.[改进]公共变量进行区分设置,更加规范。
2021-06-12 22:09:49 +08:00

570 lines
27 KiB
C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Drawing.Imaging;
namespace _SCREEN_CAPTURE
{
/// <summary>
///
/// </summary>
internal partial class FrmCapture : Form
{
/// <summary>
///
/// </summary>
public FrmCapture() {
InitializeComponent();
this.FormBorderStyle = FormBorderStyle.None;
this.Location = new Point(0, 0);
this.Size = new Size(Screen.PrimaryScreen.Bounds.Width,
Screen.PrimaryScreen.Bounds.Height);
this.TopMost = true;
this.ShowInTaskbar = false;
m_MHook = new MouseHook();
this.FormClosed += (s, e) => { m_MHook.UnLoadHook(); this.DelResource(); };
imageProcessBox1.MouseLeave += (s, e) => this.Cursor = Cursors.Default;
//后期一些操作历史记录图层
m_layer = new List<Bitmap>();
}
private void DelResource() {
//if (m_bmpLayerCurrent != null) m_bmpLayerCurrent.Dispose();
if (m_bmpLayerShow != null) m_bmpLayerShow.Dispose();
m_layer.Clear();
imageProcessBox1.DeleResource();
GC.Collect();
}
#region Properties
private bool isCaptureCursor;
/// <summary>
/// 获取或设置是否捕获鼠标
/// </summary>
public bool IsCaptureCursor {
get { return isCaptureCursor; }
set { isCaptureCursor = value; }
}
/// <summary>
/// 获取或设置是否显示图像信息
/// </summary>
public bool ImgProcessBoxIsShowInfo {
get { return imageProcessBox1.IsShowInfo; }
set { imageProcessBox1.IsShowInfo = value; }
}
/// <summary>
/// 获取或设置操作框点的颜色
/// </summary>
public Color ImgProcessBoxDotColor {
get { return imageProcessBox1.DotColor; }
set { imageProcessBox1.DotColor = value; }
}
/// <summary>
/// 获取或设置操作框边框颜色
/// </summary>
public Color ImgProcessBoxLineColor {
get { return imageProcessBox1.LineColor; }
set { imageProcessBox1.LineColor = value; }
}
/// <summary>
/// 获取或设置放大图形的原始尺寸
/// </summary>
public Size ImgProcessBoxMagnifySize {
get { return imageProcessBox1.MagnifySize; }
set { imageProcessBox1.MagnifySize = value; }
}
/// <summary>
/// 获取或设置放大图像的倍数
/// </summary>
public int ImgProcessBoxMagnifyTimes {
get { return imageProcessBox1.MagnifyTimes; }
set { imageProcessBox1.MagnifyTimes = value; }
}
#endregion
//初始化参数
private void InitMember() {
panel1.Visible = false;
panel2.Visible = false;
panel1.BackColor = Color.White;
panel2.BackColor = Color.White;
panel1.Height = tBtn_Finish.Bottom + 3;
panel1.Width = tBtn_Finish.Right + 3;
panel2.Height = colorBox1.Height;
panel1.Paint += (s, e) => e.Graphics.DrawRectangle(Pens.SteelBlue, 0, 0, panel1.Width - 1, panel1.Height - 1);
panel2.Paint += (s, e) => e.Graphics.DrawRectangle(Pens.SteelBlue, 0, 0, panel2.Width - 1, panel2.Height - 1);
tBtn_Rect.Click += new EventHandler(selectToolButton_Click);
tBtn_Ellipse.Click += new EventHandler(selectToolButton_Click);
tBtn_Arrow.Click += new EventHandler(selectToolButton_Click);
tBtn_Brush.Click += new EventHandler(selectToolButton_Click);
tBtn_Text.Click += new EventHandler(selectToolButton_Click);
tBtn_Close.Click += (s, e) => this.Close();
textBox1.BorderStyle = BorderStyle.None;
textBox1.Visible = false;
textBox1.ForeColor = Color.Red;
colorBox1.ColorChanged += (s, e) => textBox1.ForeColor = e.Color;
}
private MouseHook m_MHook;
private List<Bitmap> m_layer; //记录历史图层
private bool m_isStartDraw;
private Point m_ptOriginal;
private Point m_ptCurrent;
/// <summary>
///
/// </summary>
public Bitmap m_bmpLayerCurrent { get; set; }
private Bitmap m_bmpLayerShow;
private void FrmCapture_Load(object sender, EventArgs e) {
this.InitMember();
imageProcessBox1.BaseImage = this.GetScreen();
m_MHook.SetHook();
m_MHook.MHookEvent += new MouseHook.MHookEventHandler(m_MHook_MHookEvent);
imageProcessBox1.IsDrawOperationDot = false;
this.BeginInvoke(new MethodInvoker(() => this.Enabled = false));
timer1.Interval = 500;
timer1.Enabled = true;
}
private void m_MHook_MHookEvent(object sender, MHookEventArgs e) {
//如果窗体禁用 调用控件的方法设置信息显示位置
if (!this.Enabled) //貌似Hook不能精确坐标(Hook最先执行执 执行完后的坐标可能与执行时传入的坐标发生了变化 猜测是这样) 所以放置了一个timer检测
imageProcessBox1.SetInfoPoint(MousePosition.X, MousePosition.Y);
//鼠标点下恢复窗体禁用
if (e.MButton == ButtonStatus.LeftDown || e.MButton == ButtonStatus.RightDown) {
this.Enabled = true;
imageProcessBox1.IsDrawOperationDot = true;
}
#region imageProcessBox_MouseUp中完成了
//if (e.MButton == ButtonStatus.LeftUp) {
// //if (imageProcessBox1.SelectedRectangle.Width < 5
// // || imageProcessBox1.SelectedRectangle.Height < 5) {
// // //如果选取区域不符要求 向控件模拟鼠标抬起 然后禁用窗体
// // //(Hook事件先于控件事件 禁用控件时模拟一个鼠标抬起)
// // Win32.SendMessage(imageProcessBox1.Handle, Win32.WM_LBUTTONUP,
// // IntPtr.Zero, (IntPtr)(MousePosition.Y << 16 | MousePosition.X));
// // this.Enabled = false;
// // imageProcessBox1.IsDrawOperationDot = false;
// //} else
// // this.SetToolBarLocation(); //重置工具条位置
//}
#endregion
#region
if (e.MButton == ButtonStatus.RightUp) {
if (!imageProcessBox1.IsDrawed) //没有绘制那么退出(直接this.Close右键将传递到下面)
this.BeginInvoke(new MethodInvoker(() => this.Close()));
//有绘制的情况 情况继续禁用窗体
this.Enabled = false;
imageProcessBox1.ClearDraw();
imageProcessBox1.CanReset = true;
imageProcessBox1.IsDrawOperationDot = false;
m_layer.Clear(); //清空历史记录
m_bmpLayerCurrent = null;
m_bmpLayerShow = null;
ClearToolBarBtnSelected();
panel1.Visible = false;
panel2.Visible = false;
}
#endregion
#region
if (!this.Enabled) {
this.FoundAndDrawWindowRect();
}
#endregion
}
//工具条前五个按钮绑定的公共事件
private void selectToolButton_Click(object sender, EventArgs e) {
panel2.Visible = ((ToolButton)sender).IsSelected;
if (panel2.Visible) imageProcessBox1.CanReset = false;
else { imageProcessBox1.CanReset = m_layer.Count == 0; }
this.SetToolBarLocation();
}
#region
private void imageProcessBox1_MouseDown(object sender, MouseEventArgs e) {
if (imageProcessBox1.Cursor != Cursors.SizeAll &&
imageProcessBox1.Cursor != Cursors.Default)
panel1.Visible = false; //表示改变选取大小 隐藏工具条
//若果在选取类点击 并且有选择工具
if (e.Button == MouseButtons.Left && imageProcessBox1.IsDrawed && HaveSelectedToolButton()) {
if (imageProcessBox1.SelectedRectangle.Contains(e.Location)) {
if (tBtn_Text.IsSelected) { //如果选择的是绘制文本 弹出文本框
textBox1.Location = e.Location;
textBox1.Visible = true;
textBox1.Focus();
return;
}
m_isStartDraw = true;
Cursor.Clip = imageProcessBox1.SelectedRectangle;
}
}
m_ptOriginal = e.Location;
}
private void imageProcessBox1_MouseMove(object sender, MouseEventArgs e) {
m_ptCurrent = e.Location;
//根据是否选择有工具决定 鼠标指针样式
if (imageProcessBox1.SelectedRectangle.Contains(e.Location) && HaveSelectedToolButton() && imageProcessBox1.IsDrawed)
this.Cursor = Cursors.Cross;
else if (!imageProcessBox1.SelectedRectangle.Contains(e.Location))
this.Cursor = Cursors.Default;
if (imageProcessBox1.IsStartDraw && panel1.Visible) //在重置选取的时候 重置工具条位置(成立于移动选取的时候)
this.SetToolBarLocation();
if (m_isStartDraw && m_bmpLayerShow != null) { //如果在区域内点下那么绘制相应图形
using (Graphics g = Graphics.FromImage(m_bmpLayerShow)) {
int tempWidth = 1;
if (toolButton2.IsSelected) tempWidth = 3;
if (toolButton3.IsSelected) tempWidth = 5;
Pen p = new Pen(colorBox1.SelectedColor, tempWidth);
#region
if (tBtn_Rect.IsSelected) {
int tempX = e.X - m_ptOriginal.X > 0 ? m_ptOriginal.X : e.X;
int tempY = e.Y - m_ptOriginal.Y > 0 ? m_ptOriginal.Y : e.Y;
g.Clear(Color.Transparent);
g.DrawRectangle(p, tempX - imageProcessBox1.SelectedRectangle.Left, tempY - imageProcessBox1.SelectedRectangle.Top, Math.Abs(e.X - m_ptOriginal.X), Math.Abs(e.Y - m_ptOriginal.Y));
imageProcessBox1.Invalidate();
}
#endregion
#region
if (tBtn_Ellipse.IsSelected) {
g.DrawLine(Pens.Red, 0, 0, 200, 200);
g.Clear(Color.Transparent);
g.DrawEllipse(p, m_ptOriginal.X - imageProcessBox1.SelectedRectangle.Left, m_ptOriginal.Y - imageProcessBox1.SelectedRectangle.Top, e.X - m_ptOriginal.X, e.Y - m_ptOriginal.Y);
imageProcessBox1.Invalidate();
}
#endregion
#region
if (tBtn_Arrow.IsSelected) {
g.Clear(Color.Transparent);
System.Drawing.Drawing2D.AdjustableArrowCap lineArrow =
new System.Drawing.Drawing2D.AdjustableArrowCap(4, 4, true);
p.CustomEndCap = lineArrow;
g.DrawLine(p, (Point)((Size)m_ptOriginal - (Size)imageProcessBox1.SelectedRectangle.Location), (Point)((Size)m_ptCurrent - (Size)imageProcessBox1.SelectedRectangle.Location));
imageProcessBox1.Invalidate();
}
#endregion
#region 线
if (tBtn_Brush.IsSelected) {
Point ptTemp = (Point)((Size)m_ptOriginal - (Size)imageProcessBox1.SelectedRectangle.Location);
p.LineJoin = System.Drawing.Drawing2D.LineJoin.Round;
g.DrawLine(p, ptTemp, (Point)((Size)e.Location - (Size)imageProcessBox1.SelectedRectangle.Location));
m_ptOriginal = e.Location;
imageProcessBox1.Invalidate();
}
#endregion
p.Dispose();
}
}
}
private void imageProcessBox1_MouseUp(object sender, MouseEventArgs e) {
if (!imageProcessBox1.IsDrawed) { //如果没有成功绘制选取 继续禁用窗体
this.Enabled = false;
imageProcessBox1.IsDrawOperationDot = false;
} else if (!panel1.Visible) { //否则显示工具条
this.SetToolBarLocation(); //重置工具条位置
panel1.Visible = true;
m_bmpLayerCurrent = imageProcessBox1.GetResultBmp(); //获取选取图形
m_bmpLayerShow = new Bitmap(m_bmpLayerCurrent.Width, m_bmpLayerCurrent.Height);
}
//如果移动了选取位置 重新获取选取的图形
if (imageProcessBox1.Cursor == Cursors.SizeAll && m_ptOriginal != e.Location)
m_bmpLayerCurrent = imageProcessBox1.GetResultBmp();
if (!m_isStartDraw) return;
Cursor.Clip = Rectangle.Empty;
m_isStartDraw = false;
if (e.Location == m_ptOriginal && !tBtn_Brush.IsSelected) return;
this.SetLayer(); //将绘制的图形绘制到历史图层中
}
//绘制后期操作
private void imageProcessBox1_Paint(object sender, PaintEventArgs e) {
Graphics g = e.Graphics;
if (m_layer.Count > 0) //绘制保存的历史记录的最后一张图
g.DrawImage(m_layer[m_layer.Count - 1], imageProcessBox1.SelectedRectangle.Location);
if (m_bmpLayerShow != null) //绘制当前正在拖动绘制的图形(即鼠标点下还没有抬起确认的图形)
g.DrawImage(m_bmpLayerShow, imageProcessBox1.SelectedRectangle.Location);
}
#endregion
//文本改变时重置文本框大小
private void textBox1_TextChanged(object sender, EventArgs e) {
Size se = TextRenderer.MeasureText(textBox1.Text, textBox1.Font);
textBox1.Size = se.IsEmpty ? new Size(50, textBox1.Font.Height) : se;
}
//文本框失去焦点时 绘制文本
private void textBox1_Validating(object sender, CancelEventArgs e) {
textBox1.Visible = false;
if (string.IsNullOrEmpty(textBox1.Text.Trim())) { textBox1.Text = ""; return; }
using (Graphics g = Graphics.FromImage(m_bmpLayerCurrent)) {
SolidBrush sb = new SolidBrush(colorBox1.SelectedColor);
g.DrawString(textBox1.Text, textBox1.Font, sb,
textBox1.Left - imageProcessBox1.SelectedRectangle.Left,
textBox1.Top - imageProcessBox1.SelectedRectangle.Top);
sb.Dispose();
textBox1.Text = "";
this.SetLayer(); //将文本绘制到当前图层并存入历史记录
imageProcessBox1.Invalidate();
}
}
//窗体大小改变时重置字体 从控件中获取字体大小
private void textBox1_Resize(object sender, EventArgs e) {
//在三个大小选择的按钮点击中设置字体大小太麻烦 所以Resize中获取设置
int se = 10;
if (toolButton2.IsSelected) se = 12;
if (toolButton3.IsSelected) se = 14;
if (this.textBox1.Font.Height == se) return;
textBox1.Font = new Font(this.Font.FontFamily, se);
}
//撤销
private void tBtn_Cancel_Click(object sender, EventArgs e) {
using (Graphics g = Graphics.FromImage(m_bmpLayerShow)) {
g.Clear(Color.Transparent); //情况当前临时显示的图像
}
if (m_layer.Count > 0) { //删除最后一层
m_layer.RemoveAt(m_layer.Count - 1);
if (m_layer.Count > 0)
m_bmpLayerCurrent = m_layer[m_layer.Count - 1].Clone(new Rectangle(0, 0, m_bmpLayerCurrent.Width, m_bmpLayerCurrent.Height), m_bmpLayerCurrent.PixelFormat);
else
m_bmpLayerCurrent = imageProcessBox1.GetResultBmp();
imageProcessBox1.Invalidate();
imageProcessBox1.CanReset = m_layer.Count == 0 && !HaveSelectedToolButton();
} else { //如果没有历史记录则取消本次截图
this.Enabled = false;
imageProcessBox1.ClearDraw();
imageProcessBox1.IsDrawOperationDot = false;
panel1.Visible = false;
panel2.Visible = false;
}
}
/// <summary>
///
/// </summary>
public string SavePath { get; set; } = "";
/// <summary>
///
/// </summary>
public bool IsCapture { get; set; } = false;
private void tBtn_Save_Click(object sender, EventArgs e) {
SaveFileDialog saveDlg = new SaveFileDialog();
saveDlg.Filter = "位图(*.bmp)|*.bmp|JPEG(*.jpg)|*.jpg|PNG(*.png)|*.png";
saveDlg.FilterIndex = 1;
saveDlg.FileName = "CAPTURE_" + GetTimeString();
if (saveDlg.ShowDialog() == DialogResult.OK) {
SavePath = saveDlg.FileName;
IsCapture = true;
string encoderInfo = "";
switch (saveDlg.FilterIndex) {
case 1:
encoderInfo = "image/bmp";
break;
case 2:
encoderInfo = "image/jpeg";
break;
case 3:
encoderInfo = "image/png";
break;
}
if (encoderInfo.Length > 0)
{
ImageCodecInfo myImageCodecInfo;
System.Drawing.Imaging.Encoder myEncoder;
EncoderParameter myEncoderParameter;
EncoderParameters myEncoderParameters;
myImageCodecInfo = GetEncoderInfo(encoderInfo);
myEncoder = System.Drawing.Imaging.Encoder.Quality;
myEncoderParameters = new EncoderParameters(1);
// Save the bitmap as a JPEG file with quality level 100.
myEncoderParameter = new EncoderParameter(myEncoder, 100L);
myEncoderParameters.Param[0] = myEncoderParameter;
m_bmpLayerCurrent.Save(saveDlg.FileName, myImageCodecInfo, myEncoderParameters);
this.Close();
}
}
}
private static ImageCodecInfo GetEncoderInfo(String mimeType)
{
int j;
ImageCodecInfo[] encoders;
encoders = ImageCodecInfo.GetImageEncoders();
for (j = 0; j < encoders.Length; ++j)
{
if (encoders[j].MimeType == mimeType)
return encoders[j];
}
return null;
}
//将图像保存到剪贴板
private void tBtn_Finish_Click(object sender, EventArgs e) {
Clipboard.SetImage(m_bmpLayerCurrent);
IsCapture = true;
this.Close();
}
private void imageProcessBox1_DoubleClick(object sender, EventArgs e) {
Clipboard.SetImage(m_bmpLayerCurrent);
IsCapture = true;
this.Close();
}
private void timer1_Tick(object sender, EventArgs e) {
if (!this.Enabled)
imageProcessBox1.SetInfoPoint(MousePosition.X, MousePosition.Y);
}
//根据鼠标位置找寻窗体平绘制边框
private void FoundAndDrawWindowRect() {
Win32.LPPOINT pt = new Win32.LPPOINT();
pt.X = MousePosition.X; pt.Y = MousePosition.Y;
IntPtr hWnd = Win32.ChildWindowFromPointEx(Win32.GetDesktopWindow(), pt,
Win32.CWP_SKIPINVISIBL | Win32.CWP_SKIPDISABLED);
if (hWnd != IntPtr.Zero) {
IntPtr hTemp = hWnd;
while (true) {
Win32.ScreenToClient(hTemp, out pt);
hTemp = Win32.ChildWindowFromPointEx(hTemp, pt, Win32.CWP_All);
if (hTemp == IntPtr.Zero || hTemp == hWnd)
break;
hWnd = hTemp;
pt.X = MousePosition.X; pt.Y = MousePosition.Y; //坐标还原为屏幕坐标
}
Win32.LPRECT rect = new Win32.LPRECT();
Win32.GetWindowRect(hWnd, out rect);
imageProcessBox1.SetSelectRect(new Rectangle(rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top));
}
}
//获取桌面图像
private Bitmap GetScreen() {
Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width,
Screen.PrimaryScreen.Bounds.Height);
if (this.isCaptureCursor) { //是否捕获鼠标
//如果直接将捕获当的鼠标画在bmp上 光标不会反色 指针边框也很浓 也就是说
//尽管bmp上绘制了图像 绘制鼠标的时候还是以黑色作为鼠标的背景 然后在将混合好的鼠标绘制到图像 会很别扭
//所以 干脆直接在桌面把鼠标绘制出来再截取桌面
using (Graphics g = Graphics.FromHwnd(IntPtr.Zero)) { //传入0默认就是桌面 Win32.GetDesktopWindow()也可以
Win32.PCURSORINFO pci;
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
pci.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(typeof(Win32.PCURSORINFO));
Win32.GetCursorInfo(out pci);
if (pci.hCursor != IntPtr.Zero) {
Cursor cur = new Cursor(pci.hCursor);
g.CopyFromScreen(0, 0, 0, 0, bmp.Size); //在桌面绘制鼠标前 先在桌面绘制一下当前的桌面图像
//如果不绘制当前桌面 那么cur.Draw的时候会是用历史桌面的快照 进行鼠标的混合 那么到时候混出现底色(测试中就是这样的)
cur.Draw(g, new Rectangle((Point)((Size)MousePosition - (Size)cur.HotSpot), cur.Size));
}
}
}
//做完以上操作 才开始捕获桌面图像
using (Graphics g = Graphics.FromImage(bmp)) {
g.CopyFromScreen(0, 0, 0, 0, bmp.Size);
}
return bmp;
}
//设置工具条位置
private void SetToolBarLocation() {
int tempX = imageProcessBox1.SelectedRectangle.Left;
int tempY = imageProcessBox1.SelectedRectangle.Bottom + 5;
int tempHeight = panel2.Visible ? panel2.Height + 2 : 0;
if (tempY + panel1.Height + tempHeight >= this.Height)
tempY = imageProcessBox1.SelectedRectangle.Top - panel1.Height - 10 - imageProcessBox1.Font.Height;
if (tempY - tempHeight <= 0) {
if (imageProcessBox1.SelectedRectangle.Top - 5 - imageProcessBox1.Font.Height >= 0)
tempY = imageProcessBox1.SelectedRectangle.Top + 5;
else
tempY = imageProcessBox1.SelectedRectangle.Top + 10 + imageProcessBox1.Font.Height;
}
if (tempX + panel1.Width >= this.Width)
tempX = this.Width - panel1.Width - 5;
panel1.Left = tempX;
panel2.Left = tempX;
panel1.Top = tempY;
panel2.Top = imageProcessBox1.SelectedRectangle.Top > tempY ? tempY - tempHeight : panel1.Bottom + 2;
}
//确定是否工具条上面有被选中的按钮
private bool HaveSelectedToolButton() {
return tBtn_Rect.IsSelected || tBtn_Ellipse.IsSelected
|| tBtn_Arrow.IsSelected || tBtn_Brush.IsSelected
|| tBtn_Text.IsSelected;
}
//清空选中的工具条上的工具
private void ClearToolBarBtnSelected() {
tBtn_Rect.IsSelected = tBtn_Ellipse.IsSelected = tBtn_Arrow.IsSelected =
tBtn_Brush.IsSelected = tBtn_Text.IsSelected = false;
}
//设置历史图层
private void SetLayer() {
if (this.IsDisposed) return;
using (Graphics g = Graphics.FromImage(m_bmpLayerCurrent)) {
g.DrawImage(m_bmpLayerShow, 0, 0);
}
Bitmap bmpTemp = m_bmpLayerCurrent.Clone(new Rectangle(0, 0, m_bmpLayerCurrent.Width, m_bmpLayerCurrent.Height), m_bmpLayerCurrent.PixelFormat);
m_layer.Add(bmpTemp);
}
//保存时获取当前时间字符串作文默认文件名
private string GetTimeString() {
DateTime time = DateTime.Now;
return time.Date.ToShortDateString().Replace("/", "") + "_" +
time.ToLongTimeString().Replace(":", "");
}
private void imageProcessBox1_KeyDown(object sender, KeyEventArgs e)
{
if(e.KeyCode==Keys.Escape)
{
//if (!imageProcessBox1.IsDrawed) //没有绘制那么退出(直接this.Close右键将传递到下面)
// this.BeginInvoke(new MethodInvoker(() => this.Close()));
//有绘制的情况 情况继续禁用窗体
this.Enabled = false;
imageProcessBox1.ClearDraw();
imageProcessBox1.CanReset = true;
imageProcessBox1.IsDrawOperationDot = false;
m_layer.Clear(); //清空历史记录
m_bmpLayerCurrent = null;
m_bmpLayerShow = null;
ClearToolBarBtnSelected();
panel1.Visible = false;
panel2.Visible = false;
this.Close();
}
}
}
}