C#学习文档 (转)

C#学习文档 (转)[@more@]

我原先是学习VB的,总觉得没有继承性实在不方便,后来学习C#后,觉得很方便(C++和Delphi的人不许笑我)。
  在设计程序时,经常使用向导来建立界面帮助用户完成某个操作,通常向导的界面基本相同的,基本两种类型:欢迎画面和普通画面。
XML:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />Office:office" />ASPectratio="t">

  .NET/develop/article/images/16927_image001.JPG" align=baseline border=0>

系统分析:普通向导页面分为顶部信息和底部信息,顶部包括:标题(Title)、本页描述(Info)和标题图像(TitleImage)。底部信息包括:取消(Cancel)、上一步(Back)、下一步(Next)和完成(Finsh),有些向导还包括其他按钮,例如:帮助(Help)等,但在这个例子中,为简单起见,不考虑这么多情况。
  在欢迎画面中,主要差别是顶部,欢迎画面没有标题部分,但在左边有个大图片。

  实现:我使用了窗口作为基类,首先在界面中绘制基本的控件,见下图:

  首先我确定是用三个属性控制顶部状态,Title,Info和Image,也许大家发现我这里没有在标题上直接放控件,因为我觉得没有必要,我在内部定义了三个变量:
  private string strTitle="";
  private string strInfo="";
  private Image  imgTitle=null;
  通过对外的三个属性改变标题的信息:
  [Description("返回/设置顶部标题的文本")]
  public string Title{
  get{
  return strTitle;}
  set{
  strTitle=value;
  panTitle.Invalidate();}
  }

  [Description("返回/设置顶部标题的说明文本")]
  public string Info{
  get{
  return strInfo;}
  set{
   strInfo=value;
  panTitle.Invalidate();}
  }
 
  [Description("返回/设置右上角图像或欢迎画面的图像")]
  public Image TitleImage{
  get{
  return imgTitle;}
  set{
  imgTitle=value;
  panTitle.Invalidate();}
  }

  在标题面板(panTitle)的重绘事件中,重新绘制了标题信息:

  //绘制标题中的信息

  private void panTitle_Paint(object sender, System.windows.Forms.PaintEventArgs e) {

  Graphics grp=e.Graphics;

 

   grp.Clear(panTitle.BackColor);

  if(mGuidPageMode == tayGuidePageEnum.tayGuidePage_None){

  ControlPaint.DrawBorder3D(grp,panTitle.ClientRectangle,Border3DStyle.Etched,Border3DSide.Bottom);    //在标题框的底部绘制凹陷线条

 

  Font fnt  = new Font(this.Font,this.Font.Style  | FontStyle.Bold);    //绘制粗体的标题文本

  Solidbrush bsh = new SolidBrush(SystemColors.ControlText);

  grp.DrawString(strTitle,fnt  ,bsh,12,8);

 

  PointF locInfo = new PointF(20,10 + fnt.GetHeight(grp));    //说明文本的左上角坐标

  SizeF  szImg  = new SizeF(48,48);    //图形大小

  PointF locImg  = new PointF(panTitle.Width - szImg.Width -6,6 );    //图形的左上角坐标

   SizeF  szInfo  = new SizeF(locImg.X - locInfo.X  -2,panTitle.Height - locInfo.Y -5);    //文本的大小

  RectangleF rect= new RectangleF(locInfo,szInfo);    //文本的范围

  grp.DrawString(strInfo,this.Font,bsh,rect);      //绘制说明文本

  bsh.Dispose();

 

  if(imgTitle != null){

  grp.DrawImage(imgTitle,new RectangleF(locImg,szImg));

  }

  }

  else if(mGuidPageMode == tayGuidePageEnum.tayGuidePage_Start){

  if(imgTitle != null){

  grp.DrawImage(imgTitle,panTitle.ClientRectangle); 

  }

  }

  grp.Dispose();

  }

  大家可能发现绘制的语句分俩种情况绘制,其实时处理欢迎画面和普通画面的区别,我们通过属性让用户修改样式:

 

  [Description("返回/设置当前页面的类型(欢迎页或普通页)")]

  public tayGuidePageEnum PageMode{

  get{

  return mGuidPageMode;}

  set{

  if(mGuidPageMode !=value){

  mGuidPageMode=value;

 

  this.SuspendLayout();  //临时挂起空间的布局逻辑

  switch(mGuidPageMode){

  case tayGuidePageEnum.tayGuidePage_None:{  //普通界面

  panTitle.Anchor = ((AnchorStyles.Top | AnchorStyles.Left) | AnchorStyles.Right);

  panTitle.Size  = new Size(Width,60);

  break;}

  case tayGuidePageEnum.tayGuidePage_Start:{  //欢迎画面

   panTitle.Anchor = ((AnchorStyles.Bottom | AnchorStyles.Left) | AnchorStyles.Top);

  panTitle.Size  = new Size(160,Height-panBottom.Height);

  break;}

  } 

   this.ResumeLayout(false);

  }

  }

  }


  底部没有多少绘制工作,只有绘制一条线:

  private void panBottom_Paint(object sender, System.Windows.Forms.PaintEventArgs e) {

  Graphics grp=e.Graphics;

 

  ControlPaint.DrawBorder3D(grp,panBottom.ClientRectangle,Border3DStyle.Etched,Border3DSide.Top);      //在标题框的底部绘制凹陷线条

 

  grp.Dispose();

  }

 

  按钮的状态我们通过属性控制:

 

  [Description("返回/设置是否允许 取消")]

  public bool CanCancel{

  get{

  return cmdCancel.Visible;}

  set{

   cmdCancel.Visible=value;}

  }

 

  [Description("返回/设置是否允许 上一步")]

  public bool CanBack{

  get{

  return cmdback.Visible;}

  set{

  cmdBack.Visible=value;}

  }

 

  [Description("返回/设置是否允许 下一步")]

  public bool CanNext{

  get{

  return cmdNext.Visible;}

  set{

  cmdNext.Visible=value;}

  }

 

  [Description("返回/设置是否允许 完成")]

  public bool CanFinish{

   get{

  return cmdFinish.Visible;}

  set{

  cmdFinish.Visible=value;}

  }

  好,我们大功告成,代码非常的简单,我们从这个基础类中继承出新的窗口,看看效果:

 

  先在我有个问题我解决不掉,就是如果我设置窗口可以调整大小的话,画面无法重画,请高手指点。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/10752019/viewspace-976503/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/10752019/viewspace-976503/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值