关闭

C#窗体绘制基本理解

标签: 控件C#窗体应用程序net绘制直方图
70人阅读 评论(0) 收藏 举报
分类:

C#windows窗体应用程序窗口绘制简单理解

本文简单以Form_paint事件绘制统计直方图为例作为例子讲解。

其他控件的(例如panel等容器)的paint事件类似,不做详述。

首先理解窗体的布局

  • 窗体的坐标系
    窗体的坐标是类似X,Y坐标轴的,但是Y轴是倒着的,像这样:
    这里写图片描述

  • 窗体的绘制或者说更新非常频繁
    鼠标对于控件聚焦啊,各种文本框的change啊,所以需要设置特定的触发条件控制窗口的重绘。

  • 窗体对于数据的更新和接受
    这里我简单用了一个文本框传入一组数据用于绘制直方图的参考
  • 窗体的布局

这里写图片描述
- 控件及其name属性
label控件:
name label1,用于实例数据展示,这里提示用逗号“,”分隔数据,因为我里面用的替换公式用匹配的逗号。
button控件:
属性name buttonReSet,属性 text 刷新数据,用于设置窗体重新绘制的触发条件。
属性name buttonClear,属性text 重置,用于清除当前窗体绘制的数据。
textbox控件:
属性name textBoxData,属性text 如图一串数据,目的是赋初值(这也是很多异常“未将对象引用到对象实例”的常见情况,很多参数是有了,但是方法并有得到数据,只是一个空值null会引起异常报错)。
- 事件
在这个例子中我使用的是form_paint事件。该事件位于事件栏外观一项。按分类顺序最下面,这里就不插图了。
最后实现效果图,没有时间去优化美工,见谅:
输入的数据一
在显示第二份数据时请先点击重置,以清除绘制记录!!!
输入的数据二
- 接下来就是代码了
- 程序代码如下,附带少量注释

//这里是窗体的paint事件代码,开启菜单时便会绘制的部分
private void FormBrush_Paint(object sender, PaintEventArgs e)
{
    Graphics g = this.CreateGraphics();
    Pen LinePen = new Pen(Color.Black, 3);
    //LinePen.DashStyle=System.Drawing.Drawing2D.DashStyle.Solid;
    LinePen.EndCap =System.Drawing.Drawing2D.LineCap.ArrowAnchor;//定义线尾的样式为箭头 

    int ZeroY = 450;//定义原点坐标Y值
    int ZeroX = 30;//定义原点坐标X值

    Point Line_start = new Point(ZeroX, ZeroY);
    Point Liney_end = new Point(ZeroX, 50);
    Point Linex_end = new Point(660, ZeroY);

    g.DrawLine(LinePen, Line_start, Liney_end);//y轴
    g.DrawLine(LinePen, Line_start, Linex_end);//x轴

    //画Y轴精度
    Pen percisionPen = new Pen(Color.Black, 2);
    for (int i = 0; i < 10; i++)
    {
        Line_start = new Point(30, ZeroY );
        Linex_end = new Point(50, ZeroY );
        g.DrawLine(percisionPen, Line_start, Linex_end);//y轴粗精度
        ZeroY -= 40;
    }
    ZeroY = 450;//定义原点坐标Y值
    ZeroX = 30;//定义原点坐标X值
    for (int i = 0; i < 20; i++)
    {
        Line_start = new Point(30, ZeroY);
        Linex_end = new Point(40, ZeroY);
        g.DrawLine(percisionPen, Line_start, Linex_end);//y轴细精度
        ZeroY -= 20;
    }
   //这里有个可以改进的地方,因为我用的是两个循环画的大精度和小精度,所以在这个比例大小情况下每隔一个精度就会有一个大精度会覆盖小精度。可以定义一个变量,用-1的n次方来决定精度的长短。



    //绘制Y轴标度
    string drawStr;
    Font drawFont = new Font("粗体", 12);
    SolidBrush drawBrush = new SolidBrush(Color.Black);
    float x = 5, y = 440;//因为绘制文本与绘制线条图案不一样,所以使用了浮点型变量。
    int drawint = 0;
    for (int i=0;i<20;i++)
    {
        drawStr = Convert.ToString(drawint);
        PointF drawPoint = new PointF(x, y);
        g.DrawString(drawStr, drawFont, drawBrush, drawPoint);
        drawint += 5;//这里设置标度递增值为5
        y -= 20;
        }
    }
//这里是控件控制绘制直方图的部分
 private void buttonReSet_Click(object sender, EventArgs e)
{
    Graphics g = this.CreateGraphics();
    string[] str = Regex.Split(textBoxData.Text.TrimEnd("\r\n".ToCharArray()).Replace("\r\n", ","), ",");
    //这里用split类识别textbox控件里面的逗号“,”并将里面的数字分隔放入数组
    intDate = Array.ConvertAll<string, int>(str, s => int.Parse(s));
    //这里用数组转换类型巨好用的公式将string类型转换为int类型,因为后面绘制直方图时Rectangle类传递的矩形长宽数据参数只能是整数类型。
    SolidBrush RectangleBrush = new SolidBrush(Color.RoyalBlue);
    int StartPointX = 60;//定义矩形起始X位置
    int StartPointY = 450;
    int RecWidth = 50;//定义矩形宽度

    Pen RedPen = new Pen(Color.Red, 3);
    RedPen.DashStyle = System.Drawing.Drawing2D.DashStyle.DashDot;

    //绘制矩形,注意矩形绘制和文本绘制等这种区域性图形的绘制,是以左上角的坐标为起点,然后根据长宽的值来绘制。
    for (int i = 0; i < intDate.Length; i++)
    {
        Rectangle rect = new Rectangle(StartPointX, StartPointY - intDate[i] * 4, RecWidth, (intDate[i]) * 4);
        //这里是我最想要吐槽的地方,因为前面绘制标度的时候每个刻度的值是按5递增,则实际单位比原窗口源单位值打了五倍,如果直接按照传递值绘制,则每个矩形图的高度都会多了整整4份,所以要减去4倍初始值。
        Point dashPoint = new Point(30, StartPointY - intDate[i] * 4);
         Point dashPointEnd = new Point(StartPointX + 50, StartPointY - intDate[i] * 4);
         //fillRectangle绘制实心矩形
         g.FillRectangle(RectangleBrush, rect);
         g.DrawLine(RedPen, dashPoint, dashPointEnd);
         StartPointX += 90;
    }
}

