网站建设开发协议/百度一下 你就知道官网 新闻

网站建设开发协议,百度一下 你就知道官网 新闻,电商网站开发的底层架构,网站文章正文可以做内链吗版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 17.2.10 重绘 先看以下例子: 【例 17.28】【项目:code17-028】绘制填充矩形。 private void button1_Clic…

版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。

17.2.10 重绘

先看以下例子:

【例 17.28【项目:code17-028】绘制填充矩形。

        private void button1_Click(object sender, EventArgs e)

        {

            Graphics g = this.CreateGraphics();

            g.FillRectangle(new SolidBrush(Color.Blue), new Rectangle(260, 20, 100, 100));

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            Graphics g = this.CreateGraphics();

            g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(20, 20, 100, 100));

        }

        private void Form1_Paint(object sender, PaintEventArgs e)

        {

            Graphics g = this.CreateGraphics();

            g.FillRectangle(new SolidBrush(Color.Green), new Rectangle(140, 20, 100, 100));

        }

这个例子在窗体Load、窗体Paint、按钮Click时分别绘制了红色、绿色、蓝色填充的矩形。

当运行时:

图17-31 运行时只显示绿色矩形

按下按钮时:

图17-32 显示绿色和蓝色矩形

最小化又恢复后:

图17-33 显示绿色矩形

原本的计划是:1、在Load的时候绘制一个红色正方形;2、在Paint的时候绘制一个绿色正方形;3、在按下按钮的时候绘制一个蓝色正方形;一共三个矩形。

运行后窗体上只显示了绿色而没有显示红色矩形,因为窗口Load事件之后是Paint事件,而Paint执行的时候将界面刷新了,对整个窗口进行了重绘:先是清除之前绘制的内容,然后按照Paint里面代码做了绘制,所以绿色矩形正常显示,而红色矩形没有显示。同样的,最小化后再恢复窗口,也触发了窗体的Paint事件,进行了重绘,所以绿色矩形在而蓝色矩形没有了。

分析了造成矩形不显示的原因,那么针对重绘的问题,也就有了以下解决方法:只需要把绘制的图形保存下来,当重绘时在绘制出来即可。

【例 17.29【项目:code17-029】防止重绘时图形消失。

        //用来保存绘制的图形

        Bitmap bmp;

        Graphics g;

        private void Form1_Load(object sender, EventArgs e)

        {

            //使图像宽度和高度与窗体相同

            bmp = new Bitmap(this.Width, this.Height);

            //通过图像创建Graphic

            g = Graphics.FromImage(bmp);

            g.FillRectangle(new SolidBrush(Color.Red), new Rectangle(20, 20, 100, 100));

            ShowImg();

        }

        private void button1_Click(object sender, EventArgs e)

        {

            g.FillRectangle(new SolidBrush(Color.Green), new Rectangle(140, 20, 100, 100));

            g.FillRectangle(new SolidBrush(Color.Blue), new Rectangle(260, 20, 100, 100));

            ShowImg();

        }

        private void Form1_Paint(object sender, PaintEventArgs e)

        {

            ShowImg();

        }

        //在窗体上显示图像

        private void ShowImg()

        {

            Graphics gPaint = this.CreateGraphics();

            gPaint.DrawImage(bmp, new Point(0, 0));

        }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)

        {

            g.Dispose();

            bmp.Dispose();

        }

这下,窗体Load时的红色正方形以及按下按钮后的绿色和蓝色矩形,即使窗体最小化也不怕消失了。

17.2.11 绘制统计图

【例 17.30【项目:code17-030】绘制统计图

假设知道某个公司1-4季度的经营利润情况,完成统计图的绘制。

新建一个窗体,主要使用到的控件如下:

添加4个Label控件,分别是“一季度”、“二季度”、“三季度”、“四季度”。

添加4个NumericUpDown控件,名称从 nudSeason1至 nudSeason4。

添加1个ComboBox控件,名称为cbType,代码中为它的Items增加柱状图、折线图、扇形图、环形图。

