用Visual C# 创建快捷方式

用Visual c# 2005创建快捷方式
来源:aspcool

大多数 Windows 用户来说都是小菜一碟了,然而,这项工作却为程序员带来不少麻烦。.net 没有提供简便直接的创建快捷方式的方法,那么在 .NET 中我们如何为应用程序创建快捷方式呢?

  1. 快捷方式文件

  快捷方式实质上是一个扩展名为 .LNK 的文件。右击一个快捷方式文件并选择属性,跳到快捷方式选项卡,如图1所示:

  <p>你可以看到一个快捷方式包含如下数据: </p>
  <p>  ·快捷方式的名字 </p>
  <p>  ·快捷方式所指向的目标所在的位置 </p>
  <p>  ·快捷方式所指向的目标的工作目录 </p>
  <p>  ·激活该快捷方式的热键 </p>
  <p>  ·快捷方式所指向的目标运行时的窗口风格(普通、最大化和最小化) </p>
  <p>  ·该快捷方式的描述性文字 </p>
  <p>  ·快捷方式的图标所在的位置 </p>
  <p>  2. 使用 WSH 创建快捷方式 </p>
  <p>  2.1 添加 WSH 的引用 </p>
  <p>  这里我使用 Visual c# 2005 Express Edition Beta 2 来开发的,添加引用的方法非常简单,右击你的项目并选择添加引用,选择 COM 选项卡并选择 Windows Script Host Object Model,如图2所示: </p>
  
  <p>2.2 创建你的快捷方式 </p>
  <p>  创建一个快捷方式的完整代码如下: </p>
  <p>// Code #01 </p>
  <p>using System; <br>
    using IWshRuntimeLibrary; </p>
  <p>class Program <br>
    { <br>
     
    static void Main(string[] args) <br>
     
    { <br>
      
    Wshshell shell = new WshShell(); <br>
      
    IWshShortcut shortcut = (IWshShortcut)shell.CreateShortcut( <br>
        
    Environment.GetFoldERPath(Environment.SpecialFolder.DesktopDirectory) + <br>
        
    &quot;\\&quot; + &quot;Allen’s Application.lnk&quot; <br>
      
    ); <br>
      
    shortcut.TargetPath = System.Reflection.Assembly.GetExecutingAssembly().Location; <br>
      
    shortcut.WorkingDirectory = System.Environment.CurrentDirectory; <br>
      
    shortcut.WindowStyle = 1; <br>
      
    shortcut.Description = &quot;Launch Allen’s Application&quot;; <br>
      
    shortcut.IconLocation = System.Environment.SystemDirectory + &quot;\\&quot; + &quot;shell32.dll, 165&quot;; <br>
      
    shortcut.Save(); <br>
     
    } <br>
    } </p>
  <p>  首先,我们创建一个 WshShell 的实例对象,接着通过该对象的 CreateShortcut 方法来创建 IWshShortcut 接口的实例对象,传递给 CreateShortcut 方法的参数是将要创建的快捷方式的完整路径(包括该快捷方式的名字)。接下来,我们就要设置 IWshShortcut 实例对象的相关属性值了。 </p>
  <p>  2.3 设置快捷方式的属性 </p>
  <p>  2.3.1 TargetPath </p>
  <p>  该属性仅用于设置或者读取快捷方式的目标所在的位置。Code #01 中,将要创建的快捷方式指向本应用程序。 </p>
  <p>  2.3.2 WorkingDirectory </p>
  <p>  该属性指定应用程序的工作目录,当用户没有指定一个具体的目录时,快捷方式的目标应用程序将使用该属性所指定的目录来装载或保存文件。 </p>
  <p>  2.3.3 WindowStyle </p>
  <p>  该属性指定快捷方式的目标应用程序的窗口为普通(原始)状态、最小化或者最大化。对比图1中 Run 下拉菜单的项,该属性的值及其意义如下: </p>
  <p>Value Meaning <br>
    1 Normal window <br>
    3 Maximized <br>
    7 Minimized </p>
  <p>  2.3.4 Description </p>
  <p>  该属性设置用于设置或者读取快捷方式的附加说明。 </p>
  <p>  2.3.5 IconLocation </p>
  <p>  该属性用于指定快捷方式的图表的所在位置,它的值包含一个完整的路径和一个索引值。Code #01 中,快捷方式的图标被设定为系统文件夹中的 Shell32.dll 文件所包含的第165个图标。 </p>
  <p>  2.4 生成快捷方式 </p>
  <p>  CreateShortcut 仅仅创建一个 IWshShortcut 的实例对象,它不会为你生成任何快捷方式,当一切就绪后,你必须调用 IWshShortcut.Save 方法才能生成快捷方式文件。 </p>
  <p>  3. 活用快捷方式简化操作 </p>
  <p>  想象一下你的应用程序支持命令行参数组合运行,例如: </p>
  <p>App /out:output.txt /sortby:date /desc </p>
  <p>  而你又希望只需要轻轻按下 CTRL+ALT+F11 就可以直接启动这项功能,这时你就需要用到 IWshShortcut 的 Arguments 和 Hotkey 两个属性了: </p>
  <p>// Code #02 </p>
  <p>shortcut.Arguments = &quot;/out:output.txt /sortby:date /desc&quot;; <br>
    shortcut.Hotkey = &quot;CTRL+ALT+F11&quot;; </p>
  <p>  注意:Hotkey 属性的值里面不能包含空格。 </p>
  <p>  你可以在应用程序里面像平常那样处理命令行参数: </p>
  <p>// Code #03 </p>
  <p>class Program <br>
    { <br>
     
    static void Main(string[] args) <br>
     
    { <br>
      
    foreach (string arg in args) <br>
      
    { <br>
       
    Console.WriteLine(arg); <br>
      
    } <br>
     
    } <br>
    } </p>
  <p>// Output: <br>
    // <br>
    // /out:output.txt <br>
    // /sortby:date <br>
    // /desc </p>
