C#实例 武汉肺炎全国疫情实时信息图

如果需要查看更多文章,请微信搜索公众号 csharp编程大全,需要进C#交流群群请加微信z438679770,备注进群, 我邀请你进群! ! !
------------------------------------------------------------------------------------------------------
using System;
using System.Drawing;
using System.Text;
using NSoup;
using NSoup.Nodes;
using System.IO;
using System.Net;
using System.Text.RegularExpressions;
using System.Windows.Forms; namespace Pneumonia
{
public partial class MainForm : DevComponents.DotNetBar.OfficeForm
{
static string confirmedCount, suspectedCount, deadCount, curedCount, updateTime,dataUpdateTime;
static string url = "https://3g.dxy.cn/newh5/view/pneumonia";
static int count = 0;
static Document doc;
public MainForm()
{
this.EnableGlass = false;
InitializeComponent();
this.SizeChanged += new Resize(this).Form1_Resize; //窗口自适应代码
}
private void MainForm_Load(object sender, EventArgs e)
{
timer1.Enabled = true;
timer1.Interval = 1;
timer1.Start();
WebClient wc = new WebClient();
byte[] htmlData = wc.DownloadData(url);
string html = Encoding.UTF8.GetString(htmlData);
logWrite(html);//将网页内容写入txt文件,以方便查看
toolStripStatusLabel1.Text = DateTime.Now.ToString();
}
private void timer1_Tick(object sender, EventArgs e)
{
dataUpdateTime = DateTime.Now.ToString();
count++;
timer1.Interval = 300000;
GetData();
lbl1.Text = "☛ 病毒: " + regularMatchStr("getStatisticsService", "virus\":\"(.+?)\",");
lbl2.Text = "☛ 传染源: " + regularMatchStr("getStatisticsService", "infectSource\":\"(.+?)\",");
lbl3.Text = "☛ 传播途径: " + regularMatchStr("getStatisticsService", "passWay\":\"(.+?)\",");
lbl4.Text ="☛ "+regularMatchStr("getStatisticsService", "remark1\":\"(.+?)\",");
lbl5.Text ="☛ "+regularMatchStr("getStatisticsService", "remark2\":\"(.+?)\",");
Image map =UrlToImage("https://img1.dxycdn.com/2020/0201/450/3394153392393266839-135.png");
pictureBox1.Image = map;
Image chart = UrlToImage("https://img1.dxycdn.com/2020/0201/693/3394145745204021706-135.png");
pictureBox2.Image = chart;
updateTimeLbl.Text = "截至 " + updateTime + " 全国数据统计";
confirmedLbl.Text = confirmedCount;
suspectedLbl.Text = suspectedCount;
deadLbl.Text = deadCount;
curedLbl.Text = curedCount;
} public static void GetData()
{
//直接通过url来获取Document对象
doc = NSoupClient.Connect(url).Get();
//先获取id为artContent的元素,再获取所有的p标签
updateTime = ConvertStringToDateTime(regularMatchStr("getStatisticsService", "modifyTime\":(.+?),")).ToString();
confirmedCount = regularMatchStr("getStatisticsService", "confirmedCount\":(.+?),");
suspectedCount = regularMatchStr("getStatisticsService", "suspectedCount\":(.+?),");
deadCount = regularMatchStr("getStatisticsService", "deadCount\":(.+?),");
curedCount = regularMatchStr("getStatisticsService", "curedCount\":(.+?),");
}
#region 下载图片到Image
public static Image UrlToImage(string url)
{
WebClient mywebclient = new WebClient();
byte[] Bytes = mywebclient.DownloadData(url);
using (MemoryStream ms = new MemoryStream(Bytes))
{
Image outputImg = Image.FromStream(ms);
return outputImg;
}
}
#endregion
public static DateTime ConvertStringToDateTime(string timeStamp)
{
DateTime dtStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1));
long lTime = long.Parse(timeStamp + "0000");
TimeSpan toNow = new TimeSpan(lTime);
return dtStart.Add(toNow);
}
public static string regularMatchStr(string elementId, string regex)
{
Element p = doc.GetElementById(elementId);
Regex reg = new Regex(regex, RegexOptions.IgnoreCase);
//例如我想提取line中的NAME值
Match match = reg.Match(p.Html());
string value = match.Groups[1].Value;
return value;
}
public static void logWrite(string Message)
{
if (!File.Exists(AppDomain.CurrentDomain.BaseDirectory + "\\log.txt"))
File.Create(AppDomain.CurrentDomain.BaseDirectory + "\\log.txt").Close();
string fileName = AppDomain.CurrentDomain.BaseDirectory + "\\log.txt";
string content = DateTime.Now.ToLocalTime() + Message + "\r\n";
StreamWriter sw = new StreamWriter(fileName, true);
sw.Write(content);
sw.Close(); sw.Dispose();
} private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)//判断鼠标的按键
{
//点击时判断form是否显示,显示就隐藏,隐藏就显示
if (this.WindowState == FormWindowState.Normal)
{
this.WindowState = FormWindowState.Minimized;
this.Hide();
}
else if (this.WindowState == FormWindowState.Minimized)
{
this.Show();
this.WindowState = FormWindowState.Normal;
this.Activate();
}
}
else if (e.Button == MouseButtons.Right)
{
//右键退出事件
if (MessageBox.Show("是否需要关闭程序?", "提示:", MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation) == DialogResult.OK)//出错提示
{
//关闭窗口
DialogResult = DialogResult.No;
Dispose();
Close();
}
} } private void timer2_Tick(object sender, EventArgs e)
{
toolStripStatusLabel1.Text = DateTime.Now.ToString() + " 刷新次数 : " + count + " 最新刷新时间 :" + dataUpdateTime;
} private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
{
if (MessageBox.Show("是否确认退出程序?", "退出", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
{
// 关闭所有的线程
this.Dispose();
this.Close();
}
else
{
e.Cancel = true;
}
} private void MainForm_SizeChanged(object sender, EventArgs e)
{
//判断是否选择的是最小化按钮
if (WindowState == FormWindowState.Minimized)
{
//隐藏任务栏区图标
this.ShowInTaskbar = false;
//图标显示在托盘区
notifyIcon1.Visible = true;
}
} private void 退出ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (MessageBox.Show("是否确认退出程序?", "退出", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) == DialogResult.OK)
{
// 关闭所有的线程
this.Dispose();
this.Close();
}
} private void 显示ToolStripMenuItem_Click(object sender, EventArgs e)
{
WindowState = FormWindowState.Normal;
} }
}
resize类
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace Pneumonia
{
class Resize
{
private MainForm _form; public Resize(MainForm form)
{
int count = form.Controls.Count * 2 + 2;
float[] factor = new float[count];
int i = 0;
factor[i++] = form.Size.Width;
factor[i++] = form.Size.Height;
foreach (Control ctrl in form.Controls)
{
factor[i++] = ctrl.Location.X / (float)form.Size.Width;
factor[i++] = ctrl.Location.Y / (float)form.Size.Height;
ctrl.Tag = ctrl.Size;
}
form.Tag = factor;
this._form = form;
} public void Form1_Resize(object sender, EventArgs e)
{
float[] scale = (float[])this._form.Tag;
int i = 2;
foreach (Control ctrl in this._form.Controls) //panel的长宽增长到一个固定的值就不会再增长了,原因:Panel的宽和高上限是65535像素(https://blog.csdn.net/dufangfeilong/article/details/41805073?utm_source=blogxgwz5)
{
ctrl.Left = (int)(this._form.Size.Width * scale[i++]);
ctrl.Top = (int)(this._form.Size.Height * scale[i++]);
ctrl.Width = (int)(this._form.Size.Width / (float)scale[0] * ((Size)ctrl.Tag).Width);
ctrl.Height = (int)(this._form.Size.Height / (float)scale[1] * ((Size)ctrl.Tag).Height);
}
}
}
}
C# Winform控件自适应窗体大小:方法1(推荐)
参考链接:https://www.cnblogs.com/PER10/p/11541568.html
需求:当窗体尺寸动态改变时,窗体中的各种控件(包括Panel以及Panel中的子控件)可以动态调节自身大小,以适应窗体内容比例。
方法:
第一步,新建一个类,代码如下:
class Resize
{
private Form _form; public Resize(Form form)
{
int count = form.Controls.Count * 2 + 2;
float[] factor = new float[count];
int i = 0;
factor[i++] = form.Size.Width;
factor[i++] = form.Size.Height;
foreach (Control ctrl in form.Controls)
{
factor[i++] = ctrl.Location.X / (float)form.Size.Width;
factor[i++] = ctrl.Location.Y / (float)form.Size.Height;
ctrl.Tag = ctrl.Size;
}
form.Tag = factor;
this._form = form;
} public void Form1_Resize(object sender, EventArgs e)
{
float[] scale = (float[])this._form.Tag;
int i = 2;
foreach (Control ctrl in this._form.Controls) //panel的长宽增长到一个固定的值就不会再增长了,原因:Panel的宽和高上限是65535像素(https://blog.csdn.net/dufangfeilong/article/details/41805073?utm_source=blogxgwz5)
{
ctrl.Left = (int)(this._form.Size.Width * scale[i++]);
ctrl.Top = (int)(this._form.Size.Height * scale[i++]);
ctrl.Width = (int)(this._form.Size.Width / (float)scale[0] * ((Size)ctrl.Tag).Width);
ctrl.Height = (int)(this._form.Size.Height / (float)scale[1] * ((Size)ctrl.Tag).Height);
}
}
}
第二步,在Form的初始化函数中使用这个类:
public Form_StockCount()
{
InitializeComponent(); this.SizeChanged += new Resize(this).Form1_Resize; //窗口自适应代码
}
C# Winform窗体和控件自适应大小:方法2
1.在项目中创建类AutoSizeForm
AutoSizeForm.cs文件代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace CSharpFormApplication
{
class AutoResizeForm
{
//(1).声明结构,只记录窗体和其控件的初始位置和大小。
public struct controlRect
{
public int Left;
public int Top;
public int Width;
public int Height;
}
//(2).声明 1个对象
//注意这里不能使用控件列表记录 List nCtrl;,因为控件的关联性,记录的始终是当前的大小。
// public List oldCtrl= new List();//这里将西文的大于小于号都过滤掉了,只能改为中文的,使用中要改回西文
public List<controlRect> oldCtrl = new List<controlRect>();
int ctrlNo = 0;//1;
//(3). 创建两个函数
//(3.1)记录窗体和其控件的初始位置和大小,
public void controllInitializeSize(Control mForm)
{
controlRect cR;
cR.Left = mForm.Left; cR.Top = mForm.Top; cR.Width = mForm.Width; cR.Height = mForm.Height;
oldCtrl.Add(cR);//第一个为"窗体本身",只加入一次即可
AddControl(mForm);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
//this.WindowState = (System.Windows.Forms.FormWindowState)(2);//记录完控件的初始位置和大小后,再最大化
//0 - Normalize , 1 - Minimize,2- Maximize
}
private void AddControl(Control ctl)
{
foreach (Control c in ctl.Controls)
{ //**放在这里,是先记录控件的子控件,后记录控件本身
//if (c.Controls.Count > 0)
// AddControl(c);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
controlRect objCtrl;
objCtrl.Left = c.Left; objCtrl.Top = c.Top; objCtrl.Width = c.Width; objCtrl.Height = c.Height;
oldCtrl.Add(objCtrl);
//**放在这里,是先记录控件本身,后记录控件的子控件
if (c.Controls.Count > 0)
AddControl(c);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
}
}
//(3.2)控件自适应大小,
public void controlAutoSize(Control mForm)
{
if (ctrlNo == 0)
{ //*如果在窗体的Form1_Load中,记录控件原始的大小和位置,正常没有问题,但要加入皮肤就会出现问题,因为有些控件如dataGridView的的子控件还没有完成,个数少
//*要在窗体的Form1_SizeChanged中,第一次改变大小时,记录控件原始的大小和位置,这里所有控件的子控件都已经形成
controlRect cR;
// cR.Left = mForm.Left; cR.Top = mForm.Top; cR.Width = mForm.Width; cR.Height = mForm.Height;
cR.Left = 0; cR.Top = 0; cR.Width = mForm.PreferredSize.Width; cR.Height = mForm.PreferredSize.Height; oldCtrl.Add(cR);//第一个为"窗体本身",只加入一次即可
AddControl(mForm);//窗体内其余控件可能嵌套其它控件(比如panel),故单独抽出以便递归调用
}
float wScale = (float)mForm.Width / (float)oldCtrl[0].Width;//新旧窗体之间的比例,与最早的旧窗体
float hScale = (float)mForm.Height / (float)oldCtrl[0].Height;//.Height;
ctrlNo = 1;//进入=1,第0个为窗体本身,窗体内的控件,从序号1开始
AutoScaleControl(mForm, wScale, hScale);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
}
private void AutoScaleControl(Control ctl, float wScale, float hScale)
{
int ctrLeft0, ctrTop0, ctrWidth0, ctrHeight0;
//int ctrlNo = 1;//第1个是窗体自身的 Left,Top,Width,Height,所以窗体控件从ctrlNo=1开始
foreach (Control c in ctl.Controls)
{ //**放在这里,是先缩放控件的子控件,后缩放控件本身
//if (c.Controls.Count > 0)
// AutoScaleControl(c, wScale, hScale);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用
ctrLeft0 = oldCtrl[ctrlNo].Left;
ctrTop0 = oldCtrl[ctrlNo].Top;
ctrWidth0 = oldCtrl[ctrlNo].Width;
ctrHeight0 = oldCtrl[ctrlNo].Height;
//c.Left = (int)((ctrLeft0 - wLeft0) * wScale) + wLeft1;//新旧控件之间的线性比例
//c.Top = (int)((ctrTop0 - wTop0) * h) + wTop1;
c.Left = (int)((ctrLeft0) * wScale);//新旧控件之间的线性比例。控件位置只相对于窗体,所以不能加 + wLeft1
c.Top = (int)((ctrTop0) * hScale);//
c.Width = (int)(ctrWidth0 * wScale);//只与最初的大小相关,所以不能与现在的宽度相乘 (int)(c.Width * w);
c.Height = (int)(ctrHeight0 * hScale);//
ctrlNo++;//累加序号
//**放在这里,是先缩放控件本身,后缩放控件的子控件
if (c.Controls.Count > 0)
AutoScaleControl(c, wScale, hScale);//窗体内其余控件还可能嵌套控件(比如panel),要单独抽出,因为要递归调用 if (ctl is DataGridView)
{
DataGridView dgv = ctl as DataGridView;
Cursor.Current = Cursors.WaitCursor; int widths = 0;
for (int i = 0; i < dgv.Columns.Count; i++)
{
dgv.AutoResizeColumn(i, DataGridViewAutoSizeColumnMode.AllCells); // 自动调整列宽
widths += dgv.Columns[i].Width; // 计算调整列后单元列的宽度和
}
if (widths >= ctl.Size.Width) // 如果调整列的宽度大于设定列宽
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.DisplayedCells; // 调整列的模式 自动
else
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; // 如果小于 则填充 Cursor.Current = Cursors.Default;
}
} }
}
}
2.在要自适应大小的Form中自定义全局类对象
AutoResizeForm asc = new AutoResizeForm();
3.在要自适应大小的Form的load事件和SizeChange事件中执行对象方法
private void WidgetAutoResizeForm_Load(object sender, EventArgs e)
{
asc.controllInitializeSize(this);
} private void WidgetAutoResizeForm_SizeChanged(object sender, EventArgs e)
{
asc.controlAutoSize(this);
}
From窗体代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms; namespace CSharpFormApplication
{
public partial class WidgetAutoResizeForm : Form
{
AutoResizeForm asc = new AutoResizeForm();
public WidgetAutoResizeForm()
{
InitializeComponent();
} private void WidgetAutoResizeForm_Load(object sender, EventArgs e)
{
asc.controllInitializeSize(this);
} private void WidgetAutoResizeForm_SizeChanged(object sender, EventArgs e)
{
asc.controlAutoSize(this);
}
}
}
https://www.cnblogs.com/AmatVictorialCuram/p/5066670.html
https://www.cnblogs.com/AmatVictorialCuram/p/5066670.html
WinForm 之 窗口最小化到托盘及右键图标显示菜单
参考链接:https://www.cnblogs.com/xinaixia/p/6216670.html
-----------------------------------------------------------------------------------------------------------------------------
如果需要查看更多文章,请微信搜索公众号 csharp编程大全,需要进C#交流群群请加微信z438679770,备注进群, 我邀请你进群! ! !
C#实例 武汉肺炎全国疫情实时信息图的更多相关文章
- Python爬虫 抓肺炎疫情实时数据
		数据下载 网上一搜,首先搜到的是腾讯的疫情实时追踪,那就用这个数据源吧. 有了网址怎么抓数据呢?这里,可以从纷乱中找到最靠谱的下载方式.我习惯用FireFox浏览器,下面的讲解就以FireFox为例( ... 
- Hadoop数据分析实例:P2P借款人信用风险实时监控模型设计
		Hadoop数据分析实例:P2P借款人信用风险实时监控模型设计 一提到hadoop相信熟悉IT领域或者经常关注互联网新闻的朋友都应该很熟悉了,当然,这种熟悉可能也只是听着名字耳熟,但并不知道它具体是什 ... 
- 使用Python绘制新型冠状肺炎全国增长趋势图
		截至1月28日24时,国家卫生健康委收到31个省(区.市)累计报告确诊病例5974例,现有重症病例1239例,累计死亡病例132例,累计治愈出院103例.现有疑似病例9239例.目前累计追踪到密切接触 ... 
- EasyNVR RTSP转RTMP-HLS流媒体服务器前端构建之:通过接口获取实时信息
		对于动态网站,要实时更新网站的信息,通过接口来获取实时信息是一个必不可少的部分.EasyNVR可以接入IPC等前端设备,必须要实时获取到对应的IPC实时信息进行展示. 本篇主要说明Ajax来获取数据. ... 
- EasyNVR摄像机网页无插件直播方案H5前端构建之:接口调用获取实时信息
		背景分析 熟悉EasyNVR产品的小伙伴应该知道,EasyNVR主要针对的是安防类的项目,通过RTSP/onvif协议将前端高清网络摄像机IPC.NVR等接入进来,然后将设备端的音视频通过采集.转换, ... 
- (java)Jsoup爬虫学习--获取智联招聘(老网站)的全国java职位信息,爬取10页
		Jsoup爬虫学习--获取智联招聘(老网站)的全国java职位信息,爬取10页,输出 职位名称*****公司名称*****职位月薪*****工作地点*****发布日期 import java.io.I ... 
- 2020 新型肺炎病毒疫情 & 远程办公
		2020 新型肺炎病毒疫情 & 远程办公 2020 新型肺炎病毒疫情 https://zhuanlan.zhihu.com/p/104406687 钉钉 微信 code gitlab PRD ... 
- 利用python爬取全国水雨情信息
		分析 我们没有找到接口,所以打算利用selenium来爬取. 代码 import datetime import pandas as pd from bs4 import BeautifulSoup ... 
- 关于nagios系统下使用shell脚本自定义监控插件的编写以及没有实时监控图的问题
		关于nagios系统下shell自定义监控插件的编写.脚本规范以及没有实时监控图的问题的解决办法 在自已编写监控插件之前我们首先需要对nagios监控原理有一定的了解 Nagios的功能是监控服务和主 ... 
随机推荐
- Python基本
			Python基本规则 1.面向对象的跨平台的编程语言 2.文件类型是.py, 3.一个文件是一个模块module,运行整个文件 4.不支持非英文字符,区分大小写 5.一行是一条语句,多条语句写一行用; ... 
- python appium app ui 自动化
			1.下载Android-SDK.夜神安卓模拟器.Appium.adb命令执行包并配置环境变量 2.打开夜神 3.打开Appium进行配置,配置如下 4.启动命令,到夜神bin目录下执行 adb con ... 
- 原来写插件还可以选MEF
			MEF是微软提供的一个轻量级的ICO容器,可以轻易的解除程序集的依赖关系,最近想写个类似插件试的软件所以搜索了一下,终于淘到宝了. 下面我们看看MEF是如何解耦的 新建一个控制台项目两个类库 Ites ... 
- JVM垃圾回收器前瞻
			垃圾回收器的新发展 GC仍然处于飞速发展之中,目前的默认选项G1 GC在不断的进行改进,很多我们原来认为的缺点,例如串行的Full GC.Card Table扫描的低效等,都已经被大幅改进,例如, ... 
- Node.js 从零开发 web server博客项目[日志]
			web server博客项目 Node.js 从零开发 web server博客项目[项目介绍] Node.js 从零开发 web server博客项目[接口] Node.js 从零开发 web se ... 
- springboot之logback配置
			参考了https://blog.csdn.net/hxtxgfzs/article/details/79488163 Spring Boot默认情况下,当使用"Starters" ... 
- hystrix源码之线程池
			HystrixThreadPool 定义了hystrix线程池接口 获取ExecutorService对象,即jdk定义的线程池. public ExecutorService getExecutor ... 
- 工作10年后,再看String s = new String("xyz") 创建了几个对象?
			这个问题相信每个学习java的同学都不陌生,作为一个经典的面试题,到现在工作这么多年了我真是认为挺操蛋的一个问题,在网上到现在你仍然可以看见很多讨论这个问题的人,其中不乏工作很多年的人都有争论,我认为 ... 
- python爬取新浪财经
			我们来获取这里的title和url然后再获取这里面url的编辑作者 可以看到右边的几个就对应的左边不同的div .m-p1-mb2-list.m-list-container ul li a impo ... 
- C语言专项错题集
			2020-08-10 记录 #1 1 struct student{ 2 int num; 3 int age; 4 }; 5 struct student stu[3]={{6001,20},{60 ... 