最后唠叨一句

以上代码在我上传的文档有,《.NET高级程序编程》里面,还有部分另外四个关于多线程,文件读取与保存(抛弃c文件流,用控件OpenfalieDialog和SaveFileDialog实现),tcp/ip实现网络消息传递功能等的代码,欢迎下载交流,脸厚如墙欢迎大家批评指教。

本文章原创,代码原创,欢迎大家转载惠存!

0
0
查看评论

C#自画窗体的实现

我平时比较喜欢使用delphi,小生不才,我随然喜欢delphi,平时开发(至少现在)多用delphi,但是不怕各位高手笑话,我没有用delphi写过控件,虽然原理上知道,但总感觉不知无从下手:L  但是自从接触了c#,她哪优美的身姿(代码风格),风骚而不放纵的性格(对面向对象的体现比较好...
  • ytbada
  • ytbada
  • 2007-01-09 16:59
  • 828

C#绘制圆角窗体

public   void   SetWindowRegion()       {       System.Drawing.Drawing2D.GraphicsPath   FormPath;   ...
  • Terry001
  • Terry001
  • 2008-05-01 02:51
  • 4178

从0自学C#01--自绘窗体边框

从0自学C#01–自绘窗体边框主要介绍自绘窗体边框和背景颜色逐级变浅(深)。
  • tclxspy
  • tclxspy
  • 2016-01-15 14:46
  • 937

C# 在窗体中绘制字符串

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System....
  • Godsight
  • Godsight
  • 2017-02-28 21:57
  • 855

无框圆角矩形窗体

我是一个C#的初学者 只要涉及到windows窗体编程 都希望窗体的外观比较好看 不是系统默认的那样 对于C# 更改窗体外观感觉并不那么轻松 更改窗体外观涉及到使用GDI+ 我所知道的有两种方法: 有系统边框的窗体 处理窗体的Paint方法,在paint方法中 参数e.Graphic...
  • lllljz
  • lllljz
  • 2012-05-13 11:10
  • 4788

C# 制作不规则窗体的几种解决方案

制作不规则窗体,本例采用图片背景形式,这也是通常的思路。以前也做过类似的案例,但都不深入,这次项目中需要用到,顺便理了下思路,找到另一种比较简单的方法,下面介绍下三种解决方案。   第一种:也是大家管用的一种方法,实现步骤如下      ①:准备一张bmp的...
  • dongzhe8
  • dongzhe8
  • 2015-12-21 17:52
  • 854

C# Winform 窗体美化(三、不规则窗体)

三、不规则窗体概况之前学习的 LayeredSkin 看到里面有个异形窗口,比较感兴趣,所以就找一下资料研究一下。不规则窗体学习有一个比较好的例子,叫 GoldFishProject,是一条鱼金鱼在屏幕上游。不规则窗口示例代码 GoldFishProject 游动金鱼的学习代码现学习了两种实现方式...
  • myinc
  • myinc
  • 2017-04-15 10:05
  • 3049

c#窗体基本知识

概述 何谓模式窗体?简单的可以理解为窗体对话框,用户必须在完成该窗体上的操作或关闭窗体后才能返回打开此窗体的窗体。本文不对模式窗体的定义、特征、功能做具体讨论,主要把重点放在如何在.net窗体应用程序中有效的使用模式窗体,解决使用模式窗体中碰到的常见问题。  模式窗体的属性设置 ...
  • a88403379
  • a88403379
  • 2014-06-10 17:49
  • 804

C#使用图片制作不规则窗体

C#中可以采用图片的特定背景色在显示时不绘制来实现不规则窗体的设计,如图: 图为用PS设计的一张原始图片素材,素材背景色采用蓝色填充,将图片保存为BMP格式,在保存时注意图片保存的位数需要小于24位,不包含24位图。图片素材如下:   (考虑水平有限素材设计呢比较丑)&#...
  • yxtouch
  • yxtouch
  • 2014-09-10 21:11
  • 1209

创建圆形窗体(源码)

using System;using System.Drawing;using System.Collections;using System.ComponentModel;using System.Windows.Forms;using ...
  • dql1982
  • dql1982
  • 2007-12-20 14:37
  • 196
    个人资料
    • 访问:620次
    • 积分:26
    • 等级:
    • 排名:千里之外
    • 原创:2篇
    • 转载:0篇
    • 译文:0篇
    • 评论:1条
    文章分类
    文章存档
    最新评论