C# 新新手 要求是这样的 2层图 1底层是画一个正方形 能跟随鼠标在窗体中移动
2上层画一个红色十字在窗体正中央不动我的想法是:用 Bitmap 新建2个画布,A,B A背景设置白底,正中间画正方形。B背景设置透明(不然不显示下层画布,我是这么理解的)画一个红十字。现在的问题是我这样画了以后并不能把红十字和正方形同时显示出来 后来我查资料发现 BackgroundImage 方法。用了以后能显示了 但窗体中的图形不停的在闪。应该是用双缓冲技术,看不明白了 特来求教。更别提 正方形跟随鼠标移动了(这里我想通过鼠标左键单击窗体的正方形开始触发事件)希望高手能提供完整的可执行代码 尽量+注释 我想好好揣摩学习一下!
2上层画一个红色十字在窗体正中央不动我的想法是:用 Bitmap 新建2个画布,A,B A背景设置白底,正中间画正方形。B背景设置透明(不然不显示下层画布,我是这么理解的)画一个红十字。现在的问题是我这样画了以后并不能把红十字和正方形同时显示出来 后来我查资料发现 BackgroundImage 方法。用了以后能显示了 但窗体中的图形不停的在闪。应该是用双缓冲技术,看不明白了 特来求教。更别提 正方形跟随鼠标移动了(这里我想通过鼠标左键单击窗体的正方形开始触发事件)希望高手能提供完整的可执行代码 尽量+注释 我想好好揣摩学习一下!
1. 绘制背景(比如你说的白色)
2. 绘制正方形
3. 绘制红十字
因为后绘制的图形会覆盖在之前绘制的图形之上,所以这样就能保证红十字不会被正方形给挡住了
http://topic.csdn.net/u/20091023/15/420d20ce-af7d-461a-9033-f2a4a3323757.html
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));
}
所以就是不要用picturebox来装底层的正方形啊,把你的正方形定义为一个单独的类,它有自己的region,并拥有一个Draw方法,然后它还有一段逻辑来响应MouseDrag,你先仔细看看我的回帖
http://topic.csdn.net/u/20091023/15/420d20ce-af7d-461a-9033-f2a4a3323757.html
要是还有什么不明白的地方我有时间再针对你的情况写一下代码
{
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);
}
新的画上,旧的擦去,尽量减少画的范围。还有一种方式 是手动的过程中画一矩形框, 放下时,把图片画上就行了。