none
VB PowerPack中的一个bug? RRS feed

  • 常规讨论

  • 最近我将.NET中Label控件和VB PowerPack中的RectangleShape控件一起使用,当我把Label控件的Parent属性设置为RectangleShape的Parent时,就会有类似于Bug的现象出现,具体引发操作如下:

    (我使用的是.NET Framework 4.0和VB PowerPack 10.0)
    1、创建一个Windows Forms Application项目(普通窗体项目)
    2、打开窗体的视图设计器,将工具栏公共控件中一个Button对象和Visual Basic PowerPacks的一个RectangleShape对象拖至窗体任意位置
    3、双击窗体上的按钮,出现查看代码窗体,保证窗体中的代码如下所示:
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;

    namespace WindowsFormsApplication1
    {
     public partial class Form1 : Form
     {
      Label label1;
      public Form1()
      {
       InitializeComponent();
       label1 = new Label();
       label1.Parent = rectangleShape1.Parent;
       label1.AutoSize = true;
      }

      bool flag = false;
      private void button1_Click(object sender, EventArgs e)
      {
       if (!flag)
        label1.Text = "1000";
       else
        label1.Text = "100";
       flag = true;
      }
     }
    }


    4、按下F5开始运行
    5、单击一次Button对象,窗体上正常出现Label字符(窗体左上角出现"1000"的字样)
    6、再次单击Button对象,窗体上字符出现异常(预期应该出现100,实现在100后面还加上了一个小尾巴)

    下面是一些我自己的分析:
    1、当我不使用RectangleShape.Parent,而直接将Label.Parent = this的话,此现象不会出现
    2、不执行上一步,当我不将Label.AutoSize设为true的话,此现象也不会出现
    3、先向控件写入一个字符串后,后一个字符串必须比前一个字符串短才会出现此问题
    (即要出现此现象必须使用RectangleShape.Parent并设定Label.AutoSize=true)

    我想到的一些解决方法:
    1、每次当控件改变时随意改变一下控件的大小(~~)
    2、使用string.Format,不让字符串变短,在每次更新Label时应该使用(那个数的绝对值越大越好,用于向左边加入空格,用于对齐)
        Label.Text = string.Format("{0, -5}", args);
    3、调用Invalidate,即在每次更新Label时都

    • 已编辑 Flysha 2011年3月27日 1:27
    • 已更改类型 Flysha 2011年3月30日 4:24
    2011年3月26日 9:10

全部回复

  • 应该是OnPaint消息被拦截导致无法重画无效区域所致.

    我认为过程是这样的,第一次字符串画到label上后 同时导致了VB那个控件的重绘,此时图像显示的举行区域lable和rec其实是重叠的,当字符串变短后由于只有label对象感知到字符串的变化进而响应重绘,你看到的多余的像素应该是残留在rec上而非label实体上的.

    2011年3月26日 14:19
  • 那就是说应该是RectangleShape的问题吗?

    2011年3月26日 14:36
  • 个人认为这跟显卡的绘图效能有关,设定控件的DoubleBuffered试看看,详细做法参考以下
    http://www.dotblogs.com.tw/yc421206/archive/2010/10/20/18472.aspx
    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年3月26日 18:37
  • 刚刚已经确认,将Form的DoubleBuffered属性设定为true后,效果没有仍然变化。
    我想问题应该是像Ferdin.Lee所说的那样,是VB那个控件的ShapeContain没有及时进行重绘的问题,应该不是Label的问题

    虽然最简单的解决办法显而易见,RectangleShape的Parent是一个ShapeContainer,是继承于一个UserControl,而RectangleShape.Parent.Parent就是Control,问题出现在ShapeContainer上,所以最简单的解决办法应该是将
    Label.Parent = RectangleShape.Parent
    改为:
    Label.Parent = RectangleShape.Parent.Parent

    但是不管怎么说这应该还是一个不正常的行为,因此期待以后的能将这一行为修正!

    2011年3月27日 1:24
  • dear
    請設定label及ShapeContain的DoubleBuffered屬性試試
    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年3月28日 7:13
  • 可以问下为什么把parent设为rec对象么?我感到非常古怪。

    2011年3月28日 7:50
  • 因为Label的Parent是一个Control,而RectangleShape的Parent也是一个继承于UserControl的ShapeContainer

    在我的一个函数里面就是穿过来一个ShapeContainer

    2011年3月29日 4:02
  • 你的意思是想获取shpecontainer的引用?

     

    2011年3月29日 7:10
  • 因为Label的Parent是一个Control,而RectangleShape的Parent也是一个继承于UserControl的ShapeContainer

    在我的一个函数里面就是穿过来一个ShapeContainer

    我私底下做了些测试,label的重绘并不会每次都使rec对象发生重绘。
    2011年3月29日 7:11
  • 这个问题毫无疑问与 WM_PAINT 有关。您可以在改变 Label 的文本后调用 this.UpdateWindow() 方法来强制窗体重绘。这个问题看起来涉及到多个控件,请向 Microsoft Connect 的 Visual Studio and .NET Framework 项目提交 Bug 反馈。谢谢。
    Mark Zhou
    2011年3月30日 9:41
  • 好的,我已向Microsoft Connect 的 Visual Studio and .NET Framework项目提交bug反馈,但是我使用的是中文,不知能否接受,……


    链接如下:
    https://connect.microsoft.com/VisualStudio/feedback/details/654638/vb-powerpack-label-bug

    2011年3月30日 10:53