using AllBase; using DevComponents.DotNetBar; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace TemuKJD.KJDForms.ToolForms { public partial class MeituMessageDialog : Form { public MeituMessageDialog() { InitializeComponent(); this.Text = "提示"; this.ShowIcon = false; this.FormClosing += MessageDialog_FormClosing; this.Activated += MessageDialog_Activated; this.Load += MeituMessageDialog_Load; } private void MeituMessageDialog_Load(object sender, EventArgs e) { tableLayoutPanel2.Controls[tableLayoutPanel2.Controls.Count - 1].Focus(); foreach (var c in tableLayoutPanel2.Controls) { if (c is ButtonX) { var btn = c as ButtonX; btn.Click += Btn_Click; } } } private void MessageDialog_Activated(object sender, EventArgs e) { } private void Btn_Click(object sender, EventArgs e) { var btn = sender as ButtonX; if (btn != null) clickBtnText = btn.Text; if (btn.Text == "指定启动文件") { this.Close(); } else if (btn.Text == "下载美图秀秀") { if (isDownload == true) { MessageBox.Show("下载中,请稍候!"); return; } // 单线程单元(STA)模式运行文件对话框,否则会报错。 System.Threading.Thread InvokeThread = new System.Threading.Thread(new System.Threading.ThreadStart(setDownloadPath)); InvokeThread.SetApartmentState(System.Threading.ApartmentState.STA); InvokeThread.Start(); InvokeThread.Join(); } else if (btn.Text == "安装美图秀秀") { System.Diagnostics.Process.Start(desFile); //this.Close(); } } private void setDownloadPath() { FolderBrowserDialog dialog = new FolderBrowserDialog(); dialog.Description = "请选择文件路径"; if (dialog.ShowDialog() == DialogResult.OK) { desFile = dialog.SelectedPath; new Thread(DownloadFileNoReturn).Start(); } } private void MessageDialog_FormClosing(object sender, FormClosingEventArgs e) { isClick = true; } static bool isClick = false; static string clickBtnText = ""; static MeituMessageDialog msg; public static string ShowMessageDialog(string text = "", string btnsStr = "") { msg = new MeituMessageDialog(); string[] btnStrArr = btnsStr.Split(','); msg.tableLayoutPanel2.Refresh(); msg.tableLayoutPanel2.ColumnCount = btnStrArr.Length + 2; msg.tableLayoutPanel2.ColumnStyles.Clear(); msg.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(SizeType.Percent, 50F)); msg.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); msg.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle()); msg.tableLayoutPanel2.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(SizeType.Percent, 50F)); msg.labelX1.Text = text; for (int i = 0; i < btnStrArr.Length; i++) { ButtonX btnX = new ButtonX(); msg.tableLayoutPanel2.Controls.Add(btnX, i + 1, 0); btnX.Text = btnStrArr[i]; btnX.Dock = DockStyle.Fill; btnX.AccessibleRole = AccessibleRole.PushButton; btnX.ColorTable = eButtonColor.OrangeWithBackground; btnX.Size = new Size(btnX.Text.Length * 16, 23); btnX.Style = eDotNetBarStyle.StyleManagerControlled; } msg.StartPosition = FormStartPosition.CenterScreen; //msg.TopMost = true; msg.ShowDialog(); return clickBtnText; } private void tableLayoutPanel1_Paint(object sender, PaintEventArgs e) { } static string sourceFile = "http://xiuxiu.dl.meitu.com/xiuxiu_setup.exe"; static string desFile = ""; public static void DownloadFileNoReturn() { if (DownloadFile()) { msg.Invoke(new Action(() => { var btn = msg.tableLayoutPanel2.Controls[0] as ButtonX; btn.Text = "安装美图秀秀"; })); } } static bool isDownload = false; /// 下载文件方法 /// 文件保存路径和文件名 /// 返回服务器文件名 public static bool DownloadFile() { isDownload = true; if (sourceFile == "" || desFile == "") { isDownload = false; return false; } bool flag = false; long SPosition = 0; FileStream FStream = null; Stream myStream = null; string fileName = sourceFile.Substring(sourceFile.LastIndexOf(@"/") + 1); if (desFile.EndsWith("\\")) { desFile = desFile + fileName; } else { desFile = desFile + "\\" + fileName; } try { long serverFileLength = GetHttpLength(sourceFile); msg.Invoke(new Action(() => { msg.progressBarX1.Maximum = 100; msg.progressBarX1.Visible = true; })); //判断要下载的文件夹是否存在 if (File.Exists(desFile)) { //打开上次下载的文件 FStream = File.OpenWrite(desFile); //获取已经下载的长度 SPosition = FStream.Length; if (SPosition == serverFileLength) { //文件是完整的,直接结束下载任务 msg.Invoke(new Action(() => { msg.progressBarX1.Value = 100; })); isDownload = false; return true; } FStream.Seek(SPosition, SeekOrigin.Current); } else { //文件不保存创建一个文件 FStream = new FileStream(desFile, FileMode.Create); SPosition = 0; } //打开网络连接 HttpWebRequest myRequest = (HttpWebRequest)HttpWebRequest.Create(sourceFile); if (SPosition > 0) { myRequest.AddRange(SPosition); //设置Range值 } //向服务器请求,获得服务器的回应数据流 myStream = myRequest.GetResponse().GetResponseStream(); //定义一个字节数据 byte[] btContent = new byte[512]; int intSize = 0; intSize = myStream.Read(btContent, 0, 512); while (intSize > 0) { FStream.Write(btContent, 0, intSize); intSize = myStream.Read(btContent, 0, 512); var currentPosition = FStream.Length; msg.Invoke(new Action(() => { msg.progressBarX1.Value = (int)(1.0 * currentPosition / serverFileLength * 100); })); } flag = true; //返回true下载成功 } catch (Exception ex) { //SysLog.WriteTxtLog("下载文件时异常:" + ex.Message); LogSave.Add("MeituMessageDialog - 下载文件时异常:" + ex.Message); } finally { //关闭流 if (myStream != null) { myStream.Close(); myStream.Dispose(); } if (FStream != null) { FStream.Close(); FStream.Dispose(); } } isDownload = false; return flag; } static long GetHttpLength(string url) { long length = 0; try { var req = (HttpWebRequest)WebRequest.CreateDefault(new Uri(url)); req.Method = "HEAD"; req.Timeout = 5000; var res = (HttpWebResponse)req.GetResponse(); if (res.StatusCode == HttpStatusCode.OK) { length = res.ContentLength; } res.Close(); return length; } catch (WebException wex) { return 0; } } } }