C#学习文档

    技术2022-05-11  104

    我原先是学习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)