添加1个PictureBox控件,名称为pbShow,将在这里面显示统计图。

添加2个Button控件,名称分别为btnCreate和btnSave,Text属性分别为“生成”和“保存”。当按下“生成”按钮后,将在pbShow中显示统计图;当按下“保存”按钮后,将弹出保存文件对话框,设置文件名后将统计图保存下来。

具体代码如下:

        Graphics g;

        Bitmap bmp;

        //刻度线每份对应的数量

        float perScaleValue;

        //原点x轴移动

        int TranslateX = 40;

        //原点y轴移动

        int TranslateY = 40;

        //季度(x轴)之间间隔

        int xSpan = 60;

        private void Form1_Load(object sender, EventArgs e)

        {

            bmp = new Bitmap(pbShow.Width, pbShow.Height);

            g = Graphics.FromImage(bmp);

            cbType.Items.Add("柱形图");

            cbType.Items.Add("折线图");

            cbType.Items.Add("扇形图");

            cbType.Items.Add("环形图");

            cbType.Text = cbType.Items[0].ToString();

        }

        private void btnCreate_Click(object sender, EventArgs e)

        {

            g.Clear(System.Drawing.Color.White);

            switch(cbType.Text)

            {

                case "柱形图":

                    DrawAxis();

                    DrawBarGraph();

                    break;

                case "折线图":

                    DrawAxis();

                    DrawLine();

                    break;

                case "扇形图":

                    DrawPie();

                    break;

                case "环形图":

                    DrawAnnular();

                    break;

                default:

                    break;

            }

            pbShow.Image = bmp;

        }

       

        //绘制坐标轴

        private void DrawAxis()

        {

            int[] seasonValue = new int[4];

            seasonValue[0] = (int)nudSeason1.Value;

            seasonValue[1] = (int)nudSeason2.Value;

            seasonValue[2] = (int)nudSeason3.Value;

            seasonValue[3] = (int)nudSeason4.Value;

            //获得最大值

            int seasonMax = seasonValue.Max();

            //获得需要的刻度数量

            int scaleCount;

            scaleCount = seasonMax / 10 + 1;

            //使用红色绘制坐标轴

            Pen p = new Pen(System.Drawing.Color.Red, 1);

            //坐标轴末尾箭头

            p.EndCap = LineCap.ArrowAnchor;

            int AxisYHeight;

            AxisYHeight = pbShow.Height - TranslateY * 2;

            perScaleValue = AxisYHeight / scaleCount;

            //坐标原点

            int originX = TranslateX;

            int originY = pbShow.Height - TranslateY;

            Point originPoint = new Point(originX, originY);

            //绘制横坐标

            g.DrawLine(p, originPoint, new Point(pbShow.Width - TranslateX, originY));

            //绘制纵坐标

            g.DrawLine(p, originPoint, new Point(originX, TranslateY));

            //红色绘制坐标轴刻度

            Pen pAxisY = new Pen(System.Drawing.Color.Red, 1);

            Point AxisYPos;

            string AxisYValue;

            //在纵轴上标明刻度线,每10个刻度标注一下

            for(int i = 0;i< scaleCount;i++)

            {

                //刻度值

                AxisYValue = (i * 10).ToString();

                //刻度位置

                AxisYPos = new Point(20, originY - i * (int)perScaleValue - 5);

                //标明刻度值

                g.DrawString(AxisYValue, new Font("宋体", 10), new SolidBrush(System.Drawing.Color.Blue), AxisYPos);

                //画刻度,实际0刻度线是和横坐标轴重合

                g.DrawLine(pAxisY, new Point(TranslateX, originY - i * (int)perScaleValue), new Point(TranslateX + 10, originY - i * (int)perScaleValue));

            }

        }

       

        //绘制柱状图

        private void DrawBarGraph()

        {

            //标注每个季度

            int[] seasonValue = new int[4];

            seasonValue[0] = (int)nudSeason1.Value;

            seasonValue[1] = (int)nudSeason2.Value;

            seasonValue[2] = (int)nudSeason3.Value;

            seasonValue[3] = (int)nudSeason4.Value;

            string[] seasonName = { "一季度", "二季度", "三季度", "四季度" };

            //立柱(矩形)的左上角坐标点

            int recX, recY;

            //循环画四个矩形

            for(int i = 0;i<4;i++)

            {

                recX = (i + 1) * xSpan;

                recY = pbShow.Height - TranslateY - (int)(seasonValue[i] / 10 * perScaleValue);

                g.FillRectangle(new SolidBrush(Color.Blue), new Rectangle(recX, recY, 40, (int)(seasonValue[i] / 10 * perScaleValue)));

            }

            //标出每个季度

            int strX, strY;

            for(int i =0;i<4;i++)

            {

                strX = (i + 1) * xSpan - 5;

                strY = pbShow.Height - TranslateY + 10;

                g.DrawString(seasonName[i], new Font("黑体", 10), new SolidBrush(Color.Blue), new Point(strX, strY));

            }

        }

       

        //绘制折线图

        private void DrawLine()

        {

            //标注每个季度

            int[] seasonValue = new int[4];

            seasonValue[0] = (int)nudSeason1.Value;

            seasonValue[1] = (int)nudSeason2.Value;

            seasonValue[2] = (int)nudSeason3.Value;

            seasonValue[3] = (int)nudSeason4.Value;

            string[] seasonName = { "一季度", "二季度", "三季度", "四季度" };

            //先要获得每个值所在的坐标点

            //为了显眼,绘制点的显示为一个直径为8的蓝色圆形

            int signX, signY;

            //将每个坐标点存入数组,画折线时候需要

            Point[] pointSign = new Point[4];

            for(int i =0; i<4; i++)

            {

                signX = (i + 1) * xSpan + 10;

                signY = pbShow.Height - TranslateY - (int)(seasonValue[i] / 10 * perScaleValue);

                pointSign[i] = new Point(signX, signY);

                //请注意画园时候的Rectangle位置

                g.FillEllipse(new SolidBrush(Color.Blue), new Rectangle(signX - 4, signY - 4, 8, 8));

            }

            //使用红色画折线

            Pen penSign = new Pen(Color.Red, 2);

            //将四个坐标点连接起来,注意画的是三条线

            for (int i = 0; i < 3; i++)

                g.DrawLine(penSign, pointSign[i], pointSign[i + 1]);

            //标出每个季度

            int strX, strY;

            for(int i = 0;i<4;i++)

            {

                strX = (i + 1) * xSpan - 5;

                strY = pbShow.Height - TranslateY + 10;

                g.DrawString(seasonName[i], new Font("黑体", 10), new SolidBrush(Color.Blue), new Point(strX, strY));

            }

        }

       

        //绘制扇形图

        private void DrawPie()

        {

            //标注每个季度

            int[] seasonValue = new int[4];

            seasonValue[0] = (int)nudSeason1.Value;

            seasonValue[1] = (int)nudSeason2.Value;

            seasonValue[2] = (int)nudSeason3.Value;

            seasonValue[3] = (int)nudSeason4.Value;

            string[] seasonName = { "一季度", "二季度", "三季度", "四季度" };

            //我们要获得4个季度总的盈利

            int seasonSum = 0;

            for (int i = 0; i < 4; i++)

                seasonSum += seasonValue[i];

            //根据总赢利情况,来获得每个季度在饼图中所占的份额(角度)

            //为了简化起见,这里直接取整数

            int[] seasonAngle = new int[5];

            seasonAngle[0] = 0;

            seasonAngle[1] = seasonValue[0] * 360 / seasonSum;

            seasonAngle[2] = seasonValue[1] * 360 / seasonSum + seasonAngle[1];

            seasonAngle[3] = seasonValue[2] * 360 / seasonSum + seasonAngle[2];

            seasonAngle[4] = 360;

            //分别用4种颜色表示不同季度的盈利

            System.Drawing.Color[] seasonColor = { Color.Red, Color.Blue, Color.Green, Color.GreenYellow };

            for(int i = 0;i<4;i++)

            {

                g.FillPie(new SolidBrush(seasonColor[i]), new Rectangle(50, 80, 200, 200), seasonAngle[i], seasonAngle[i + 1] - seasonAngle[i]);

                //饼图中特别需要说明每个季度对应的颜色

                g.FillRectangle(new SolidBrush(seasonColor[i]), new Rectangle(260, i * 30 + 20, 30, 20));

                //标出每个季度

                g.DrawString(seasonName[i], new Font("宋体", 12), new SolidBrush(Color.Black), new Point(300, i * 30 + 20));

            }

        }

        //绘制环形图

        private void DrawAnnular()

        {

            //标注每个季度

            int[] seasonValue = new int[4];

            seasonValue[0] = (int)nudSeason1.Value;

            seasonValue[1] = (int)nudSeason2.Value;

            seasonValue[2] = (int)nudSeason3.Value;

            seasonValue[3] = (int)nudSeason4.Value;

            string[] seasonName = { "一季度", "二季度", "三季度", "四季度" };

            //我们要获得4个季度总的盈利

            int seasonSum = 0;

            for (int i = 0; i < 4; i++)

                seasonSum += seasonValue[i];

            //根据总赢利情况,来获得每个季度在饼图中所占的份额(角度)

            //为了简化起见,这里直接取整数

            int[] seasonAngle = new int[5];

            seasonAngle[0] = 0;

            seasonAngle[1] = seasonValue[0] * 360 / seasonSum;

            seasonAngle[2] = seasonValue[1] * 360 / seasonSum + seasonAngle[1];

            seasonAngle[3] = seasonValue[2] * 360 / seasonSum + seasonAngle[2];

            seasonAngle[4] = 360;

            //圆环内弧与外弧之间的距离

            int xSpace = 50;

            //分别用4种颜色表示不同季度的盈利

            Color[] seasonColor = { Color.Red, Color.Blue, Color.Green, Color.GreenYellow };

            //这里使用GraphicsPath和Region

            for(int i=0; i<4;i++)

            {

                //大的扇形

                GraphicsPath pathPieMax = new GraphicsPath();

                pathPieMax.AddPie(new Rectangle(50, 80, 200, 200), seasonAngle[i], seasonAngle[i + 1] - seasonAngle[i]);

                //小的扇形

                GraphicsPath pathPieMin = new GraphicsPath();

                pathPieMin.AddPie(new Rectangle(50 + xSpace, 80 + xSpace, 200 - xSpace * 2, 200 - xSpace * 2), seasonAngle[i], seasonAngle[i + 1] - seasonAngle[i]);

                //圆环=大的扇形-小的扇形

                Region regoinAnnular = new Region(pathPieMax);

                regoinAnnular.Exclude(pathPieMin);

                //填充区域

                g.FillRegion(new SolidBrush(seasonColor[i]), regoinAnnular);

                //饼图中特别需要说明每个季度对应的颜色

                g.FillRectangle(new SolidBrush(seasonColor[i]), new Rectangle(260, i * 30 + 20, 30, 20));

                //标出每个季度

                g.DrawString(seasonName[i], new Font("宋体", 12), new SolidBrush(Color.Black), new Point(300, i * 30 + 20));

            }

        }

        //保存图片

        private void btnSave_Click(object sender, EventArgs e)

        {

            SaveFileDialog sfd = new SaveFileDialog();

            sfd.Filter = "JPG文件|*.jpg";

            if (sfd.ShowDialog() != DialogResult.OK)

                return;

            string filename = sfd.FileName;

            bmp.Save(filename);

        }

