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

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

Color.Cyan,Color.Coral,Color.SlateGray,Color.Pink,Color.Crimson,Color.DodgerBlue,Color.Chartreuse };

//计算页
private void InitPage()
{
if(this.OnePageCubeCount==0) return;
if (mDataTable.Rows.Count   this.OnePageCubeCount=mDataTable.Rows.Count ;
if(this.OnePageCubeCount==0) return;
PageCount=mDataTable.Rows.Count/this.OnePageCubeCount;
//水平轴的相对值
XScale=Width/this.OnePageCubeCount ;
//Y轴的相对值
if(this.mMaxYValue <=0) return;
{
if(this.mMaxYValue==0) return;
this.YScale=double.Parse(this.YHeight.ToString())/double.Parse( this.mMaxYValue.ToString() ) ;//System.Math.
//this.YScale=double.Parse(this.YScale.ToString())/double.Parse(this.LineCount.ToString() );
}
// this.YScale=double.Parse(System.Convert.ToString(1))/double.Parse( this.mMaxYValue.ToString() ) ;//System.Math.
}

private void hScrollBar1_ValueChanged(object sender, System.EventArgs e)
{
//OnPaint(object sender, System.Windows.Forms.PaintEventArgs e)
//清画出的图
this.CurrentPage=hScrollBar1.Value;
// if (mGraphics.Clip==null)
// {
mGraphics=this.CreateGraphics ();
this.objGraph.mGraphics=mGraphics;
// }
//mGraphics.Clip=this.Region1;
//画矩形与写文本,最多一屏
//mGraphics.Clear(this.mBackColor) ;
//mGraphics.ResetClip();
//CreatePageCubes(mBeginPoint,Width,ClientHeight);
System.Windows.Forms.PaintEventArgs e1=new PaintEventArgs( mGraphics,this.rcClient);
OnPaint(null,e1);
}
public void NextPage()
{
this.objGraph.mGraphics=this.CreateGraphics ();
this.CurrentPage++;
Bitmap bm = new Bitmap(10,10);
Graphics g = Graphics.FromImage(bm);

 if (this.CurrentPage> this.PageCount)
this.CurrentPage--;
//画矩形与写文本,最多一屏
//mGraphics.Clear(Color.Red) ;
//mGraphics.ResetClip();
CreatePageCubes(mBeginPoint,Width,ClientHeight);
}

//在左下顶点,宽Width,高Height建立立方体
private void CreatePageCubes(Point BeginP ,int Width,int Height)
{
if(mDataTable.Rows.Count==0) return;
int Between=10;
switch(this.OnePageCubeCount)
{
case 1:
Between= mWidth/2;
break;
case 2:
Between= mWidth/3;
break;
case 3:
Between= mWidth/4;
break;
case 4:
Between= mWidth/5;
break;
case 5:
Between= mWidth/6;
break;
case 6:
Between= mWidth/7;
break;
case 7:
Between= mWidth/8-1;
break;
case 8:
Between= mWidth/9-2;
break;
case 9:
Between=mWidth/9-5;
break;
case 10:
Between=mWidth/10-5;
break;
}
int RowIndex=this.OnePageCubeCount*this.CurrentPage;
Point p=BeginP;//dr.
p.X-=8;
for ( int i=0;i {
//p.X= this.XScale*(i+1)+10;
p.X+=Between+this.mLenght;
double CubeHeight=this.YScale*System.Convert.ToInt32(mDataTable.Rows[RowIndex][this.mDataColumnName]);
//if ((p.X > = 0) && (p.X <= Width) && (p.Y > = 0) && (p.Y <= Height))
//{
string text=mDataTable.Rows[RowIndex][this.mShowColumnName].ToString() ;
string Data=mDataTable.Rows[RowIndex][this.mDataColumnName].ToString() ;
int ColorIndex=RowIndex;
if (ColorIndex> =color.Length)
ColorIndex=color.Length-1;
if (this.mShowXText==false) text=" ";
AddOneCube(text,p,color[i],this.mLenght,this.mLenght+4,System.Convert.ToInt32(CubeHeight));
//}
RowIndex++;
}
}

//在左下顶点,宽Width,高Height建立立方体
private void CreateCubes(Point BeginP ,int Width,int Height)
{
if(mDataTable.Rows.Count==0) return;
//水平轴的相对值
int XScale=Width/mDataTable.Rows.Count ;
//Y轴的相对值
if(this.mMaxYValue <=0) return;
int YScale=Height/(this.mMaxYValue*this.LineCount) ;

int RowIndex=0;
Color[] color={Color.Red,Color.Blue,Color.Green,Color.Yellow,Color.YellowGreen,Color.Magenta,_
Color.Cyan,Color.Coral,Color.SlateGray,Color.Pink,Color.Crimson,Color.DodgerBlue,Color.Chartreuse };

foreach(DataRow dr in mDataTable.Rows)
{
RowIndex+=1;
Point p=BeginP;//dr.
p.X= XScale*RowIndex+10;
int CubeHeight=YScale*System.Convert.ToInt32(dr[this.mDataColumnName]);
if ((p.X > = 0) && (p.X <= Width) && (p.Y > = 0) && (p.Y <= Height))
{
string text=dr[this.mShowColumnName].ToString() ;
string Data=dr[this.mDataColumnName].ToString() ;
int ColorIndex=RowIndex;
if (ColorIndex> =color.Length)
ColorIndex=color.Length-1;
if (this.mShowXText==false) text=" ";
AddOneCube(text,p,color[ColorIndex-1],this.mLenght,this.mLenght+5,CubeHeight);
//objGraph.DrawCube (color,p,this.mLenght,Width,Height);
}
}
}
//计算最大的x、y轴坐标,左边文本宽,最小的线高
private void CountMaxScaleXScaleY()
{
if(mDataTable.Rows.Count==0) return;

this.mMaxXValue=mDataTable.Rows.Count ;
this.mMaxYValue=0;
//this.l.
foreach(DataRow dr in mDataTable.Rows)
{
int CubeHeight=System.Convert.ToInt32(dr[this.mDataColumnName]);
if (mMaxYValue {
mMaxYValue=CubeHeight;
}
int TextWidth=(int)objGraph.mGraphics.MeasureString(System.Convert.ToDouble( dr[this.mDataColumnName])._
ToString() ,this.mTextFont).Width+10;
if (LeftWidthWarp {
LeftWidthWarp=TextWidth;
}
}
//LeftWidthWarp+=10;
}
//在顶部中心位置写标题
private void DrawTitle(Rectangle rcClient)
{
int Width=(int)objGraph.mGraphics.MeasureString(this.mTitle,mTitleFont).Width;
int Height=(int)objGraph.mGraphics.MeasureString(this.mTitle,mTitleFont).Height;
this.TopHeightWarp=Height;
int x=rcClient.Width/2- Width/2;
int y=rcClient.Y+Height/2-5;
this.objGraph.DrawText(this.mTitle,Color.Blue,mTitleFont,x,y);
}

//画所有水平网络线
//p:起始点;Width:线宽;BetweenHeight:二线之间高,Count:线数
// private void DrawGridLineAndTexts(Point p,int Width)
// {
// for(int i=0;i // {
// DrawGridLineAndText(p,p,Width,Lenght);
// p.Y-=BetweenHeight;
// }
// }

  <p>//由顶点与长、宽、高画颜色为color,背景色为的BackColor图表(3D) <br>
    private void DrawGridLineAndTexts(Point  p,int Width) <br>
    {//是否显示网络水平线 <br>
    if (this.mShowGrid) <br>
    { <br>
    this.objGraph.DrawGridLines(this.mGridLineColor,p,Width-1,this.mLenght,this.BetweenLineHeight,this.LineCount); <br>
    } </p>
  <p>//是否显示左文本 <br>
    if (this.mShowYText) <br>
    { <br>
    Point p1=p; <br>
    //p1.X-=this.mLenght; </p>
  <span>p1.Y+=Lenght; </span></td>

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

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

 mShowXScale = value;
this.Invalidate();
}  
}

private bool mShowYScale = true;
#if NETCFDESIGNTIME
// These design time attributes affect appearance of this property in the property grid.
[System.ComponentModel.Category("Chart")]
[System.ComponentModel.DefaultValueAttribute(true)]
[System.ComponentModel.Description("是否显示Y轴的刻度")]
#endif
// If true, shows the Y-Values on the left of the PDAChart
public bool IsShowYScale
{
get
{
return mShowYScale;
}
set
{
mShowYScale = value;
this.Invalidate();
}
}

private bool mShowGrid = true;
#if NETCFDESIGNTIME
// These design time attributes affect appearance of this property in the property grid.
[System.ComponentModel.Category("Chart")]
[System.ComponentModel.DefaultValueAttribute(false)]
[System.ComponentModel.Description("是否显示网格线")]
#endif
// If true, shows horiztonal grid lines on the PDAChart.
public bool IsShowGrid
{
get
{
return mShowGrid;
}
set
{
mShowGrid = value;
this.Invalidate();
}
}
#endregion
///
/// Clean up any resources being used.
///
protected override void Dispose( bool disposing )
{
if( disposing )
{
if( components != null )
components.Dispose();
}
base.Dispose( disposing );
}
#region Component Designer generated code
///
/// Required method for Designer support - do not modify
/// the contents of this method with the Code Editor.
///
private void InitializeComponent()
{
this.Paint += new System.Windows.Forms.PaintEventHandler(this.OnPaint);
this.hScrollBar1 = new System.Windows.Forms.HScrollBar();
this.hScrollBar1.Location = new System.Drawing.Point(1, 100);
this.hScrollBar1.Maximum = 1;
this.hScrollBar1.LargeChange = 1;
this.hScrollBar1.Size = new System.Drawing.Size(100, 16);
this.hScrollBar1.ValueChanged += new System.EventHandler(this.hScrollBar1_ValueChanged);

 this.Controls.Add(this.hScrollBar1);
}
#endregion
//
// private ArrayList mCudeData;

protected override void OnResize(EventArgs e)
{
//this.Refresh();
}

Graphics mGraphics;
Pen mBlackPen=new Pen(Color.Black);
//偏差
int TopHeightWarp=16; //顶偏差(文本高)

int LeftWidthWarp=0; //左偏差(最大数据文本宽)
int UnderHeightWarp=10; //底偏差(底文本高)
int BetweenLineHeight=10;//水平线的高
int LineCount=10;//水平线数

// //This Paint function uses routines common to both platforms.

int ClientHeight;
int mWidth;
int YHeight;
Rectangle rcClient;
System.Drawing.Region Region1;
public void OnPaint(object sender, System.Windows.Forms.PaintEventArgs e)
{
//base.Paint(null,e);
mGraphics=e.Graphics;
//读取数据
this.rcClient = this.ClientRectangle;
Region1=new Region ( this.rcClient);
Region1=Region1.Clone();

 ClientHeight=rcClient.Height;
objGraph.mGraphics=e.Graphics; //mGraphics.MeasureString//

 //计算最大的x轴、y轴坐标
CountMaxScaleXScaleY();
UnderHeightWarp=(int)objGraph.mGraphics.MeasureString("文本",this.mTextFont).Height+5;
UnderHeightWarp+=this.hScrollBar1.Height;
//作图的范围区(开始点、长、宽、高)
mBeginPoint.X =this.ClientRectangle.X+LeftWidthWarp ;
mBeginPoint.Y =this.ClientRectangle.Y+rcClient.Height-UnderHeightWarp ;

 //写标题
DrawTitle(rcClient);
int Width=rcClient.Width-this.mLenght-LeftWidthWarp;
mWidth=Width;
int Height=rcClient.Height-this.mLenght-TopHeightWarp-UnderHeightWarp;
this.YHeight= Height;
int Lenght=this.mLenght;

 //设置流动条
// this.hScrollBar1.Location = new System.Drawing.Point(0, rcClient.Y+rcClient.Height);
InitPage();
if (this.hScrollBarVisible)
{
this.hScrollBar1.Left=0;
this.hScrollBar1.Top=rcClient.Height-this.hScrollBar1.Height ;
this.hScrollBar1.Maximum=this.PageCount-1;

  if(rcClient.Width <246)
this.hScrollBar1.Width= rcClient.Width;
else
this.hScrollBar1.Width=246;
}
else
{
this.hScrollBar1.Left=0;
this.hScrollBar1.Top=0 ;
}
//从此分别画图
if (this.mMaxYValue> 10)
{
//水平网络线
this.BetweenLineHeight=(int)objGraph.mGraphics.MeasureString("文本",this.mTextFont).Height;
this.LineCount=Height/BetweenLineHeight;
}
else
{
this.BetweenLineHeight=Height/10;
//线数应该是能整
this.LineCount=10;
}
//画与它父相同背景颜色的区域,以隐藏角边
Color ParentBackColor=Color.Brown;

 objGraph.DrawRectangle( ParentBackColor,new Point(0,0),rcClient.Width,rcClient.Height);
e.Graphics.DrawRectangle(new Pen(ParentBackColor), rcClient);

 objGraph.DrawPDAChart(this.mGridLineColor, this.mAxesXColor,this.mAxesYColor,_
this.mBackColor,mBeginPoint,Lenght,Width,Height, this.mShowXScale,this.mShowYScale);
//画线和左文本(内部左下点)
Point p=mBeginPoint;
p.X+=this.mLenght;
p.Y-=this.mLenght;
DrawGridLineAndTexts(p,Width);
//mBeginPoint

 //画矩形与写文本
//CreateCubes(mBeginPoint,Width,rcClient.Height);
//mBeginPoint.X+=10;
CreatePageCubes(mBeginPoint,Width,ClientHeight);

 DrawTitle(rcClient);
}
}

//以左下坐标p,颜色color,长Lenght,宽Width,高Height,x轴文本textX,画立体图
public void AddOneCube(string textX,Point p,Color color,int Lenght,int Width, int Height)
{
try
{
objGraph.DrawCube (color,p,Lenght,Width,Height);
//文本
int txtWidth=(int)objGraph.mGraphics.MeasureString(textX,mTextFont).Width;
int txtHeight=(int)objGraph.mGraphics.MeasureString(textX,mTextFont).Height;

  int x=(p.X+Width/2)-txtWidth/2;
int y=p.Y+txtHeight/2;
this.objGraph.DrawText(textX,Color.Black,this.mTextFont,x,y-5);
}
catch(Exception ex)
{
string str=ex.Message;
}}

//一页立方体图形个数
int OnePageCubeCount=10;
int CurrentPage=0;//当前页
int PageCount=0;//多少页
//水平轴的相对值
int XScale;
//Y轴的相对值
double YScale=0.2;

Color[] color={Color.Red,Color.Blue,Color.Green,Color.Yellow,Color.YellowGreen,Color.Magenta,_

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

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

SolidBrush objBrush = new SolidBrush(color);

for(int i=0;i {
this.mGraphics.FillEllipse(objBrush,p.X,p.Y+i,pieWidth,pieLenght);
}
//黑色最上面的椭圓
Rectangle rc =new Rectangle(p.X,p.Y,pieWidth,pieLenght);
this.mGraphics.DrawEllipse(PenBlack,rc);

this.mGraphics.DrawLine( PenBlack,p.X,p.Y+pieLenght/2,p.X,p.Y+pieHeight+pieLenght/2);
this.mGraphics.DrawLine( PenBlack,p.X+pieWidth,p.Y+pieLenght/2,p.X+pieWidth,p.Y+pieHeight+pieLenght/2);

}

//求隋圆任意一点x坐标的相对点
//角angle,中心点oPoint,a,长半轴,b,短半轴
public double GetEllipsePX(double angle,int a,int b)
{
//角
double radians = angle * (Math.PI/180);
double px=a*System.Math.Cos(radians) ;
return px;
}

//求隋圆任意一点y坐标的相对点
//角angle,中心点oPoint,a,长半轴,b,短半轴
public double GetEllipsePY(double angle,int a,int b)
{
//角
double radians = angle * (Math.PI/180);
double py=b*System.Math.Sin(radians);
return py;
}

  <p>//画线椭圆线 <br>
    //角angle,中心点oPoint,a,长半轴,b,短半轴 <br>
    public void DrawEllipseLine(double  angle,Point oPoint,int a,int b) <br>
    { </p>
  <p>int  px=System.Convert.ToInt32(GetEllipsePX(angle,a,b))+oPoint.X ; <br>
    int py=System.Convert.ToInt32(GetEllipsePY(angle,a,b))+oPoint.Y  ; </p>
  <p>Pen PenBlack=new Pen( Color.Black); </p>
  <p>this.mGraphics.DrawLine(  PenBlack,oPoint.X,oPoint.Y,px,py); </p>
  <p>//e.Graphics.DrawLine(  PenBlack,oPoint.X,oPoint.Y,oPoint.X+b,oPoint.Y); <br>
    } <br>
    //取扇形的点集(逆时针) <br>
    //角angle,已经画过的角FinishAngle,中心点oPoint,长半轴a,短半轴b <br>
    public ArrayList GetPicPoints(double  angle,double FinishAngle,Point oPoint,int a,int b) <br>
    { <br>
    //Point[System.Convert.ToInt32(angle)]  curvePoints=new Array() ; <br>
    //以步长为1求扇形弧线的坐标点 <br>
    ArrayList pList=new ArrayList() ; <br>
    pList.Add(oPoint); <br>
    //pList.Add(ArcStartPoint); </p>
  <p>for(int i=0;i { <br>
    int  px=System.Convert.ToInt32(GetEllipsePX(i+FinishAngle,a,b))+oPoint.X ; <br>
    int  py=System.Convert.ToInt32(GetEllipsePY(i+FinishAngle,a,b))+oPoint.Y ; <br>
    pList.Add(new Point(px,py)); <br>
    //curvePoints.SetValue( <br>
    } <br>
    return pList; <br>
    } </p>
  <p>//画扇形(逆时针) <br>
    //角度angle,已经画过的角FinishAngle,中心点oPoint,长半轴a,短半轴b <br>
    public void DrawPDAPic(Color color, string  text,double angle,double FinishAngle,Point oPoint,int a,int b) <br>
    { <br>
    // Create solid brush. <br>
    SolidBrush Brush = new SolidBrush(color); <br>
    ArrayList  pList=GetPicPoints(angle,FinishAngle,oPoint,a,b); <br>
    Point[] curvePoints=new Point[pList.Count]  ; <br>
    for(int i=0;i  curvePoints[i]=(Point)pList[i]; </p>
  <p>mGraphics.FillPolygon(Brush, curvePoints); <br>
    //画边框 <br>
    mGraphics.DrawPolygon(this.mBlackPen,  curvePoints); <br>
    //DrawText(text,Color.Black,this. <br>
    } <br>
    } <br>
    #endregion <br>
    3. 在解决方案资源管理器中,右击&quot;引用&quot;,然后单击&quot;添加引用&quot;。 </p>
  <p>  4. 在&quot;添加引用&quot;对话框中的&quot;.NET&quot;选项卡上,单击&quot;System.Drawing&quot;,然后单击&quot;选择&quot;。 </p>
  <p>  &quot;System.Drawing&quot;会出现在&quot;选定的组件&quot;下。 </p>
  <p>  5. 对&quot;System.Windows.Forms&quot;重复步骤 4 并单击&quot;确定&quot;。 </p>
  <p>  &quot;System.Drawing&quot;和&quot;System.Windows.Forms&quot;都会出现在解决方案资源管理器的&quot;引用&quot;下。 </p>
  <p>  6. 在&quot;生成&quot;菜单上,单击&quot;生成解决方案&quot;。 </p>
  <p>  将生成控件  PDAChartControlControl.dll 的运行时版本并将其放在目录 Projects_Directory\PDAChartControlContro\bin\Debug\ 中。 </p>
  <p>  7. 在&quot;文件&quot;菜单中,单击&quot;关闭解决方案&quot;。 </p>
  <p>  由于生成了控件的运行时版本,接下来可以为设计器支持生成设计时版本。 </p>
  <p>   生成自定义控件的设计时版本 </p>
  <p>  1. 打开 Visual Studio .NET 命令提示。 </p>
  <p>  注意 要打开 Visual Studio .NET 命令提示,请单击&quot;开始&quot;,再依次指向&quot;程序&quot;、&quot;Microsoft Visual Studio .NET  2003&quot;和&quot;Visual  Studio .NET 工具&quot;,然后单击&quot;Visual Studio .NET 命令提示&quot;。 </p>
  <p>  2. 切换到包含 PDAChartControlControl.cs 的目录。 </p>
  <p>  3. 在命令提示处键入以下内容: </p>
  <p>csc /noconfig /define:NETCFDESIGNTIME  /target:library /out:design.PDAChartControlControl.dll  PDAChartControlControl.cs /r:&quot;C:\Program Files\Microsoft Visual Studio  .NET 2003\CompactFrameworkSDK\v1.0.5000\Windows  CE\Designer\System.CF.Design.dll&quot; /r:&quot;C:\Program Files\Microsoft  Visual Studio .NET 2003\CompactFrameworkSDK\v1.0.5000\Windows  CE\Designer\System.CF.Windows.Forms.dll&quot; /r:&quot;C:\Program  Files\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\v1.0.5000\Windows  CE\Designer\System.CF.Drawing.dll&quot; /r:System.Windows.Forms.dll  /r:System.Drawing.dll /r:System.dll /r:System.XML.dll  /r:System.Web.Services.dll /r:System.Data.dll /nowarn:1595 </p>
  <p>  这将生成自定义控件的设计时版本。文件 design.PDAChartControlControl.dll 放置在当前目录中。 </p>
  <p>   将自定义控件添加到工具箱 </p>
  <p>  由于编译了控件的运行时和设计时版本,接下来可以将该控件添加到&quot;工具箱&quot;,并在智能设备应用程序中使用它了。 </p>
  <p>  将自定义控件添加到&quot;工具箱&quot; 的步骤: </p>
  <p>  1. 将文件  design.PDAChartControlControl.dll 复制到目录 Program Files\Microsoft Visual Studio .NET  2003\CompactFrameworkSDK\v1.0.5000\Windows CE\Designer 中。 </p>
  <p>  2. 将文件 PDAChartControlControl.dll 复制到目录 Program Files\Microsoft Visual  Studio .NET 2003\CompactFrameworkSDK\v1.0.5000\Windows CE 中。 </p>
  <p>  3. 在&quot;视图&quot;菜单上单击&quot;工具箱&quot;。 </p>
  <p>  4. 右击&quot;常规&quot;,然后单击&quot;显示所有选项卡&quot;。 </p>
  <p>  5. 单击&quot;设备控件&quot;以显示设备上可用控件的完整列表。 </p>
  <p>  6. 右击&quot;指针&quot;,然后单击&quot;添加/移除项&quot;。 </p>
  <p>  7. 在&quot;自定义工具箱&quot;对话框的&quot;.NET Framework 组件&quot;选项卡上,单击&quot;浏览&quot;。 </p>
  <p>  8. 选择&quot;design.PDAChartControlControl.dll&quot;并单击&quot;打开&quot;,将&quot;PDAChartControl&quot;控件添加到&quot;自定义工具箱&quot;对话框中的组件列表。 </p>
  <p>  9. 在 .NET Framework 组件列表中选择&quot;PDAChartControl&quot;控件,然后单击&quot;确定&quot;。 </p>
  <p>  &quot;PDAChartControl&quot;控件即被添加到&quot;工具箱&quot;中。 </p>
  <p>   测试自定义控件 </p>
  <p>  由于自定义控件出现在&quot;工具箱&quot;中,接下来可以使用 Windows 窗体设计器将它拖到窗体上。 </p>
  <p>  将自定义控件添加到窗体 </p>
  <p>  1. 在&quot;文件&quot;菜单上指向&quot;新建&quot;,然后单击&quot;项目&quot;。 </p>
  <p>  2. 在&quot;新建项目&quot;对话框中的&quot;项目类型&quot;下,单击&quot;Visual c# 项目&quot;,并在&quot;模板&quot;下单击&quot;智能设备应用程序&quot;。 </p>
  <p>  3. 在&quot;名称&quot;框中,键入&quot;PDAChartControlControlTest&quot;,然后单击&quot;确定&quot;。 </p>
  <p>  4. 在&quot;智能设备应用程序向导&quot;中,单击上窗格中的&quot;Pocket PC&quot;和下窗格中的&quot;Windows 应用程序&quot;,然后单击&quot;确定&quot;。 </p>
  <p>  创建了新项目,Form1.cs  在设计器中打开。 </p>
  <p>  5. 从工具箱将&quot;PDAChartControl&quot;控件拖到窗体上。 </p>
  <p>  自定义控件即被添加到窗体上,指向 PDAChartControlControl 的引用则被添加到项目中。 </p>
  <p>  注意 如果工具箱不可见,则在&quot;查看&quot;菜单上,单击&quot;工具箱&quot;。 </p>
  
  <p>  自动生成的代码如下: </p>
  <p>PDAChartControl.PDAChart MyGraph=new  PDAChartControl.PDAChart(); </p>
  <p>this.pdaChart1.AxesXColor =  System.Drawing.SystemColors.HighlightText; <br>
    this.pdaChart1.AxesYColor =  System.Drawing.SystemColors.Info; <br>
    this.pdaChart1.BackColor =  System.Drawing.SystemColors.ControlLight; <br>
    this.pdaChart1.ChartType =  PDAChartControl.PDAChart.ChartTypeEnum.CakeChart; <br>
    this.pdaChart1.DataColumnName =  &quot;DataID&quot;; <br>
    this.pdaChart1.GridLineColor =  System.Drawing.Color.Cyan; <br>
    this.pdaChart1.hScrollBarVisible = true; <br>
    this.pdaChart1.IsShowGrid = true; <br>
    this.pdaChart1.Location = new  System.Drawing.Point(8, 24); <br>
    this.pdaChart1.PicHeight = 20; <br>
    this.pdaChart1.ShowColumnName =  &quot;ShowID&quot;; <br>
    this.pdaChart1.Size = new  System.Drawing.Size(224, 240); <br>
    this.pdaChart1.Text =  &quot;pdaChart1&quot;; <br>
    this.pdaChart1.TextFont = new  System.Drawing.Font(&quot;Arial&quot;, 8F, System.Drawing.FontStyle.Regular); <br>
    this.pdaChart1.Title = &quot;统计图&quot;; <br>
    this.pdaChart1.TitleFont = new  System.Drawing.Font(&quot;Arial&quot;, 9F, System.Drawing.FontStyle.Regular); <br>
    this.pdaChart1.hScrollBar1.Visible=false; <br>
    this.Controls.Add(this.pdaChart1); <br>
    6. 生成测试数据 </p>
  <p>//测试数据 <br>
    this.pdaChart1.dataTable=CreateQueryTable(); <br>
    this.pdaChart1.DataColumnName=  &quot;DataID&quot;; <br>
    this.pdaChart1.ShowColumnName=  &quot;ShowID&quot;; </p>
  <p>//建立查询明细表 <br>
    private DataTable CreateQueryTable() <br>
    { <br>
    DataTable dt=new  DataTable(&quot;query&quot;); <br>
    dt.Columns.Add(&quot;DataID&quot;); <br>
    dt.Columns.Add(&quot;ShowID&quot;); <br>
    for(int i=0;i &lt;10;i++) <br>
    { <br>
    DataRow dr=dt.NewRow(); <br>
    dr[&quot;DataID&quot;]=(i+1)*10; <br>
    dr[&quot;ShowID&quot;]=(i+1).ToString() ; <br>
    dt.Rows.Add(dr); <br>
    } <br>
    return dt; <br>
    } <br>
    7. 在&quot;设备&quot;工具栏的&quot;部署设备&quot;框中,选择要用作目标的设备。 </p>
  <p>  8. 在&quot;调试&quot;菜单上单击&quot;开始执行(不调试)&quot;。 </p>
  <p>  编译该应用程序并将其部署到目标设备上(与运行时所需的任何其他库一起),然后在设备上启动该应用程序。 </p>
  <p>  执行结果如下: </p>
  <p>? <br>
    VS.net本身并不提供智能设备(如PDA)应用程序的柱形图,开发智能设备应用程序时VS.net并不象Window应用程序那样提供用户自定义控件。在本文中,您将创建一个以柱形图显示的  PDAChartControl自定义控件。还将创建一个使用此 PDAChartControl自定义控件的智能设备应用程序。为了完成开发工作,您将执行这些过程: </p>
  <p>  · 创建该 PDAChartControl 自定义控件的运行时版本。 </p>
  <p>  · 编译该 PDAChartControl 自定义控件的设计时版本。 </p>
  <p>  · 将该控件添加到工具箱中。 </p>
  <p>  · 创建一个使用该 PDAChartControl 自定义控件的智能设备应用程序。 </p>
  <p>  · 在智能设备应用程序中测试该控件。 </p>
  <p>  本文的重点不在于编写控件的代码,而在于如何创建设计时自定义控件以及如何将它添加到&quot;工具箱&quot;中。 </p>
  <p>   生成自定义控件 </p>
  <p>  第一步是使用智能设备类库模板创建新项目并生成控件。 </p>
  <p>   创建自定义控件 </p>
  <p>  1. 在&quot;文件&quot;菜单上指向&quot;新建&quot;,然后单击&quot;项目&quot;。 </p>
  <p>  2. 在&quot;新建项目&quot;对话框中的&quot;项目类型&quot;下,单击&quot;Visual C# 项目&quot;,并在&quot;模板&quot;下单击&quot;智能设备应用程序&quot;。 </p>
  <p>  3. 在&quot;名称&quot;框中,键入&quot;PDAChartControlControl&quot;,然后单击&quot;确定&quot;。 </p>
  <p>  4. 在&quot;智能设备应用程序向导&quot;中,单击上窗格中的&quot;Pocket PC&quot;和下窗格中的&quot;类库&quot;,然后单击&quot;确定&quot;。 </p>
  <p>  创建了一个新项目,Class1.cs  在代码编辑器中打开。 </p>
    
  <span>由于已经创建用于该控件的项目,接下来可以向项目中添加引用、更改代码以及编译 PDAChartControl 自定义控件的运行时版本。</span></td>

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

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

set
{
mShowColumnName=value;
this.Invalidate();
}
}
private string mDataColumnName;
#if NETCFDESIGNTIME
[System.ComponentModel.Category("PDAChart")]
[System.ComponentModel.Description("设置/读取数据列")]
#endif
public string DataColumnName
{
get
{
return mDataColumnName;
}
set
{
mDataColumnName=value;
this.Invalidate();
}
}

private string mTitle="统计图";
#if NETCFDESIGNTIME
[System.ComponentModel.Category("PDAChart")]
[System.ComponentModel.DefaultValueAttribute("图表")]
[System.ComponentModel.Description("设置/读取标题")]
#endif
public string Title
{
get
{
return mTitle;
}
set
{
mTitle=value;
this.Invalidate();
}
}

  <p>private ArrayList mCubeData; <br>
    #if !NETCFDESIGNTIME <br>
    //The actual Data used to draw the line on  the graph <br>
    public ICollection CubeData <br>
    { <br>
    get <br>
    { <br>
    return  mCubeData; <br>
    } <br>
    set <br>
    { <br>
    mCubeData =  new ArrayList(value); <br>
    Rectangle  rcClient = this.ClientRectangle; <br>
    Rectangle  rcGraphClient = new Rectangle(rcClient.X + 21, rcClient.Y + 5, rcClient.Width -  21, rcClient.Height - 21); <br>
    this.Invalidate(rcGraphClient); <br>
    } <br>
    } <br>
    #endif </p>
  <p>private Color  mBackColor=System.Drawing.SystemColors.ControlLight; </p>
  <p>#if NETCFDESIGNTIME <br>
    [System.ComponentModel.Category(&quot;PDAChart&quot;)] <br>
    [System.ComponentModel.DefaultValueAttribute(0)] <br>
    [System.ComponentModel.Description(&quot;设置/读取背景颜色&quot;)] <br>
    #endif <br>
    public override Color BackColor <br>
    { <br>
    get <br>
    { <br>
    return  mBackColor; <br>
    } <br>
    set <br>
    { <br>
    mBackColor  =value; <br>
    this.Invalidate(); <br>
    } <br>
    } </p>
  <p>private Color  mAxesXColor=System.Drawing.SystemColors.HighlightText; </p>
  <p>#if NETCFDESIGNTIME <br>
    [System.ComponentModel.Category(&quot;PDAChart&quot;)] <br>
    [System.ComponentModel.DefaultValueAttribute(0)] <br>
    [System.ComponentModel.Description(&quot;设置/读取X轴颜色&quot;)] <br>
    #endif <br>
    public Color AxesXColor <br>
    { <br>
    get <br>
    { <br>
    return  mAxesXColor; <br>
    } <br>
    set <br>
    { <br>
    mAxesXColor  =value; <br>
    this.Invalidate(); <br>
    } <br>
    } </p>
  <p>private Color  mAxesYColor=System.Drawing.SystemColors.Info; <br>
    #if NETCFDESIGNTIME <br>
    [System.ComponentModel.Category(&quot;PDAChart&quot;)] <br>
    [System.ComponentModel.DefaultValueAttribute(0)] <br>
    [System.ComponentModel.Description(&quot;设置/读取Y轴颜色&quot;)] <br>
    #endif <br>
    public Color AxesYColor <br>
    { <br>
    get <br>
    { <br>
    return  mAxesYColor; <br>
    } <br>
    set <br>
    { <br>
    mAxesYColor  =value; <br>
    this.Invalidate(); <br>
    } <br>
    } </p>
  <p>private int mLenght = 4; <br>
    #if NETCFDESIGNTIME <br>
    // These design time attributes affect  appearance of this property in the property grid. <br>
    [System.ComponentModel.DefaultValueAttribute(5)] <br>
    [System.ComponentModel.Description(&quot;立体长&quot;)] <br>
    #endif <br>
    //The lower Y bound of the PDAChart <br>
    public int Lenght <br>
    { <br>
    get <br>
    { <br>
    return  mLenght; <br>
    } <br>
    set <br>
    { <br>
    mLenght =  value; <br>
    this.Invalidate(); <br>
    } <br>
    } <br>
    private int mMaxYValue ;//图表Y轴最大值 <br>
    private int mMaxXValue ;//图表X轴最大值 </p>
  <p>private Color  mGridLineColor=System.Drawing.Color.Cyan; <br>
    #if NETCFDESIGNTIME <br>
    [System.ComponentModel.Category(&quot;PDAChart&quot;)] <br>
    [System.ComponentModel.Description(&quot;网格线的颜色.&quot;)] <br>
    #endif <br>
    //The color of the line of the PDAChart. <br>
    public Color GridLineColor <br>
    { <br>
    get <br>
    { <br>
    return  mGridLineColor; <br>
    } <br>
    set <br>
    { <br>
    mGridLineColor  =value; <br>
    this.Invalidate(); <br>
    } <br>
    } <br>
    private bool mShowXText = true; <br>
    #if NETCFDESIGNTIME <br>
    // These design time attributes affect  appearance of this property in the property grid. <br>
    [System.ComponentModel.Category(&quot;Chart&quot;)] <br>
    [System.ComponentModel.DefaultValueAttribute(true)] <br>
    [System.ComponentModel.Description(&quot;是否显示X轴的文本&quot;)] <br>
    #endif <br>
    // If true, shows the Y-Values on the left  of the PDAChart <br>
    public bool IsShowXText <br>
    { <br>
    get <br>
    { <br>
    return  mShowXText; <br>
    } <br>
    set <br>
    { <br>
    mShowXText =  value; <br>
    this.Invalidate(); <br>
    } <br>
    } <br>
    private bool mShowYText = true; <br>
    #if NETCFDESIGNTIME <br>
    // These design time attributes affect  appearance of this property in the property grid. <br>
    [System.ComponentModel.Category(&quot;Chart&quot;)] <br>
    [System.ComponentModel.DefaultValueAttribute(true)] <br>
    [System.ComponentModel.Description(&quot;是否显示Y轴的数字&quot;)] <br>
    #endif <br>
    // If true, shows the Y-Values on the left  of the PDAChart <br>
    public bool IsShowYText <br>
    { <br>
    get <br>
    { <br>
    return  mShowYText; <br>
    } <br>
    set <br>
    { <br>
    mShowYText =  value; <br>
    this.Invalidate(); <br>
    } <br>
    } <br>
    private bool mShowXScale = true; <br>
    #if NETCFDESIGNTIME <br>
    // These design time attributes affect  appearance of this property in the property grid. <br>
    [System.ComponentModel.Category(&quot;Chart&quot;)] <br>
    [System.ComponentModel.DefaultValueAttribute(true)] <br>
    [System.ComponentModel.Description(&quot;是否显示X轴的刻度.&quot;)] <br>
    #endif <br>
    // If true, shows the X-Values on the  bottom of the PDAChart <br>
    public bool IsShowXScale <br>
    { <br>
    get <br>
    { <br>
    return  mShowXScale; <br>
    } <br>
    set </p>
   
  <span>{ </span></td>

使用c#捕获windows的关机事件

使用c#捕获windows的关机事件

  在公司上班,下班时需要签退,而我呢隔三差五就会忘那么一次。怎么办呢,于是就想能不能捕获windows的关机事件,做一个程序让它在关机的时候提醒我一下呢。

  非常幸运很容易就找到了Microsoft.win32命名空间下面的SystemEvents类,他有一个静态的事件SessionEnding在系统注销或者关机时发生,此事件只有在winform的程序下有效,而在控制台程序下面无效,不能激发事件;还有一点我们必须在程序推出时将加上的事件移除掉,否则就容易造成内存溢出。

  关键代码如下:

以下是引用片段:
   using System;
   using System.Collections.Generic;
   using System.Windows.Forms;
   using Microsoft.win32;
   namespace Shutdown
   {
   static class Program
   {
   /**////
   /// 应用程序的主入口点。
   ///
   [STAThread]
   static void Main()
   {
   Application.EnableVisualStyles();
   Application.SetCompatibleTextRenderingDefault(false);
   FormShutdown formShutdown = new FormShutdown();
   SystemEvents.SessionEnding += new SessionEndingEventHandler(formShutdown.SystemEvents_SessionEnding);
   Application.Run(formShutdown);
   }
   }
   }Form 的代码:
   using System;
   using System.Collections.Generic;
   using System.ComponentModel;
   using System.Data;
   using System.Drawing;
   using System.Text;
   using System.Windows.Forms;
   using Microsoft.Win32;
   namespace Shutdown
   {
   public partial class FormShutdown : Form
   {
   const string MESSAGE_TXT = "您签退了吗?";
   const string MESSAGE_TITLE = "提示";
   public FormShutdown()
   {
   InitializeComponent();
   }
   internal void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e)
   {
   DialogResult result = MessageBox.Show(MESSAGE_TXT, MESSAGE_TITLE, MessageBoxButtons.YesNo);
   e.Cancel = (result == DialogResult.No);
   }
   private void FormShutdown_Load(object sender, EventArgs e)
   {
   this.Location = new Point(Screen.PrimaryScreen.WorkingArea.Width - 200, 0);
   }
   protected override void OnClosed(EventArgs e)
   {
   SystemEvents.SessionEnding -= new SessionEndingEventHandler(this.SystemEvents_SessionEnding);
   base.OnClosed(e);
   }
   }
   }

  <p>  此程序在使用c#2.0在Windows2003下测试通过。大家在使用SystemEvents.SessionEnding事件时切记要在程序退出时移除事件。</p>
  <p>  不过有两点遗憾之处:</p>
  <p>  1. 使用这种方式不能捕获休眠时的事件</p>
  <p>  2. 这个程序占用的内存太多了,只有这么一个小功能居然占了12M的内存,这都是.Net framework惹的货;实在是不可思议。</p>
  <p>  大家有没有什么好主意可以克服这两个缺点呢?</p>    </td>