C#学习文档

我原先是学习VB的,总觉得没有继承性实在不方便,后来学习C#后,觉得很方便(C++和Delphi的人不许笑我)。
    在设计程序时,经常使用向导来建立界面帮助用户完成某个操作,通常向导的界面基本相同的,基本两种类型:欢迎画面和普通画面。

   

系统分析:普通向导页面分为顶部信息和底部信息,顶部包括:标题(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;}

        }

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

  

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

 

  • 0
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论
c#从入门到精通第四版的pptC#是微软公司发布的一种面向对象的、运行于.NET Framework之上的高级程序设计语言。并定于在微软职业开发者论坛(PDC)上登台亮相。C#是微软公司研究员Anders Hejlsberg的最新成果。C#看起来与Java有着惊人的相似;它包括了诸如单一继承、接口、与Java几乎同样的语法和编译成中间代码再运行的过程。但是C#与Java有着明显的不同,它借鉴了Delphi的一个特点,与COM(组件对象模型)是直接集成的,而且它是微软公司 .NET windows网络框架的主角。 C#是一种安全的、稳定的、简单的、优雅的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏以及不允许多重继承)。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。 [1] C#是面向对象的编程语言。它使得程序员可以快速地编写各种基于MICROSOFT .NET平台的应用程序,MICROSOFT .NET提供了一系列的工具和服务来最大程度地开发利用计算与通讯领域。 C#使得C++程序员可以高效的开发程序,且因可调用由 C/C++ 编写的本机原生函数,因此绝不损失C/C++原有的强大的功能。因为这种继承关系,C#与C/C++具有极大的相似性,熟悉类似语言的开发者可以很快的转向C#。 [2]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

tansm

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值