运行结果如下图所示:

图17-34 生成环状图

学习更多vb.net知识,请参看vb.net 教程 目录

学习更多C#知识,请参看C#教程 目录

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/67691.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数

import numpy as np import torch import torch.nn as nn import torch.optim as optim from sklearn.metrics import precision_score, recall_score, f1_score# 数据准备 class1_points np.array([[1.9, 1.2],[1.5, 2.1],[1.9, 0.5],[1.5, 0.9],[0.9, 1.2],[1.1, 1.7],[1.4,…

neo4j入门

文章目录 neo4j版本说明部署安装Mac部署docker部署 neo4j web工具使用数据结构图数据库VS关系数据库 neo4j neo4j官网Neo4j是用ava实现的开源NoSQL图数据库。Neo4作为图数据库中的代表产品&#xff0c;已经在众多的行业项目中进行了应用&#xff0c;如&#xff1a;网络管理&am…

Java基础——分层解耦——IOC和DI入门

目录 三层架构 Controller Service Dao ​编辑 调用过程 面向接口编程 分层解耦 耦合 内聚 软件设计原则 控制反转 依赖注入 Bean对象 如何将类产生的对象交给IOC容器管理&#xff1f; 容器怎样才能提供依赖的bean对象呢&#xff1f; 三层架构 Controller 控制…