<p>  现在,你把这个快捷方式放到桌面,每当你需要运行的时候,轻轻的按下 CTRL+ALT+F11 就行了,Cool ~ ~ </p></td>

用C#实现在Word文档中搜索文本

c#实现在Word文档中搜索文本
来源:aspcool

在word应用程序中搜索和替换文本是举手之劳的事情,通过word的对象模型,我们也可以使用编程方式来实现。

   Word的对象模型有比较详细的帮助文档,放在 Office 安装程序目录,office 2003是在Program Files\Microsoft Office\OFFICE11\2052下,文档本身是为VBA提供的,在这个目录下还可以看到所有的office应用程序的VBA帮助。

   打开VBAWD10.CHM,看到word的对象模型,根据以往的使用经验,很容易在Document对象下找到Content属性,该属性会返回一个文档文字部分的Range对象,从这个对象中不难取到所有的文档内容,再用string的IndexOf()方法很容易达到目标。

object filename=""; //要打开的文档路径
string strKey=""; //要搜索的文本
object MissingValue=Type.Missing;

Word.Application wp=new Word.ApplicationClass();
Word.Document wd=wp.Documents.Open(ref filename,ref MissingValue,
ref MissingValue,ref MissingValue,
ref MissingValue,ref MissingValue,
ref MissingValue,ref MissingValue,
ref MissingValue,ref MissingValue,
ref MissingValue,ref MissingValue,
ref MissingValue,ref MissingValue,
ref MissingValue,ref MissingValue);

