C# 新新手 要求是这样的 2层图 1底层是画一个正方形 能跟随鼠标在窗体中移动 
       
2上层画一个红色十字在窗体正中央不动我的想法是:用 Bitmap 新建2个画布,A,B A背景设置白底,正中间画正方形。B背景设置透明(不然不显示下层画布,我是这么理解的)画一个红十字。现在的问题是我这样画了以后并不能把红十字和正方形同时显示出来 后来我查资料发现 BackgroundImage 方法。用了以后能显示了 但窗体中的图形不停的在闪。应该是用双缓冲技术,看不明白了 特来求教。更别提 正方形跟随鼠标移动了(这里我想通过鼠标左键单击窗体的正方形开始触发事件)希望高手能提供完整的可执行代码 尽量+注释 我想好好揣摩学习一下!

解决方案 »

  1.   

    闪是因为没有开启双缓冲,具体我不作回答,请到MSDN复习去。
      

  2.   

    可以参考一下我以前回答的一个帖子,我是拖动的image,对于你说的正方形其实是一回事,然后你说的中央的红十字,在paint方法中采用如下的顺序绘制就可以了
    1. 绘制背景(比如你说的白色)
    2. 绘制正方形
    3. 绘制红十字
    因为后绘制的图形会覆盖在之前绘制的图形之上,所以这样就能保证红十字不会被正方形给挡住了
      

  3.   

    忘了发链接了。
    http://topic.csdn.net/u/20091023/15/420d20ce-af7d-461a-9033-f2a4a3323757.html
      

  4.   

    这个可以这样。
    using (ImageAttributes ia = new ImageAttributes())
    {
    //注意这里的背景色
        ia.SetColorKey(BackColor, BackColor, ColorAdjustType.Bitmap);
        int w = bmp.Width;
        int h = bmp.Height;
        Rectangle rect = new Rectangle(0, 0, w, h);
        for (int i = 0; i < Manager.Count; i++)
        {
            Bitmap b = Manager[i].Image;
    //以上的b中,颜色等于背景色的部分不会画上去
            g.DrawImage(b, rect, 0, 0, w, h, GraphicsUnit.Pixel, ia);
        }
        g.DrawString(String.Format("{0};{1}", w, h), Font, new SolidBrush(Color.Green), new PointF(8, 8));
    }
      

  5.   

    但是怎么能让底层的正方形移动而不影响中间的红十字呢?我用picterbox 装底层的正方形 红十字就不知道怎么显示了
      

  6.   


    所以就是不要用picturebox来装底层的正方形啊,把你的正方形定义为一个单独的类,它有自己的region,并拥有一个Draw方法,然后它还有一段逻辑来响应MouseDrag,你先仔细看看我的回帖
    http://topic.csdn.net/u/20091023/15/420d20ce-af7d-461a-9033-f2a4a3323757.html
    要是还有什么不明白的地方我有时间再针对你的情况写一下代码
      

  7.   

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }    protected override void OnPaint(PaintEventArgs e)
        {
            // 先画正方形
            e.Graphics.FillRectangle(Brushes.CornflowerBlue, lastRect);        // 再画红十字
            const int CrossSize = 32;
            e.Graphics.TranslateTransform(this.ClientRectangle.Width / 2.0f, this.ClientRectangle.Height / 2.0f);
            e.Graphics.DrawLine(Pens.Red, new Point(-CrossSize, 0), new Point(+CrossSize, 0));
            e.Graphics.DrawLine(Pens.Red, new Point(0, -CrossSize), new Point(0, +CrossSize));
        }
            
        protected override void OnMouseMove(MouseEventArgs e)
        {
            Region region = new System.Drawing.Region(lastRect);        Point location = this.PointToClient(Cursor.Position);
            location.Offset(-lastRect.Width / 2, -lastRect.Height / 2);
            lastRect.Location = location;        region.Union(lastRect);
            this.Invalidate(region);
        }    private Rectangle lastRect = new Rectangle(-100, -100, 16, 16);
    }
      

  8.   

    拖动时,搞成xor模式(需要api了,c#提供的有点凑合),
    新的画上,旧的擦去,尽量减少画的范围。还有一种方式 是手动的过程中画一矩形框, 放下时,把图片画上就行了。
      

  9.   

    分别去画两层画布,如果有重复的地方你就把重复的地方用叠加后的颜色再画一遍。不要用BackgroundImage ,那个貌似连续刷还占cpu呢
      

  10.   

    如果画在窗体上 那么 this.DoubleBuffer=true;控件也有不少是支持双缓冲的,所以也有 控件名.DoubleBuffer=true;