智慧园区系统集成解决方案引领未来城市管理的智能化转型

内容概要 在现代城市管理的背景下&#xff0c;“智慧园区系统集成解决方案”正扮演着越来越重要的角色。这种解决方案不仅仅是技术上的创新&#xff0c;更是一种全新的管理理念&#xff0c;它旨在通过高效的数据整合与分析&#xff0c;优化资源配置&#xff0c;提升运营效率。…

99.24 金融难点通俗解释:MLF(中期借贷便利)vs LPR(贷款市场报价利率)

目录 0. 承前1. 什么是MLF&#xff1f;1.1 专业解释1.2 通俗解释1.3 MLF的三个关键点&#xff1a; 2. 什么是LPR&#xff1f;2.1 专业解释2.2 通俗解释2.3 LPR的三个关键点&#xff1a; 3. MLF和LPR的关系4. 传导机制4.1 第一步&#xff1a;央行调整MLF4.2 第二步&#xff1a;银…

【VM】VirtualBox安装CentOS8虚拟机

阅读本文前&#xff0c;请先根据 VirtualBox软件安装教程 安装VirtualBox虚拟机软件。 1. 下载centos8系统iso镜像 可以去两个地方下载&#xff0c;推荐跟随本文的操作用阿里云的镜像 centos官网&#xff1a;https://www.centos.org/download/阿里云镜像&#xff1a;http://…

