前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C# 爬虫:疫情实时信息图

C# 爬虫:疫情实时信息图

作者头像
zls365
发布于 2021-10-19 02:55:36
发布于 2021-10-19 02:55:36
1.5K00
代码可运行
举报
文章被收录于专栏:CSharp编程大全CSharp编程大全
运行总次数:0
代码可运行

运行结果:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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(推荐)

需求:当窗体尺寸动态改变时,窗体中的各种控件(包括Panel以及Panel中的子控件)可以动态调节自身大小,以适应窗体内容比例。

方法:

第一步,新建一个类,代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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文件代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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);
        }
    }
}   
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 CSharp编程大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
[C#]控件大小随窗体改变而改变
这篇文章写的很好,一般我会选择第一种。 我改了一下格式,便于大家复制黏贴,O(∩_∩)O。
祥知道
2020/03/10
3.1K0
【愚公系列】2023年11月 Winform控件专题 Form控件详解
Winform控件是Windows Forms中的用户界面元素,它们可以用于创建Windows应用程序的各种视觉和交互组件,例如按钮、标签、文本框、下拉列表框、复选框、单选框、进度条等。开发人员可以使用Winform控件来构建用户界面并响应用户的操作行为,从而创建功能强大的桌面应用程序。
愚公搬代码
2023/11/21
2.9K0
基于Cef内核的多店铺登录器(含源码)
        公司是做电商的,在速卖通平台上开了若干店铺,每天都需要登录店铺打理,如:发货提交、获取运单号等。多个店铺的情况下,同时使用浏览器就会非常繁琐,如:要记住帐户名和密码,还要在不同店铺间切换。如果能够制作一个多店铺登录器,就可以解决上述问题。好了,背景描述完毕,下面开干         首先想到的是微信原生的WebBrowser组件,第一轮开发结束测试,发现帐户间会互相干扰,就是店铺A登录成功后,再登录店铺B的话,店铺A的数据会被冲掉。此控件直接pass,继续新尝试         后来又找到一
用户1219352
2018/02/01
2K0
基于Cef内核的多店铺登录器(含源码)
C#控件大小随窗体大小等比例变化
https://www.cnblogs.com/sakalaka/p/5135230.html
iOSDevLog
2019/07/22
3.5K1
C# winform ——界面美化技巧
关于C#界面美化的一些小技巧 在不使用第三方控件如 IrisSkin 的前提下,依然可以对winform做出让人眼前一亮的美化
vv彭
2021/03/08
5.9K0
C# winform ——界面美化技巧
在DataGridView控件中加入ComboBox下拉列表框的实现
本文转载:http://www.cnblogs.com/luqingfei/archive/2007/03/28/691372.html
跟着阿笨一起玩NET
2018/09/18
4.2K0
在DataGridView控件中加入ComboBox下拉列表框的实现
C# 实现最小化托盘功能
2.在解决方案下面新建一个窗体,从左边工具箱,将NotifyIcon拖过去窗体,该控件的作用是:运行程序期间在Windows任务栏右侧的通知区域显示图标(也就是我们所说的托盘显示),如下图
用户7053485
2020/03/19
1.5K0
C# 实现最小化托盘功能
(三十五)c#Winform自定义控件-下拉框
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/11
1.5K0
(三十五)c#Winform自定义控件-下拉框
fbx文件导入3dmax_3d中z轴的值没办法输入
本程序的功能就是通过xna 将3d 图像显示到winfrom 对他进行旋转操作。
全栈程序员站长
2022/11/07
7100
(四十七)c#Winform自定义控件-树表格(treeGrid)
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/09
1.6K0
(四十七)c#Winform自定义控件-树表格(treeGrid)
C# TCP/IP 文件(图片、视频等)收发系统
1. 窗口最小化到托盘及右键图标显示菜单; 2. D:\Picture\device2 D:\Picture\device1 D:\Record 路径下有数据更新以后将新增加的文件通过TCP/IP上传到云端; 3. 界面上可以显示数据收发的进度条; 注意:1. 收发用同一个客户端 2. LocalPort 收发端需要不一样
zls365
2020/08/19
1.2K0
C# TCP/IP 文件(图片、视频等)收发系统
(八十九)c#Winform自定义控件-自定义滚动条(treeview、panel、datagridview、listbox、listview、textbox)
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2020/07/03
2.4K0
c# 可移动可改变大小的控件
因为业务需要,百度了个可移动可改变大小的控件,然后自己修改了下,功能类似vs的设计面板中的功能差不多,可拖拽,改变大小
冰封一夏
2019/09/11
2K0
【C#】分享一个弹出容器层,像右键菜单那样召即来挥则去
------------------201508261813更新(源码有更新、Demo未更新)------------------
AhDung
2018/09/13
2.9K0
【C#】分享一个弹出容器层,像右键菜单那样召即来挥则去
C#实现多个子窗体切换效果
今天来和大家分享一下在C#的winform开发中如何实现借助一个主窗体来实现内部多个子窗体的切换效果。
灰小猿
2020/09/23
5K0
C#实现多个子窗体切换效果
winform窗体内容自动调整大小
知否知否应是绿肥红瘦
2025/02/19
2170
winform窗体内容自动调整大小
C# WinForm 界面控件
1.首先插入新的子窗体form1,并设置IsMdiContainer = True 属性。
王瑞MVP
2022/12/28
3.3K0
C# WinForm 界面控件
(三十三)c#Winform自定义控件-日期控件
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/11
5K0
(三十三)c#Winform自定义控件-日期控件
(三十一)c#Winform自定义控件-文本框(四)
GitHub:https://github.com/kwwwvagaa/NetWinformControl
冰封一夏
2019/09/11
1.5K0
(三十一)c#Winform自定义控件-文本框(四)
WinForm企业应用框架设计【三】框架窗体设计;动态创建菜单;
我也不会发现第一篇中关于“充血实体”的错误说法(至少~我写文章的时候~内心的想法是错的~)
liulun
2022/05/09
9760
WinForm企业应用框架设计【三】框架窗体设计;动态创建菜单;
推荐阅读
相关推荐
[C#]控件大小随窗体改变而改变
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验