if (wd.Content.Text.IndexOf(strKey)>=0)
{
MessageBox.Show("文档中包含指定的关键字!","搜索结果",MessageBoxButtons.OK);
}
else
{
MessageBox.Show("文档中没有指定的关键字!","搜索结果",MessageBoxButtons.OK);
}

   不过,这种做法是很勉强的,对小文档来说,不存在问题,对超长超大的文档来说,这样的实现方法已经暗埋bug了,而且是程序级的bug,因为正常的测试会很难发现问题,在使用中导致程序出现什么样的结果也很难量化描述。

   其实,在word中已经提供了可以用作搜索的对象Find,在对象模型上也比较容易找到,对应的说明是这样的:该对象代表查找操作的执行条件。Find 对象的属性和方法与“替换”对话框中的选项一致。从模型上看,Find对象是Selection的成员,从示例代码来看似乎也是Range的成员,查找Range的属性,果然如此。于是修改上面的代码:

  <p>wd.Content.Find.Text=strKey; <br>
    if (wd.Content.Find.Execute(ref MissingValue,ref MissingValue, <br>
    ref MissingValue,ref MissingValue, <br>
    ref MissingValue,ref MissingValue, <br>
    ref MissingValue,ref MissingValue, <br>
    ref MissingValue,ref MissingValue, <br>
    ref MissingValue,ref MissingValue, <br>
    ref MissingValue,ref MissingValue, <br>
    ref MissingValue)) <br>
    { <br>
    MessageBox.Show(&quot;文档中包含指定的关键字!&quot;,&quot;搜索结果&quot;,MessageBoxButtons.OK); <br>
    } <br>
    else <br>
    { <br>
    MessageBox.Show(&quot;文档中没有指定的关键字!&quot;,&quot;搜索结果&quot;,MessageBoxButtons.OK); <br>
    } </p>
  
  <p>   这样似乎也不是最好,因为我只要判断指定的文本是不是在文档中,而不需要知道它出现了几次,如果有多个要搜索的文本,难道每次都进行全文档搜索?假设我要搜索的文本包含在文档中,最好的情况是在文档开头就包含我要查找的文本,最坏的情况是在文档的最后包含要查找的文本,如果每次取一部分文档进行判断,符合条件就结束本次搜索,就可以避免每次搜索整个文档了。模型中的Paragraphs对象现在派上用场了,再修改一下代码: 
  <p>int i=0,iCount=0; <br>
    Word.Find wfnd; </p>
  <p>if (wd.Paragraphs!=null &amp;&amp; wd.Paragraphs.Count&gt;0) <br>
    { <br>
    iCount=wd.Paragraphs.Count; <br>
    for(i=1;i&lt;=iCount;i++) <br>
    { <br>
    wfnd=wd.Paragraphs[i].Range.Find; <br>
    wfnd.ClearFormatting(); <br>
    wfnd.Text=strKey; <br>
    if (wfnd.Execute(ref MissingValue,ref MissingValue, <br>
    ref MissingValue,ref MissingValue, <br>
    ref MissingValue,ref MissingValue, <br>
    ref MissingValue,ref MissingValue, <br>
    ref MissingValue,ref MissingValue, <br>
    ref MissingValue,ref MissingValue, <br>
    ref MissingValue,ref MissingValue, <br>
    ref MissingValue)) <br>
    { <br>
    MessageBox.Show(&quot;文档中包含指定的关键字!&quot;,&quot;搜索结果&quot;,MessageBoxButtons.OK); <br>
    break; <br>
    } <br>
    } <br>
} </p></td>

用C#实现HTTP协议下的多线程文件传输