家居EDI:Hom Furniture EDI需求分析

HOM Furniture 是一家成立于1977年的美国家具零售商&#xff0c;总部位于明尼苏达州。公司致力于提供高品质、时尚的家具和家居用品&#xff0c;满足各种家庭和办公需求。HOM Furniture 以广泛的产品线和优质的客户服务在市场上赢得了良好的口碑。公司经营的产品包括卧室、客厅…

【VUE案例练习】前端vue2+element-ui,后端nodo+express实现‘‘文件上传/删除‘‘功能

近期在做跟毕业设计相关的数据后台管理系统&#xff0c;其中的列表项展示有图片展示&#xff0c;添加/编辑功能有文件上传。 “文件上传/删除”也是我们平时开发会遇到的一个功能&#xff0c;这里分享个人的实现过程&#xff0c;与大家交流谈论~ 一、准备工作 本次案例使用的…

VLN视觉语言导航基础

0 概述 视觉语言导航模型旨在构建导航决策模型 π π π&#xff0c;在 t t t时刻&#xff0c;模型能够根据指令 W W W、历史轨迹 τ { V 1 , V 2 , . . . , V t − 1 } \tau\{V_1,V_2,...,V_{t-1}\} τ{V1​,V2​,...,Vt−1​}和当前观察 V t { P t , R t , N ( V t ) } V_…

Flux的三步炼丹炉——fluxgym(三):矩阵测试

