0%

  • 来源:明日科技
  • 抓取鼠标形状

    实例说明

    在Windows系统中,用户利用Print Screen SysRq键抓取窗口时,不能够抓取鼠标形状。但在一些抓图软件中,却能够抓取鼠标形状,该功能是如何实现的呢?本实例中实现了抓取鼠标形状的功能,实例运行效果如图1所示。
    图1 抓取鼠标形状

    关键技术

    本实例在实现抓取鼠标形状功能时,使用了Cursor类的Draw方法,该方法用来在指定边界内和指定的表面上绘制光标,其语法格式如下:
    public void Draw ( Graphics g, Rectangle targetRect)
    参数说明
    g:要在其上绘制Cursor的Graphics表面。
    targetRect:代表Cursor限定范围的Rectangle。

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为SnatchAtMouse。
    (2)更改默认窗体Form1的Name属性为Frm_Main。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    private void Frm_Main_MouseUp(object sender, MouseEventArgs e)
    {
    Graphics myGraphics = this.CreateGraphics(); //创建窗体的Graphics对象
    Cursor.Draw(myGraphics, new Rectangle(e.X, e.Y, 10, 10)); //调用Cursor类的Draw方法抓取鼠标形状
    }

    秘笈心法

    心法领悟003:用窗体的CreateGraphics方法创建Graphics对象。
    在程序中绘图时,可以调用窗体的CreateGraphics方法来获取对Graphics对象的引用,该对象表示窗体的绘图画面。
    例如,本实例中创建Graphics对象的代码如下:
    Graphics graphics = this.CreateGraphics( ); //创建窗体的Graphics对象

  • 来源:明日科技
  • 利用Image制作小动画

    实例说明

    本实例实现了用图片控件制作小动画的功能,运行程序,窗体中间会显示一个小动画。实例运行效果如图1所示。

    图1 利用Image制作小动画

    关键技术

    动画的实现主要在一定的时间内显示连续的图片,本实例通过添加Timer计时器,并在Timer计时器内显示固定数量的图标来实现动画效果。

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为TailorAnimation。
    (2)更改默认窗体Form1的Name属性为Frm_Main,在该窗体中添加一个PictureBox控件,用来显示图片;添加一个Timer计时器组件,用来控制动画显示频率。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private void Frm_Main_Load(object sender, EventArgs e)
    {
    //截取图片所在的文件路径
    strPath = Application.StartupPath.Substring(0, Application.StartupPath.Substring(0, Application.StartupPath.LastIndexOf("\\\")).LastIndexOf("\\\"));
    pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; //设置图片的显示类型
    pictureBox1.Image = Image.FromFile(strPath + @"\\image\\1.jpg");//为pictureBox1设置显示的图片
    }
    private void timer1_Tick(object sender, EventArgs e)
    {
    Random r = new Random(); //声明一个随机类的对象
    pictureBox1.Image = Image.FromFile(strPath + @"\\image\\" + r.Next(1, 5) + ".jpg"); //为pictureBox1设置显示图片
    }

    秘笈心法

    心法领悟005:Timer计时器组件的使用。
    Timer组件是一个计时器组件,它主要用来按用户定义的时间间隔来引发事件,引发的事件一般为周期性的,每隔若干秒或若干毫秒执行一次。

  • 来源:明日科技
  • 制作家庭影集


    实例说明

    许多家庭为了防止照片的损坏,便将图片存入电脑中,为了更方便的浏览图片,本实例制作了一个多图片的浏览程序,运行本实例,单击“上一张”、“下一张”按钮,可以对图片进行快速浏览。实例运行效果如图1所示。

    图1 制作家庭影集

    关键技术

    本实例在实现时,首先通过DirectoryInfo类的GetFileSystemInfos方法从指定的文件夹中获取图片信息;然后将所有的图片名称取出来放在一个字符串中,并通过Split方法分割字符串生成一个存储图片名称的数组,数组的大小就是图片的数量;最后通过一个变量进行增加或减少作为数组下标从而实现图片的显示。下面对本实例中用到的关键技术进行详细介绍。
    (1)DirectoryInfo类的GetFileSystemInfos方法 该方法用来返回表示某个目录中所有文件和子目录的强类型FileSystemInfo项的数组,其语法格式如下:
    public Rectangle WorkingArea { get; }
    参数说明
    返回值:强类型FileSystemInfo项的数组。
    (2)Split方法 该方法返回的字符串数组包含字符串中的子字符串(由指定Unicode字符数组的元素分隔),其语法格式如下:
    public string[] Split(char[] separator)
    参数说明 separator:分隔此实例中子字符串的Unicode字符数组、不包含分隔符的空数组或null。
    返回值:一个数组,其元素包含此实例中的子字符串,这些子字符串由separator参数中的一个或多个字符分隔。

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为TailorFamilyAlbum。
    (2)更改默认窗体Form1的Name属性为Frm_Main,在该窗体中添加两个Button控件和一个PictureBox控件,分别用来执行上一张、下一张导向操作以及显示图片信息。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    public void GetAllFiles(DirectoryInfo dir)
    {
    FileSystemInfo[] fileinfo = dir.GetFileSystemInfos(); //初始化一个FileSystemInfo类型的数组
    foreach (FileSystemInfo i in fileinfo) //循环遍历fileinfo中的每一个记录
    {
    if (i is DirectoryInfo) //当i在类DirectoryInfo中存在时
    {
    GetAllFiles((DirectoryInfo)i); //获取i下的所有文件
    }
    else //当不存在该i时
    {
    string str = i.FullName; //记录变量i的全名
    int b = str.LastIndexOf("\\\"); //在此示例中获取最后一个匹配项的索引
    string strType = str.Substring(b + 1); //保存文件的后缀
    //当文件格式为“jpg”或者“bmp”时
    if (strType.Substring(strType.Length - 3) == " jpg " || strType.Substring(strType.Length - 3) == " bmp ")
    {
    strInfo += strType + "#"; //为变量strInfo赋值
    }
    }
    }
    }

    Frm_Main窗体加载时,调用GetAllFiles方法,并将该方法的返回值转化为一个字符串数组,用于存放图片名。代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    private void Frm_Main_Load(object sender, EventArgs e)
    {
    DirectoryInfo dir = new DirectoryInfo(strPath); //创建一个DirectoryInfo对象
    GetAllFiles(dir); //获取dir下的所有文件
    if (strInfo != "") //当字符串不为空时
    {
    strName = strInfo.Split('#'); //获取文件名
    Num = 0; //初始化Num的值
    showPic(Num); //显示图片
    Count = strName.Length - 1; //记录Array中的元素数
    }
    else//当字符串为空时
    {
    MessageBox.Show("影集里没有照片");//弹出信息提示
    }
    }

    秘笈心法

    心法领悟006:妙用foreach语句!
    foreach循环专门用来遍历数组和集合的元素,foreach的工作原理是逐个枚举出数组或集合中的每一个元素,每当枚举一个元素就执行一次语句块中的内容,在使用foreach遍历的过程中要注意不可以更改遍历中的集合。

  • 来源:明日科技
  • 制作AVI播放器


    实例说明

    相信大家都使用过“金山影霸”、“RealOne”等影视播放器,其强大的媒体播放功能深受大家的喜爱。是否想过自己设计一个AVI播放器呢?本实例中笔者设计了一个AVI播放器,实现了对AVI文件的基本播放与重复播放的功能。实例运行效果如图1所示。

    图1 制作AVI播放器

    关键技术

    本实例实现时主要用到了Microsoft Animation Control Version 6.0组件,该组件可以一帧一帧的播放AVI文件,在使用该组件进行开发程序前,必须将Microsoft Animation Control Version 6.0组件添加到工具箱中,步骤如下:
    (1)选择工具箱,单击鼠标右键,在弹出的快捷菜单中选择“选择项”。
    (2)弹出“选择工具箱项”对话框,选择“COM组件”选项卡。
    (3)在COM组件列表中,选择名称为“Microsoft Animation Control Version 6.0”的项,单击“确定”按钮,该组件将会自动添加到“工具箱”中。 Microsoft Animation Control Version 6.0组件提供了多个属性、方法用于控制多媒体文件的播放,其常用的属性和方法如表1所示。
    表1 Microsoft Animation Control Version 6.0组件的常用属性和方法

    属性、方法 说明
    AutoPlay属性 确定程序运行时,媒体播放器是否自动播放
    Open方法 打开一个媒体文件
    Stop方法 停止媒体文件的播放
    Play方法 播放媒体文件

    注意
    注意:Play方法可以重载,本实例中使用了它的第一种重载形式,该方法具有3个参数,第一个参数是重复播放次数,第二个参数是起始帧的位置,第3个参数是结束帧的位置。

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为AviPlay。
    (2)更改默认窗体Form1的Name属性为Frm_Main,在该窗体中添加一个AxAnimation组件,用来播放AVI文件;添加两个Button控件,分别用来执行重复播放指定帧操作和播放AVI文件操作;添加两个TextBox控件,分别用来设置要重复播放的起始帧和结束帧。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    private void Frm_Main_Load(object sender, EventArgs e)
    {
    this.axAnimation1.Open(Application.StartupPath + "//clock.avi"); //加载AVI文件
    }
    private void button1_Click(object sender, EventArgs e)
    {
    try
    {
    this.axAnimation1.Stop(); //停止播放
    object start = this.textBox1.Text; //保存起始帧中的数据
    object end = this.textBox2.Text; //保存结束帧中的数据
    object time = 20; //初始化变量time
    this.axAnimation1.Play(time, start, end); //播放指定的帧数
    }
    catch
    {
    MessageBox.Show("请输入正确帧数!");
    }
    }
    private void button2_Click(object sender, EventArgs e)
    {
    this.axAnimation1.Play(); //播放多媒体文件
    }

    秘笈心法

    心法领悟007:object类型的使用。
    object类是Object类的别名,它支持.NET Framework类层次结构中的所有类,并为派生类提供低级别服务,它是.NET Framework中所有类的最终基类。一般在程序中定义变量的类型时,如果不确定变量的类型,则可以使用object类型来定义。

  • 来源:明日科技
  • 制作电影特效效果


    实例说明

    随着现代高科技越来越快的发展,电影特效在现代电影中的使用越来越多,而它们这样做的目的无非是为了更好的吸引观看者的眼球,同样的,如果开发人员能在开发的程序中实现一些电影特效效果,也一定可以为程序增色不少。
    本实例实现了两种常见的电影特效效果,实例运行结果如图1和图2所示。

    图1 文字特效

    图2 图片特效

    关键技术

    本实例在实现时主要用到了Label控件的Font属性和PictureBox控件的Size属性,下面分别对它们进行详细讲解。
    (1)Label控件的Font属性 Label控件表示一个标签控件,其Font属性用于获取或设置控件显示的文字的字体,该属性语法格式如下:
    public virtual Font Font { get; set; }
    参数说明
    属性值:要应用于由控件显示的文本的Font。默认为DefaultFont属性的值。
    (2)PictureBox控件的Size属性 PictureBox控件用于显示位图、GIF、JPEG、图元文件或图标格式的图形,其Size属性用于获取或设置控件的高度和宽度,该属性语法格式如下:
    public Size Size { get; set; }
    参数说明
    属性值:表示控件的高度和宽度(以像素为单位)。

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为MovieSpecific。 (2)更改默认窗体Form1的Name属性为Frm_Main,在该窗体中添加一个Label控件,用来显示动态缩放的文字;添加一个PictureBox控件,用来显示动态缩放的图片;添加两个Button控件,分别用来执行文字和图片缩放操作;添加一个Timer计时器组件,用来控制文字和图片的缩放。 (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    private void button1_Click(object sender, EventArgs e)
    {
    timer1.Enabled = true; //启动计时器
    pictureBox1.Visible = false;//隐藏PictureBox控件
    label1.Visible = true; //显示Label控件
    }
    private void button3_Click(object sender, EventArgs e)
    {
    label1.Visible = false; //隐藏Label控件
    timer1.Enabled = true; //启动计时器
    pictureBox1.Visible = true;//显示PictureBox控件
    }
    private void timer1_Tick(object sender, EventArgs e)
    {
    label1.Font = new Font(label1.Font.FontFamily, label1.Font.Size + 1);//使字体逐步加一
    pictureBox1.Size = new Size(pictureBox1.Size.Width + 5, pictureBox1.Size.Height + 5);//使图片逐渐增大
    }

    秘笈心法

    心法领悟008:Timer计时器组件的使用。
    Timer组件是一个计时器组件,它主要用来按用户定义的时间间隔来引发事件,引发的事件一般为周期性的,每隔若干秒或若干毫秒执行一次。

  • 来源:明日科技
  • 利用Excel打印学生信息报表


    实例说明

    Microsoft Excel是微软公司提供的用于办公管理的应用软件,具有强大的报表统计等功能。本实例在打印学生信息时,通过将数据导入到Excel文件中进行打印。运行本实例,如图1所示,单击“输出Excel”按钮,DataGridView控件中的数据便以Excel文件方式打开,如图2所示,然后用户便可以用Excel自带的打印功能对学生信息进行打印。

    图1 利用Excel打印学生信息报表

    图2 输出的Excel报表

    技术要点

    本实例中首先通过调用Microsoft Excel自动化对象模型的Workbooks对象的Add方法创建一个新的工作簿,然后通过设置Excel对象的Cells属性,向新建的工作簿中添加数据记录。下面对Workbooks对象的Add方法和Excel对象的Cells属性进行详细介绍。
    (1)Workbooks对象的Add方法 该方法主要用来创建一个新的工作簿,其使用语法格式如下:
    Workbook Add([In, Optional] object Template);
    参数说明如下。
    Template:指定是否添加工作簿,如果为True,表示添加;否则,表示不添加。
    返回值:返回Workbook类型,表示一个Excel工作簿。
    (2)Excel对象的Cells属性 该属性用来指定Excel工作簿中单元格的内容。

    例如,下面的代码用来指定Excel工作簿中第一行第一列的单元格中的内容为“Excel”:
    excel.Cells[0, 0] = “Excel”;

    实现过程

    (1)新建一个Windows应用程序,将其命名为PrintStudentInfo,默认主窗体为PrintStudentInfo。
    (2)在PrintStudentInfo窗体中添加一个DataGridView控件和一个Button控件,其中,DataGridView控件用来显示数据库中的记录,Button控件用来将DataGridView控件中的数据以Excel格式输出。
    (3)主要程序代码。 “输出Excel”按钮的Click事件实现代码如下:

    1
    2
    3
    4
    private void button1_Click(object sender, EventArgs e)
    {
    ExportDataGridview(dataGridView1, true); //将DataGridView控件中的数据导出到Excel
    }

    自定义方法ExportDataGridview用来实现将DataGridView控件中数据导出到Excel。代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    public bool ExportDataGridview(DataGridView dgv, bool isShowExcle)
    {
    if (dgv.Rows.Count == 0)//当DataGridView控件中没有数据时
    return false; //返回false
    //建立Excel对象
    Excel.Application excel = new Excel.Application(); //实例化一个Excel对象
    excel.Application.Workbooks.Add(true); //添加内容
    excel.Visible = isShowExcle; //设置为显示Excel
    //生成字段名称
    for (int i = 0; i & lt; dgv.ColumnCount; i++) //循环遍历DataGridView控件中的每一列
    {
    excel.Cells[1, i + 1] = dgv.Columns[i].HeaderText; //向Excel中填充数据
    }
    //填充数据
    for (int i = 0; i & lt; dgv.RowCount - 1; i++) //循环遍历DataGridView控件中的每一行
    {
    for (int j = 0; j & lt; dgv.ColumnCount; j++)//循环遍历DataGridView控件中的每一列
    {
    if (dgv[j, i].ValueType == typeof(string)) //当当前数据类型为字符串时
    {
    excel.Cells[i + 2, j + 1] = " '" + dgv[j, i].Value.ToString(); //向Excel中填充数据
    }
    else //当数据类型为其它类型时
    {
    excel.Cells[i + 2, j + 1] = dgv[j, i].Value.ToString(); //在Excel中直接显示内容
    }
    }
    }
    return true; //返回真
    }

  • 来源:明日科技
  • 多曲线数据分析

    实例说明

    在人事管理系统中经常会用到统计功能,如统计员工、工资、性别比例等。本实例使用多曲线对员工进行统计,分析公司内正式员工和试用员工的流动情况。
    实例运行效果如图1所示。
    图1 多曲线数据分析

    关键技术

    本实例实现时,首先需要通过SQL语句从数据库中检索出相关数据,然后将这些数据信息以适当的比例绘制成多曲线图,实现过程中主要使用Graphics类的DrawLines方法来绘制多曲线。

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为MultiCurve。
    (2)更改默认窗体Form1的Name属性为Frm_Main,在该窗体中添加一个ComboBox控件,用来显示年度列表;添加一个Panel控件,用来显示绘制的多曲线图;添加一个Button控件,用来从数据库中查询信息,并根据查询的信息绘制多曲线图。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    private void CreateImage(int ID)
    {
    int height = 440, width = 600; //设置画布宽和高
    System.Drawing.Bitmap image = new System.Drawing.Bitmap(width, height); //创建画布
    Graphics g = Graphics.FromImage(image); //创建Graphics对象
    try
    {
    g.Clear(Color.White); //清空图片背景色
    Font font = new System.Drawing.Font(" Arial & quot;, 9, FontStyle.Regular);//设置字体
    Font font1 = new System.Drawing.Font(" 宋体 & quot;, 12, FontStyle.Regular);//设置字体
    Font font2 = new System.Drawing.Font(" Arial & quot;, 8, FontStyle.Regular);//设置字体
    System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Blue, Color.Blue, 1.2f, true); //创建LinearGradientBrush对象
    g.FillRectangle(Brushes.AliceBlue, 0, 0, width, height); //绘制矩形框
    Brush brush1 = new SolidBrush(Color.Blue); //创建笔刷
    Brush brush2 = new SolidBrush(Color.SaddleBrown); //创建笔刷
    string str = " SELECT* FROM tb_curve WHERE Years = " +ID + " " ;//声明SQL语句
    //建立数据库连接
    SqlConnection Con = new SqlConnection(" server = mrwxk\\\wangxiaoke; pwd =; uid = sa; database = db_TomeOne & quot;);
    Con.Open(); //打开数据库连接
    SqlCommand Com = new SqlCommand(str, Con);//创建SqlCommand对象
    SqlDataReader dr = Com.ExecuteReader(); //创建SqlDataReader对象
    dr.Read();//开始读取记录
    if (dr.HasRows) //如果有记录
    {
    //绘制标题
    g.DrawString(" " +ID + " 年公司内部人员统计表 & quot;, font1, brush1, new PointF(160, 30));
    }
    dr.Close();//关闭SqlDataReader对象
    //画图片的边框线
    g.DrawRectangle(new Pen(Color.Blue), 0, 0, image.Width - 1, image.Height - 1);
    Pen mypen = new Pen(brush, 1); //创建画笔
    Pen mypen2 = new Pen(Color.Red, 2); //创建画笔
    int x = 60;
    for (int i = 0; i & lt; 12; i++)
    {
    g.DrawLine(mypen, x, 80, x, 340); //绘制纵向线条
    x = x + 40;
    }
    Pen mypen1 = new Pen(Color.Blue, 2); //创建画笔
    g.DrawLine(mypen1, x - 480, 80, x - 480, 340);//绘制线条
    int y = 106;
    for (int i = 0; i & lt; 9; i++)
    {
    g.DrawLine(mypen, 60, y, 540, y); //绘制横向线条
    y = y + 26;
    }
    g.DrawLine(mypen1, 60, y, 540, y);
    //x轴
    String[] n = { " 一月 & quot;, " 二月 & quot;, " 三月 & quot;, " 四月 & quot;, " 五月 & quot;, " 六月 & quot;, " 七月 & quot;,
    " 八月 & quot;, " 九月 & quot;, " 十月 & quot;, " 十一月 & quot;, " 十二月 & quot;
    }; //绘制月份
    x = 35;
    for (int i = 0; i & lt; 12; i++)
    {
    g.DrawString(n[i].ToString(), font, Brushes.Red, x, 348); //设置文字内容及输出位置
    x = x + 40;
    }
    //y轴
    String[] m = { " 900人 & quot;, " 800人 & quot;, " 700人 & quot;, " 600人 & quot;, " 565人 & quot;, " 400人 & quot;, " 300人 & quot;, " 200人 & quot;,
    " 100人 & quot;
    }; //绘制人数
    y = 100;
    for (int i = 0; i < 9; i++)
    {
    g.DrawString(m[i].ToString(), font, Brushes.Red, 10, y); //设置文字内容及输出位置
    y = y + 26;
    }
    int[] Count1 = new int[12];
    int[] Count2 = new int[12];
    string[] NumChr = new string[12];
    string cmdtxt2 = " SELECT* FROM tb_curve WHERE Years=" + ID + ""; //声明SQL语句
    SqlCommand Com1 = new SqlCommand(cmdtxt2, Con); //创建SqlCommand对象
    SqlDataAdapter da = new SqlDataAdapter(); //创建SqlDataAdapter对象
    da.SelectCommand = Com1;
    DataSet ds = new DataSet();//创建DataSet对象
    da.Fill(ds);//Fill方法填充DataSet
    int j = 0;
    for (int i = 0; i < 12; i++)
    {
    NumChr[i] = ds.Tables[0].Rows[0][i + 1].ToString();
    }
    for (j = 0; j < 12; j++)
    {
    Count1[j] = Convert.ToInt32(NumChr[j].Split('|')[0].ToString()) * 26 / 100;
    }
    for (int k = 0; k < 12; k++)
    {
    Count2[k] = Convert.ToInt32(NumChr[k].Split('|')[1].ToString()) * 26 / 100;
    }
    //显示折线效果
    SolidBrush mybrush = new SolidBrush(Color.Red);//创建SolidBrush对象
    Point[] points1 = new Point[12];
    points1[0].X = 60; points1[0].Y = 340 - Count1[0];
    points1[1].X = 100; points1[1].Y = 340 - Count1[1];
    points1[2].X = 140; points1[2].Y = 340 - Count1[2];
    points1[3].X = 180; points1[3].Y = 340 - Count1[3];
    points1[4].X = 220; points1[4].Y = 340 - Count1[4];
    points1[5].X = 260; points1[5].Y = 340 - Count1[5];
    points1[6].X = 300; points1[6].Y = 340 - Count1[6];
    points1[7].X = 340; points1[7].Y = 340 - Count1[7];
    points1[8].X = 380; points1[8].Y = 340 - Count1[8];
    points1[9].X = 420; points1[9].Y = 340 - Count1[9];
    points1[10].X = 460; points1[10].Y = 340 - Count1[10];
    points1[11].X = 565; points1[11].Y = 340 - Count1[11];
    g.DrawLines(mypen2, points1);//绘制折线
    Pen mypen3 = new Pen(Color.Black, 2); //创建画笔
    Point[] points2 = new Point[12];
    points2[0].X = 60; points2[0].Y = 340 - Count2[0];
    points2[1].X = 100; points2[1].Y = 340 - Count2[1];
    points2[2].X = 140; points2[2].Y = 340 - Count2[2];
    points2[3].X = 180; points2[3].Y = 340 - Count2[3];
    points2[4].X = 220; points2[4].Y = 340 - Count2[4];
    points2[5].X = 260; points2[5].Y = 340 - Count2[5];
    points2[6].X = 300; points2[6].Y = 340 - Count2[6];
    points2[7].X = 340; points2[7].Y = 340 - Count2[7];
    points2[8].X = 380; points2[8].Y = 340 - Count2[8];
    points2[9].X = 420; points2[9].Y = 340 - Count2[9];
    points2[10].X = 460; points2[10].Y = 340 - Count2[10];
    points2[11].X = 565; points2[11].Y = 340 - Count2[11];
    g.DrawLines(mypen3, points2);//绘制折线
    //绘制标识
    g.DrawRectangle(new Pen(Brushes.Red), 150, 370, 250, 50); //绘制范围框
    g.FillRectangle(Brushes.Red, 250, 380, 20, 10);//绘制小矩形
    g.DrawString("试用员工人数", font2, Brushes.Red, 270, 380); //绘制试用员工人数
    g.FillRectangle(Brushes.Black, 250, 400, 20, 10);//绘制小矩形
    g.DrawString("正式员工人数", font2, Brushes.Black, 270, 400); //绘制正式员工人数
    this.panel1.BackgroundImage = image; //显示绘制的图像
    }
    catch
    { }
    }

    秘笈心法

    心法领悟010:使用try…catch语句捕获异常。
    在大部分情况下,开发人员不希望异常状况发生导致程序结束,因此,可以使用try…catch程序语句块捕捉程序中的Exception对象,再使用自定义的程序逻辑处理异常状况。如果有需要,用户也可以使用多重try…catch语句块(如一个try块后跟一个或多个catch子句构成)。

  • 来源:明日科技
  • 网站人气指数曲线分析

    实例说明

    网站访问量可以决定网站的人气,那么对网站月访问量的统计分析,可以让网站管理员准确地判断网民上网的需求周期,从而调整网站的内容,更好地为广大网民服务。本实例通过对数据库中的数据进行分析,将每月份网站访问量以折线形式反映给用户。
    实例运行效果如图1所示。
    图1 网站人气指数曲线分析

    关键技术

    本实例主要使用Graphics类的DrawLines方法来绘制网站人气指数曲线图。

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为SiteVisterAnalyse。
    (2)更改默认窗体Form1的Name属性为Frm_Main,在该窗体中添加一个Panel控件,用于显示绘制的网站人气指数折线图。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    private void drowPic()
    {
    Graphics g = this.CreateGraphics(); //创建Graphics对象
    g.Clear(Color.WhiteSmoke);//设置背景色
    Pen p = new Pen(Color.Blue);//绘制画笔
    //设置用到的字体
    Font fontO = new System.Drawing.Font("Arial", 9, FontStyle.Regular);
    Font fontT = new System.Drawing.Font("华文新魏", 16, FontStyle.Regular);
    Point pointStart = new Point(0, 0); //绘制边框与显示字体
    Size sizeWindows = new Size(this.Width - 8, this.Height - 34); //创建Size对象
    Rectangle rect = new Rectangle(pointStart, sizeWindows); //创建Rectangle对象
    g.DrawRectangle(p, rect);//绘制矩形
    Brush brus = new SolidBrush(Color.Red); //创建笔刷
    g.DrawString("网站人气指数曲线分析", fontT, brus, this.Width / 2.00f - 150, 10.00f);
    //绘制网格线
    int x = this.Width / 10;
    int y = this.Height / 14;
    int z = this.Width / 10;
    int k = y * 12;
    //X
    for (int i = 0; i < 12; i++)
    {
    g.DrawLine(p, x, y * 3 - 10, x, y * 12); //绘制水平线条
    x = x + (this.Width - 34) / 14;
    }
    //X轴
    String[] n = {" 1月", " 2月", " 3月", " 4月", " 5月", " 6月", " 7月",
    " 8月", " 9月", "10月", "11月", "12月"};//绘制月份
    x = this.Width / 10 - 16;
    for (int i = 0; i < 12; i++)
    {
    g.DrawString(n[i].ToString(), fontO, Brushes.Red, x, y * 12);//设置文字内容及输出位置
    x = x + (this.Width - 34) / 14;
    }
    //Y
    for (int i = 0; i < 12; i++)
    {
    g.DrawLine(p, z, k, x + 10, k); //绘制垂直线条
    k = k - (y * 12) / 16;
    }
    //Y轴
    int h = k;
    String[] m = {"5565","5650","4565", "4000", "3565", "3000", "2565", "2000", "1565", "1000",
    " 565"}; //绘制Y轴显示的文字
    k = y * 12;
    for (int i = 0; i < 11; i++)
    {
    g.DrawString(m[10 - i].ToString(), fontO, Brushes.Red, z - 35, k - y); //开始绘制文字
    k = k - (y * 12) / 16;
    }
    int[] Count = new int[12];
    Pen mypen = new Pen(Color.Red, 2); //创建画笔
    Point[] points = new Point[12];
    x = this.Width / 10;
    k = y * 12;
    SqlConnection Con = new SqlConnection("Server=mrwxk\\\wangxiaoke;DataBase=db_TomeOne;Uid=sa;Pwd=");
    string cmdtxt2 = "SELECT * FROM tb_reticulation"; //声明SQL语句
    SqlCommand Com1 = new SqlCommand(cmdtxt2, Con); //创建SqlCommand对象
    SqlDataAdapter da = new SqlDataAdapter();//创建SqlDataAdapter对象
    da.SelectCommand = Com1;
    DataSet ds = new DataSet();//创建DataSet对象
    da.Fill(ds); //Fill方法填充DataSet对象
    int j = 0;
    for (j = 0; j < 12; j++)
    {
    //与Y轴数生成有关(y * 12)/16因为起始为565
    Count[j] = Convert.ToInt32(ds.Tables[0].Rows[0][j + 2].ToString()) * (y * 12) / 16 / 565;
    }
    //设置绘制曲线的坐标数组
    points[0].X = x; points[0].Y = k - Count[0];
    x = x + (this.Width - 34) / 14;
    points[1].X = x; points[1].Y = k - Count[1];
    x = x + (this.Width - 34) / 14;
    points[2].X = x; points[2].Y = k - Count[2];
    x = x + (this.Width - 34) / 14;
    points[3].X = x; points[3].Y = k - Count[3];
    x = x + (this.Width - 34) / 14;
    points[4].X = x; points[4].Y = k - Count[4];
    x = x + (this.Width - 34) / 14;
    points[5].X = x; points[5].Y = k - Count[5];
    x = x + (this.Width - 34) / 14;
    points[6].X = x; points[6].Y = k - Count[6];
    x = x + (this.Width - 34) / 14;
    points[7].X = x; points[7].Y = k - Count[7];
    x = x + (this.Width - 34) / 14;
    points[8].X = x; points[8].Y = k - Count[8];
    x = x + (this.Width - 34) / 14;
    points[9].X = x; points[9].Y = k - Count[9];
    x = x + (this.Width - 34) / 14;
    points[10].X = x; points[10].Y = k - Count[10];
    x = x + (this.Width - 34) / 14;
    points[11].X = x; points[11].Y = k - Count[11];
    g.DrawLines(mypen, points);//绘制折线
    }

    秘笈心法

    心法领悟011:使用DataSet对象作为数据集。
    DataSet对象是ADO.NET的核心成员,它是支持ADO.NET断开式、分布式数据方案的核心对象,也是实现基于非连接的数据查询的核心组件。DataSet对象是创建在内存中的集合对象,它可以包含任意数量的数据表以及所有表的约束、索引和关系等,它实质上相当于在内存中的一个小型关系数据库。

  • 来源:明日科技
  • 利用饼型图分析公司男女比率

    实例说明

    开发人力资源管理系统时,利用饼图分析公司男女比例是最佳的选择。本实例对某公司的男女比例使用饼型图进行分析,实例运行效果如图1所示。

    图1 利用饼型图分析公司男女比率

    关键技术

    本实例实现时主要用到了Graphics类的FillEllipse方法和FillPie方法,下面分别对它们进行详细讲解。
    (1)FillEllipse方法 该方法用于填充Rectangle结构指定的边框所定义的椭圆的内部,其语法格式如下:
    public void FillEllipse(Brush brush,Rectangle rect)
    参数说明 brush:确定填充特性的 Brush。 rect:Rectangle结构,它表示定义椭圆的边框。
    (2)FillPie方法 该方法用于填充椭圆所定义的扇形区的内部,该椭圆由Rectangle结构和两条射线指定,其语法格式如下:
    public void FillPie(Brush brush,Rectangle rect,float startAngle,float sweepAngle) FillPie方法语法中的参数及说明如表1所示。
    表1 FillPie方法语法中的参数及说明

    参数 说明
    brush 确定填充特性的Brush
    rect Rectangle结构,它表示定义该扇形区所属的椭圆的边框
    startAngle 从x轴沿顺时针方向旋转到扇形区第一个边所测得的角度(以度为单位)
    sweepAngle 从startAngle参数沿顺时针方向旋转到扇形区第二个边所测得的角度(以度为单位)

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为CAnalyseSex。
    (2)更改默认窗体Form1的Name属性为Frm_Main,在该窗体中添加两个Panel控件,分别用来显示绘制的饼型图和说明信息。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    private void ShowPic(string SexCode,float f)
    {
    Graphics g = this.panel1.CreateGraphics(); //通过panel1控件创建一个Graphics对象
    Pen p=new Pen(new SolidBrush(Color.Blue)); //创建画笔
    Point p1=new Point(0,0); //创建Point对象
    Size s=new Size(this.panel1.Width,this.panel1.Height);//创建Size对象
    Rectangle trct = new Rectangle(p1, s); //创建Rectangle对象
    g.FillEllipse(new SolidBrush(Color.Red), trct); //绘制椭圆
    g.FillPie(new SolidBrush(Color.Blue), trct, 180, f*360);//绘制扇形
    Graphics ginfo = this.panel2.CreateGraphics(); //通过panel2控件创建一个Graphics对象
    Font font=new Font("宋体",10,FontStyle.Regular);//设置字体
    //绘制性别
    ginfo.DrawString(SexCode +" "+f.ToString().Substring(0,4), font, new SolidBrush(Color.Blue), 0, 5);
    ginfo.DrawString("女" + " " + (1.0 - Convert.ToDouble(f.ToString().Substring(0, 4))).ToString().Substring(0, 4), font, new SolidBrush(Color.Red), 0, 25); //绘制比例
    }

    秘笈心法

    心法领悟012:使用Color结构获取颜色。
    Color结构表示一种ARGB颜色(alpha、红色、绿色、蓝色),现在已经命名的颜色都可以使用Color结构的属性来表示,例如,蓝色可以用Color.Blue来表示。

  • 来源:明日科技
  • 利用饼型图分析产品市场占有率

    实例说明

    开发商品销售管理系统过程中,为了清晰了解产品在市场上的占有率,使用饼图分析产品市场占有率是最佳的选择。本实例通过利用饼型图分析某电子产品市场占有率,实例运行效果如图1所示。
    图1 利用饼型图分析产品市场占有率

    关键技术

    本实例在实现时,首先通过SQL语句统计商品在市场的占有率,并将其字段名与数量存放于Hashtable哈希表中,然后遍历“哈希表”计算出每种商品所占的比例,最后通过Graphics类的FillPie方法绘制饼型图。

    设计过程

    (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,命名为CAnalyseGoodsScale。
    (2)更改默认窗体Form1的Name属性为Frm_Main,在该窗体中添加两个Panel控件,分别用来显示绘制的饼型图和说明信息。
    (3)程序主要代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    private void showPic(float f,Brush B)
    {
    Graphics g = this.panel1.CreateGraphics();//通过panel1控件创建一个Graphics对象
    if (TimeNum == 0.0f)
    {
    g.FillPie(B, 0, 0, this.panel1.Width, this.panel1.Height, 0, f * 360);//绘制扇形
    }
    else
    {
    g.FillPie(B, 0, 0, this.panel1.Width, this.panel1.Height, TimeNum, f * 360);
    }
    TimeNum += f * 360;
    }
    private void Form1_Paint(object sender, PaintEventArgs e) //在Paint事件中绘制窗体
    {
    ht.Clear();
    Conn(); //连接数据库
    Random rnd = new Random(); //生成随机数
    using (cmd = new SqlCommand("select t_Name,sum(t_Num) as Num from tb_14 group by t_Name", con))
    {
    Graphics g2 = this.panel2.CreateGraphics(); //通过panel2控件创建一个Graphics对象
    SqlDataReader dr = cmd.ExecuteReader(); //创建SqlDataReader对象
    while (dr.Read())//读取数据
    {
    ht.Add(dr[0],Convert.ToInt32(dr[1])); //将数据添加到Hashtable中
    }
    float[] flo = new float[ht.Count];
    int T = 0;
    foreach (DictionaryEntry de in ht)//遍历Hashtable
    {
    flo[T] = Convert.ToSingle((Convert.ToDouble(de.Value) / SumNum).ToString().Substring(0, 6));
    Brush Bru = new SolidBrush(Color.FromArgb(rnd.Next(255), rnd.Next(255), rnd.Next(255)));
    //绘制商品及百分比
    g2.DrawString(de.Key + " " + flo[T] * 100 + "%", new Font("Arial", 8, FontStyle.Regular), Bru, 7, 5 + T * 18);
    showPic(flo[T], Bru); //调用showPic方法绘制饼型图
    T++;
    }
    }
    }

    秘笈心法

    心法领悟013:使用Paint事件实现窗体或控件的重绘!
    当重绘窗体或控件时会引发其Paint事件,该事件将PaintEventArgs的实例传递给用来处理Paint事件的方法,从而实现窗体或控件的重绘。