c#实现HTTP协议下的多线程文件传输
来源:vcKBASE
很多人都有过使用网络蚂蚁或网络快车软件下载互联网文件的经历,这些软件的使用可以大大加速互联网上文件的传输速度,减少文件传输的时间。这些软件为什么有如此大的魔力呢?其主要原因是这些软件都采用了多线程下载和断点续传技术。如果我们自己来编写一个类似这样的程序,也能够快速的在互联网上下载文件,那一定是非常愉快的事情。下面我就讲一讲如何利用c#语言编写一个支持多线程下载文件的程序,你会看到利用C#语言编写网络应程序是多么的容易,从中也能体会到C#语言中强大的网络功能。

  首先介绍一下HTTP协议,HTTP亦即Hpyer Text Transfer Protocal的缩写,它是现代互联网上最重要的一种网络协议,超文本传输协议位于TCP/IP协议的应用层,是一个面向无连接、简单、快速的C/S结构的协议。HTTP的工作过程大体上分连接、请求、响应和断开连接四个步骤。C#语言对HTTP协议提供了良好的支持,在.NET类库中提供了WebRequest和WebResponse类,这两个类都包含在System.Net命名空间中,利用这两个类可以实现很多高级的网络功能,本文中多线程文件下载就是利用这两个类实现的。 WebRequest和WebResponse都是抽象基类,因此在程序中不能直接作为对象使用,必须被继承,实际使用中,可根据URI参数中的URI前缀选用它们合适的子类,对于HTTP这类URI,HttpWebRequest和HttpWebResponse类可以用于处理客户程序同WEB服务器之间的HTTP通讯。

  HttpWebRequest类实现了很多通过HTTP访问WEB服务器上文件的高级功能。HttpWebRequest类对WebRequest中定义的属性和方法提供支持,HttpWebRequest将发送到Internet资源的公共HTTP标头的值公开为属性,由方法或系统设置,常用的由属性或方法设置的HTTP标头为:接受, 由Accept属性设置, 连接, 由Connection属性和KeepAlive属性设置, Content-Length, 由ContentLength属性设置, Content-Type, 由ContentType属性设置, 范围, 由AddRange方法设置. 实际使用中是将标头信息正确设置后,传递到WEB服务器,WEB服务器根据要求作出回应。

  HttpWebResponse类继承自WebResponse类,专门处理从WEB服务器返回的HTTP响应,这个类实现了很多方法,具有很多属性,可以全面处理接收到的互联网信息。在HttpWebResponse类中,对于大多数通用的HTTP标头字段,都有独立的属性与其对应,程序员可以通过这些属性方便的访问位于HTTP接收报文标头字段中的信息,本例中用到的HttpWebResponse类属性为:ContentLength 既接收内容的长度。

  有了以上的了解后,下面看看这两个类的用法,要创建HttpWebRequest对象,不要直接使用HttpWebRequest的构造函数,而要使用WebRequest.Create方法初始化一个HttpWebRequest实例,如:

HttpWebRequest hwr=(HttpWebRequest)WebRequest.Create(http://www.163.com/);
  创建了这个对象后,就可以通过HttpWebRequest属性,设置很多HTTP标头字段的内容,如hwr.AddRange(100,1000);设置接收对象的范围为100-1000字节。

  HttpWebReques对象使用GetResponse()方法时,会返回一个HttpWebResponse对象,为提出HTTP返回报文信息,需要使用HttpWebResponse的GetResponseStream()方法,该方法返回一个Stream对象,可以读取HTTP返回的报文,如:首先定义一个Strean 对象 public System.IO.Stream ns; 然后 ns=hwr.GetResponse ().GetResponseStream ();即可创建Stream对象。有了以上的准备知识后下面开始设计我们的多线程互联网文件的下载程序,首先打开Visual Studio.Net集成开发环境,选择“文件”、“新建”、“项目”,然后选择“Visual C#项目”,在向导右边列表框中选中“Windows应用程序”,输入项目名称,如本例为:httpftp,然后选择“确定”按钮,向导自动生成了一个Windows应用程序项目。首先打开窗口设计器设计应用程序窗口,增加如下控件:

  一个列表框 listBox1 三个文本标签 label1-label3 三个文本框 textBox1-textBox3 一个开始接收按钮 button1 设计好的窗口如下图:


  控件定义代码是:

public System.Windows.Forms.ListBox listBox1;
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox textBox1
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.Label label3;
private System.Windows.Forms.TextBox textBox3;
private System.Windows.Forms.Label label4;
private System.Windows.Forms.TextBox textBox4;
  打开Form1的代码编辑器,增加如下的命名空间:

using System.Net;//网络功能
using System.IO;//流支持
using System.Threading ;//线程支持
  增加如下的程序变量:

public bool[] threadw; //每个线程结束标志
public string[] filenamew;//每个线程接收文件的文件名
public int[] filestartw;//每个线程接收文件的起始位置
public int[] filesizew;//每个线程接收文件的大小
public string strurl;//接受文件的URL
public bool hb;//文件合并标志
public int thread;//进程数

用C#创建PDA应用程序的柱形图控件(一)

c#创建PDA应用程序的柱形图控件(一)

提供智能设备(如PDA)应用程序的柱形图,开发智能设备应用程序时VS.net并不象Window应用程序那样提供用户自定义控件。在本文中,您将创建一个以柱形图显示的 PDAChartControl自定义控件。还将创建一个使用此 PDAChartControl自定义控件的智能设备应用程序。为了完成开发工作,您将执行这些过程:

  · 创建该 PDAChartControl 自定义控件的运行时版本。

  · 编译该 PDAChartControl 自定义控件的设计时版本。

  · 将该控件添加到工具箱中。

  · 创建一个使用该 PDAChartControl 自定义控件的智能设备应用程序。

  · 在智能设备应用程序中测试该控件。

  本文的重点不在于编写控件的代码,而在于如何创建设计时自定义控件以及如何将它添加到"工具箱"中。

   生成自定义控件

  第一步是使用智能设备类库模板创建新项目并生成控件。

   创建自定义控件

  1. 在"文件"菜单上指向"新建",然后单击"项目"。

  2. 在"新建项目"对话框中的"项目类型"下,单击"Visual c# 项目",并在"模板"下单击"智能设备应用程序"。

  3. 在"名称"框中,键入"PDAChartControlControl",然后单击"确定"。

  4. 在"智能设备应用程序向导"中,单击上窗格中的"Pocket PC"和下窗格中的"类库",然后单击"确定"。

  创建了一个新项目,Class1.cs 在代码编辑器中打开。

  由于已经创建用于该控件的项目,接下来可以向项目中添加引用、更改代码以及编译 PDAChartControl 自定义控件的运行时版本。
编译自定义控件的运行时版本

  1. 在解决方案资源管理器中,右击 Class1.cs 并单击"重命名"。

  2. 重命名文件 PDAChartControlControl.cs。

  注意 如果没有打开解决方案资源管理器,请单击"视图"菜单上的"解决方案资源管理器"。

  用下列代码替换 PDAChartControlControl.cs 中的代码:

//*****************************************************************************
// PDAChartControlControl
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
#if NETCFDESIGNTIME
[assembly: System.CF.Design.RuntimeAssemblyAttribute("PDAChartControl, Version=1.10.0.0, _
Culture=neutral, PublicKeyToken=null")]
namespace PDAChartControl
{
///
/// Summary description for UserControl1.
///
public class PDAChart : System.Windows.Forms.Control
{
public System.Windows.Forms.HScrollBar hScrollBar1;

///
/// Required designer variable.
///

// Delegate declaration.
// public delegate void EventHandler(string text,Color BackColor,int Height);
//
// //声明事件的委托:
// //public delegate void MyEventHandler(string text,Color BackColor,int Height);
// //定义一个公共事件成员
// public event EventHandler AddCube;
// protected virtual void OnAddCube(EventArgs e)
// {
//
// }
//
private PDAChartControl.MyGraph objGraph=new MyGraph();
private Point mBeginPoint=new Point(0,0) ;

private System.ComponentModel.Container components = null;

public PDAChart()
{
InitializeComponent();
}

public enum ChartTypeEnum { PillarChart, CakeChart ,BreakLinkChart};

#region Windows 属性定义
private bool mhScrollBarVisible=true;
#if NETCFDESIGNTIME
[System.ComponentModel.Category("PDAChart")]
[System.ComponentModel.DefaultValueAttribute(0)]
[System.ComponentModel.Description("设置/读取滚动条是否可见")]
#endif
public bool hScrollBarVisible
{
get
{
return mhScrollBarVisible;
}
set
{
mhScrollBarVisible =value;
this.Invalidate();
}
}
private ChartTypeEnum mChartType=ChartTypeEnum.PillarChart;
#if NETCFDESIGNTIME
[System.ComponentModel.Category("PDAChart")]
[System.ComponentModel.DefaultValueAttribute(0)]
[System.ComponentModel.Description("设置/读取图形类型")]
#endif
public ChartTypeEnum ChartType
{
get
{
return mChartType;
} 
set
{
mChartType =value;
this.Invalidate();
}
}

private int mPicHeight=20;
#if NETCFDESIGNTIME
[System.ComponentModel.Category("PDAChart")]
[System.ComponentModel.DefaultValueAttribute(0)]
[System.ComponentModel.Description("设置/读取饼图高")]
#endif
public int PicHeight
{
get
{
return mPicHeight;
}
set
{
mPicHeight =value;
this.Invalidate();
}
}

private Font mTitleFont =new Font("Arial", 9, FontStyle.Regular);

#if NETCFDESIGNTIME
[System.ComponentModel.Category("PDAChart")]
[System.ComponentModel.Description("设置/读取文本字体")]
#endif
public Font TitleFont
{
get
{
return mTitleFont;
}
set
{
mTitleFont=value;
this.Invalidate();
}
}

private Font mTextFont =new Font("Arial", 8, FontStyle.Regular);
#if NETCFDESIGNTIME
[System.ComponentModel.Category("PDAChart")]
[System.ComponentModel.Description("设置/读取文本字体")]
#endif
public Font TextFont
{
get
{
return mTextFont;
}
set
{
mTextFont=value;
this.Invalidate();
}
}
private static DataTable mDataTable=new DataTable() ;
#if NETCFDESIGNTIME
[System.ComponentModel.Category("PDAChart")]
[System.ComponentModel.Description("设置/读取数据表")]
#endif
public DataTable dataTable
{
get
{
return mDataTable;
}
set
{
mDataTable=(DataTable)value;
this.Invalidate();
}
}
private string mShowColumnName;
#if NETCFDESIGNTIME
[System.ComponentModel.Category("PDAChart")]
[System.ComponentModel.Description("设置/读取显示列")]
#endif
public string ShowColumnName
{
get
{
return mShowColumnName;

  }

用C#创建PDA应用程序的柱形图控件(五)

c#创建PDA应用程序的柱形图控件(五)

double a1=double.Parse(System.Convert.ToString(this.LineCount-1));
double a2=double.Parse(this.mMaxYValue.ToString());
double a=System.Math.Round(a2/a1,1);

for(int i=0;i {
string Text=System.Convert.ToString(a*(i+1));
int txtWidth=(int)objGraph.mGraphics.MeasureString(Text,this.mTextFont).Width;
p1.X=p.X-txtWidth-this.mLenght;;
p1.Y-=this.BetweenLineHeight;
this.objGraph.DrawText(Text,Color.Black,this.mTextFont,p1.X,p1.Y);
}
}
}
//求数据列的和
private double SumColumn(DataTable dt,string ColumnName)
{
double Sum=0.0;
foreach(DataRow dr in dt.Rows)
{
Sum+=System.Convert.ToDouble(dr[ColumnName]);
}
return Sum;
}
}

#region
public class MyGraph
{
//网络水平线中二线之间的高
//int BetweenLineHeight=20;
//最大MaxYCount:线数
// int MaximumY=10;
// int Lenght=5;
// int Width=200;
// int Height=300;
// bool IsShowGrid=true;

public Graphics mGraphics;

//背景色
// public Color BackColor= System.Drawing.SystemColors.Control;
// //X轴颜色
// public Color AxesXColor=System.Drawing.SystemColors.HighlightText;
// //Y轴颜色
// public Color AxesYColor=System.Drawing.SystemColors.Info;

//黑色笔
private Pen mBlackPen = new System.Drawing.Pen(Color.FromArgb(0,0,0));
//网格线笔
private Pen mGridPen= new System.Drawing.Pen(Color.FromArgb(127, 127, 127));
//Color BackColor= System.Drawing.Color.FromArgb(((System.Byte)(224)), ((System.Byte)(224)), ((System.Byte)(224)));

public MyGraph()
{
//mGraphics=this.CreateGraphics(); //
// TODO: 在此处添加构造函数逻辑
//
}

//由左下顶点与宽、高画颜色为color的平行四边形
public void DrawRectangle3DTop(Color color, Point LeftUnderPoint,int Width,int Height)
{
try
{

//计算左上顶点
Point p1=new Point ();
p1.X=LeftUnderPoint.X+Height;
p1.Y=LeftUnderPoint.Y-Height;

//计算右上顶点
Point p2=new Point ();
p2.X=LeftUnderPoint.X+Width+Height;
p2.Y=LeftUnderPoint.Y-Height;

//计算右下顶点
Point p3=new Point ();
p3.X=LeftUnderPoint.X+Width;
p3.Y=LeftUnderPoint.Y;
Point[] curvePoints =
{
LeftUnderPoint,
p1,
p2,
p3
};

// Define fill mode.
//FillMode newFillMode = FillMode.Winding;
// Fill polygon to screen.
// Create solid brush.
SolidBrush Brush = new SolidBrush(color);
mGraphics.FillPolygon(Brush, curvePoints);
//mGraphics.FillPolygon(Brush, curvePoints, newFillMode);
//画边框
mGraphics.DrawPolygon(this.mBlackPen, curvePoints);
}
catch(Exception ex)
{
string str=ex.Message;
}

}
//由左下顶点与宽、高画颜色为color的平等四边形
public void DrawRectangle3DRight(Color color, Point LeftUnderPoint,int Width,int Height)
{
try
{
// Create solid brush.
SolidBrush Brush = new SolidBrush(color);

//计算左上顶点
Point p1=new Point ();
p1.X=LeftUnderPoint.X;
p1.Y=LeftUnderPoint.Y-Height;

//计算右上顶点
Point p2=new Point ();
p2.X=p1.X+Width;
p2.Y=p1.Y-Width;

//计算右下顶点
Point p3=new Point ();
p3.X=LeftUnderPoint.X+Width;
p3.Y=LeftUnderPoint.Y-Width;
Point[] curvePoints =
{
LeftUnderPoint,
p1,
p2,
p3
};

// Define fill mode.
//FillMode newFillMode = FillMode.Winding;
// Fill polygon to screen.
mGraphics.FillPolygon(Brush, curvePoints);
//画边框
mGraphics.DrawPolygon(this.mBlackPen, curvePoints);
//mGraphics.FillPolygon(Brush, curvePoints, newFillMode);
}
catch(Exception ex)
{
string str=ex.Message;
}
}

//由左上角顶点与宽、高画颜色为color的平行四边形
public void DrawRectangle(Color color, Point P,int Width,int Height)
{
Rectangle Rectangle1=new Rectangle( P.X,P.Y, Width,Height);

// Create solid brush.
SolidBrush Brush = new SolidBrush(color);
// Fill polygon to screen.
mGraphics.FillRectangle(Brush, Rectangle1);

//画边框
mGraphics.DrawRectangle(this.mBlackPen,Rectangle1);

}

//由左下顶点与长、宽、高画颜色为color的立方图形(3D)
public void DrawCube(Color color, Point LeftUnderPoint,int Lenght,int Width,int Height)
{
// Create solid brush.
SolidBrush Brush = new SolidBrush(color);

  <p>Point LeftTopPoint= LeftUnderPoint; <br>
    LeftTopPoint.Y-= Height; </p>
  <p>DrawRectangle3DTop(color,LeftTopPoint,Width,Lenght); <br>
    DrawRectangle(color,LeftTopPoint,Width,Height); </p>
  <p>Point RightP=LeftUnderPoint; <br>
    RightP.X+=Width; <br>
    DrawRectangle3DRight(Color.Black,RightP,Lenght,Height); <br>
    } </p>
  <p>//画X轴 <br>
    public void DrawAxesX(Color color, Point  p,int Width,int Height) <br>
    { <br>
    DrawRectangle3DTop(color,p,Width,Height); <br>
    } </p>
  <p>//画Y轴 <br>
    public void DrawAxesY(Color color, Point  p,int Width,int Height) <br>
    { <br>
    DrawRectangle3DRight(color,p,Width,Height); <br>
    } </p>
  <p>//由顶点与长、宽、高画颜色为color,背景色为的BackColor图表(3D) <br>
    public void DrawPDAChart(Color  GridLineColor,Color AxesXColor,Color AxesYColor,_ <br>
    Color  BackColor,Point p,int Lenght,int Width,int Height,bool IsShowAxesX,bool  IsShowAxesY) <br>
    { <br>
    if(IsShowAxesX) <br>
    { <br>
    //画X轴 <br>
    DrawAxesX(AxesXColor,p,Width,Lenght); <br>
    } <br>
    if(IsShowAxesY) <br>
    { <br>
    //画Y轴 <br>
    DrawAxesY(AxesYColor,p,Lenght,Height); <br>
    } </p>
  <p>////画图形区 <br>
    Point pRectangle=p; <br>
    pRectangle.X+=Lenght; <br>
    pRectangle.Y-=Lenght; <br>
    pRectangle.Y-=Height; <br>
    DrawRectangle(BackColor,pRectangle,Width,Height); <br>
    } <br>
    //画一条水平网络线与对应的折线 <br>
    public void DrawGridLine(Color  GridLineColor,Point p,int Width,int Lenght) <br>
    { <br>
    //Draw the Y scale; <br>
    Point EndP=p; <br>
    EndP.X+=Width; <br>
    Pen pen=new Pen( GridLineColor); <br>
    //this.mGraphics.DrawLine(pen,p,EndP); <br>
    //水平线 <br>
    this.mGraphics.DrawLine(pen,p.X,p.Y,EndP.X,EndP.Y  ); <br>
    //左折线 <br>
    this.mGraphics.DrawLine(pen,p.X,p.Y,EndP.X-Lenght,EndP.Y+Lenght  ); <br>
    } <br>
    //画所有水平网络线 <br>
    //p:起始点;Width:线宽;BetweenHeight:二线之间高,Count:线数 <br>
    public void DrawGridLines(Color  GridLineColor,Point p,int Width,int Lenght,int BetweenHeight,int Count) <br>
    { <br>
    Pen pen=new Pen( GridLineColor); <br>
    for(int i=0;i { <br>
    //DrawGridLine(GridLineColor,p,Width,Lenght); <br>
    //水平线 <br>
    this.mGraphics.DrawLine(pen,p.X,p.Y,p.X+Width,p.Y  ); <br>
    //左折线 <br>
    this.mGraphics.DrawLine(pen,p.X-Lenght+1,p.Y+Lenght,p.X,p.Y); <br>
    p.Y-=BetweenHeight; <br>
    } <br>
    } </p>
  <p>//在位置(x,y)处以颜色color、字体font写文本text <br>
    public void DrawText(string text,Color  color, Font font,int x,int y) <br>
    { <br>
    // Create solid brush. <br>
    SolidBrush Brush = new SolidBrush(color); <br>
    this.mGraphics.DrawString(text, font,  Brush, x ,y); <br>
    } </p>
  <p>//由点p(矩形左上角点),宽pieWidth,高pieHeight,颜色color画馅饼图 <br>
    public void DrawCake(Color color,Point  p,int pieWidth,int pieLenght,int pieHeight) <br>
    { <br>
    Pen PenBlack=new Pen( Color.Black); <br>
    //黑色最下面的椭圓 <br>
    Rectangle rc1 =new  Rectangle(p.X,p.Y+pieHeight,pieWidth,pieLenght); <br>
this.mGraphics.DrawEllipse(PenBlack,rc1); </p></td>