前面两篇文章给大家介绍了如何准备素材和怎么炼丹&#xff0c;现在我们拿到训练完成后的多个Lora怎么才能确定哪个才是我们需要的、效果最好的呢&#xff1f;答案就是使用xyz图表测试&#xff0c;也称为矩阵测试&#xff0c;通过控制控制变量的方法对Lora模型批量生图&#xff…

利用Muduo库实现简单且健壮的Echo服务器

一、muduo网络库主要提供了两个类&#xff1a; TcpServer&#xff1a;用于编写服务器程序 TcpClient&#xff1a;用于编写客户端程序 二、三个重要的链接库&#xff1a; libmuduo_net、libmuduo_base、libpthread 三、muduo库底层就是epoll线程池&#xff0c;其好处是…

文件读写操作

写入文本文件 #include <iostream> #include <fstream>//ofstream类需要包含的头文件 using namespace std;void test01() {//1、包含头文件 fstream//2、创建流对象ofstream fout;/*3、指定打开方式&#xff1a;1.ios::out、ios::trunc 清除文件内容后打开2.ios:…

C++编程语言:抽象机制:模板(Bjarne Stroustrup)

目录 23.1 引言和概观(Introduction and Overview) 23.2 一个简单的字符串模板(A Simple String Template) 23.2.1 模板的定义(Defining a Template) 23.2.2 模板实例化(Template Instantiation) 23.3 类型检查(Type Checking) 23.3.1 类型等价(Type Equivalence) …

无人机图传模块 wfb-ng openipc-fpv,4G

openipc 的定位是为各种模块提供底层的驱动和linux最小系统&#xff0c;openipc 是采用buildroot系统编译而成&#xff0c;因此二次开发能力有点麻烦。为啥openipc 会用于无人机图传呢&#xff1f;因为openipc可以将现有的网络摄像头ip-camera模块直接利用起来&#xff0c;从而…

【JavaEE进阶】图书管理系统 - 壹

目录 &#x1f332;序言 &#x1f334;前端代码的引入 &#x1f38b;约定前后端交互接口 &#x1f6a9;接口定义 &#x1f343;后端服务器代码实现 &#x1f6a9;登录接口 &#x1f6a9;图书列表接口 &#x1f384;前端代码实现 &#x1f6a9;登录页面 &#x1f6a9;…

【算法设计与分析】实验8:分支限界—TSP问题

目录 一、实验目的 二、实验环境 三、实验内容 四、核心代码 五、记录与处理 六、思考与总结 七、完整报告和成果文件提取链接 一、实验目的 掌握分支界限求解问题的思想&#xff1b;针对不同的问题&#xff0c;能够利用分支界限法进行问题拆分和求解以及时间复杂度分析…

【Linux】opencv在arm64上提示找不到libjasper-dev

解决opencv在arm64上提示找不到libjasper-dev的问题。 本文首发于❄慕雪的寒舍 问题说明 最近我在尝试编译opencv&#xff0c;安装依赖项libjasper1和libjasper-dev的时候就遇到了这个问题。在amd64平台上&#xff0c;我们可以通过下面的命令安装&#xff08;ubuntu18.04&…

【数据结构】_时间复杂度相关OJ(力扣版)

目录 1. 示例1&#xff1a;消失的数字 思路1&#xff1a;等差求和 思路2&#xff1a;异或运算 思路3&#xff1a;排序&#xff0b;二分查找 2. 示例2&#xff1a;轮转数组 思路1&#xff1a;逐次轮转 思路2&#xff1a;三段逆置&#xff08;经典解法&#xff09; 思路3…

基于微信小程序的电子商城购物系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

tomcat核心组件及原理概述

目录 1. tomcat概述 1.1 概念 1.2 官网地址 2. 基本使用 2.1下载 3. 整体架构 3.1 核心组件 3.2 从web.xml配置和模块对应角度 3.3 如何处理请求 4. 配置JVM参数 5. 附录 1. tomcat概述 1.1 概念 什么是tomcat Tomcat是一个开源、免费、轻量级的Web服务器。 Tomca…