none
自定义容器控件问题 RRS feed

  • 问题

  • 大家好!
    我在用USERCONTROL做容器控件的时候, 开始一切都正常,当我把自定义的容器控件托到窗体上, 然后再在容器控件上放Lable的时候, 只要我按运行, 这个全速运行Lable位置显示正常, 当我再停止的时候, Lable的Loaction这个点的坐标就变了, 而且在停止运行的编辑界面Lable位置也变了.  请问大家这是怎么回事???? 
    2009年5月12日 2:28

答案

全部回复

  • 你好!
         不好意思啊!没有明白你的意思,请问什么是“只要我按运行, 这个全速运行Lable位置显示正常, 当我再停止的时候, Lable的Loaction这个点的坐标就变了”啊?
         什么是“全速”运行呢?你的Label是运动的吗?

    周雪峰
    2009年5月12日 4:29
    版主
  • Lable不是运行的,  是固定的. 那个全速运行是实际上是"调试全速".  等停止后,Lable就不是原来调试前的位置上了. 

    调试运行,停止后的位置

    2009年5月12日 5:34
  • 你好!
         你检查一下你的程序中有没有修改Label的Location属性的代码!
        
    周雪峰
    2009年5月12日 6:43
    版主
  • namespace WindowsControlLibrary1
    {
        [System.ComponentModel.Designer("System.Windows.Forms.Design.ParentControlDesigner,   System.Design ")]
        public partial class UserZhouControl : UserControl
        {
            //各相关属性对属定义
            private Color _colorStar= SystemColors.MenuHighlight;
            private Color _colorend = Color.White;
            private float _colorAng= 90f;
            private Color _colorFill= SystemColors.MenuHighlight;
            //画笔Pen属性值定义
            private Color _penColor= SystemColors.MenuHighlight;
            private float _penWidth= 5f;
            //text属性值定义
            private string _controlText = "UserZhouControl1";

            /// <summary>
            /// UserControl1控件构造器
            /// </summary>
            public UserZhouControl()
            {
                InitializeComponent();
            }

            #region   /*控件新增属性值定义*/

            //渐变起始色属性值
            [Description("背景渐变起始色")]   //显示在属性设计视图中的描述
            public Color ColorStar
            {
                get
                {
                    return _colorStar;
                }
                set
                {
                    _colorStar = value;
                    this.Invalidate();
                }
            }

            [Description("背景渐变结束色")]   //显示在属性设计视图中的描述
            //渐变结束色属性值
            public Color ColorEnd
            {
                get
                {
                    return _colorend;
                }
                set
                {
                    _colorend = value;
                    this.Invalidate();
                }
            }

            [Description("背景渐变角色")]      //显示在属性设计视图中的描述
            //渐变色角度属性值
            public float ColorAng
            {
                get
                {
                    return _colorAng;
                }
                set
                {
                    _colorAng = value;
                    this.Invalidate();
                }
            }

            [Description("控件边框颜色")]      //显示在属性设计视图中的描述
            //画笔颜色属性值定义
            public Color penColor
            {
                get
                {
                    return _penColor;
                }
                set
                {
                    _penColor = value;
                    this.Invalidate();
                }
            }

            [Description("控件边框宽度")]      //显示在属性设计视图中的描述
            //画笔笔画宽度属性值定义
            public float penWidth
            {
                get
                {
                    return _penWidth;
                }
                set
                {
                    _penWidth = value;
                    this.Invalidate();
                }
            }

            [Description("控件标题栏填充色")] //显示在属性设计视图中的描述
            //控件标题栏填充颜色定义
            public Color ColorFill
            {
                get
                {
                    return _colorFill;
                }
                set
                {
                    _colorFill = value;
                    this.Invalidate();
                }
            }

            [Description("控件标题栏文本")]   //显示在属性设计视图中的描述
            //控件中要显示的文本定义
            public string StringText
            {
                get
                {
                    return _controlText;
                }
                set
                {
                    _controlText = value;
                    this.Invalidate();
                }
            }

            #endregion

            /// <summary>
            /// 控件第一次加载时引发的事件
            /// </summary>
            /// <param name="sender">事件发行者的信息</param>
            /// <param name="e">事件信息</param>
            private void UserZhouControl_Load(object sender, EventArgs e)
            {
                this.ResizeRedraw = true;
                //this.SetStyle(ControlStyles.FixedHeight, true);
                //this.SetStyle(ControlStyles.ContainerControl, true);
                //this.SetStyle(ControlStyles.FixedWidth, true);
            }
            /// <summary>
            /// 控件paint事件
            /// </summary>
            /// <param name="sender">事件发行者信息</param>
            /// <param name="e">paint事件信息</param>
            private void UserZhouControl_Paint(object sender, PaintEventArgs e)
            {
                Graphics pG = e.Graphics;
                Pen pP = new Pen(_penColor, _penWidth);
                LinearGradientBrush pL = new LinearGradientBrush(new Rectangle(0, 0, this.Width, this.Height), _colorStar, _colorend, _colorAng);
                GraphicsPath oPath = new GraphicsPath();
                int x = 0;
                int y = 0;
                int w = this.Width;
                int h = this.Height;
                int a = 30;
                oPath.AddArc(x, y, a, a, 180, 90);
                oPath.AddArc(w - a, y, a, a, 270, 90);
                oPath.AddArc(w - a, h - a, a, a, 0, 90);
                oPath.AddArc(x, h - a, a, a, 90, 90);
                oPath.CloseAllFigures();
                Region = new Region(oPath);
                pG.FillPath(pL, oPath);
                pG.DrawPath(pP, oPath);
                oPath.Dispose();

                //标题框路径
                GraphicsPath oP = new GraphicsPath();
                oP.AddArc(x, y, a, a, 180, 90);
                oP.AddLine(a, y, w - a, y);
                oP.AddArc(w - a, y, a, a, 270, 90);
                oP.AddLine(w, a + 5, x, a + 5);
                oP.CloseAllFigures();
                pG.FillPath(new SolidBrush(_colorFill), oP);
                oP.Dispose();

                //绘制控件中显示的文本
                StringFormat textFormat = new StringFormat();
                textFormat.Alignment = StringAlignment.Center;
                textFormat.LineAlignment = StringAlignment.Center;
                textFormat.FormatFlags = StringFormatFlags.NoWrap;
                pG.DrawString(_controlText, this.Font, new SolidBrush(this.ForeColor), new RectangleF(new PointF(0, 0), new SizeF(this.Width, a)), textFormat);
                pG.Dispose();
            }
        }
    }


    这是我自定义控件的代码,里面没有修改过LOACTION属性的代码.  LABLE是我在做项目的时候把自定义控件封装成DLL加载到工具箱后,托到窗体上, 再把LABLE托到自定义控件上去的.  

    2009年5月12日 7:34
  • 你好!
    我单步调试发前在主窗体调用InitializeComponent();这个方法前, 在InitializeComponent()方法里面的LABLE的LOACTION属性是(3.35),    
                //
                // label2
                //
                this.label2.AutoSize = true;
                this.label2.Location = new System.Drawing.Point(3, 35);
                this.label2.Name = "label2";
                this.label2.Size = new System.Drawing.Size(55, 21);
                this.label2.TabIndex = 0;
                this.label2.Text = "label2";

    等从InitializeComponent();方法返回后
             public MainForm()
            {
                InitializeComponent();

                int xxx= this.label2.Location.X;
                int yyy = this.label2.Location.Y;
            }
    xxx=5;
    yyy=61;
    了.

    2009年5月12日 7:51
  • 你好!
    谢谢版主和各位帮忙,问题解决,是在主窗体的InitializeComponent()方法里面,在初始主窗体有一个语句用来初始主窗体字体的出现了问题, 当我单步调试经过这个语句的时候,LABLE的LOACTION属性就变了. 我删掉该语句一切都正常了,  不过具体是什么原因现在还是糊的...
    2009年5月12日 8:04
  • 请问可以提供相关代码吗?
    周雪峰
    2009年5月12日 8:10
    版主
  • 找到问题点,是自定义控件的字体设定与我所规定的区域高度不协调引起的.
    2009年5月12日 8:13