日期:2014-05-19  浏览次数:21286 次

C#异或画图的问题,高手帮忙解决下!!
小弟现在要在一个背景为黑色的form上点击鼠标,并以点击处为中心画一个十字型的图,也就是两条直线交叉,并且改form每隔10秒刷新一次,请问各位高手,怎么才能实现这样的异或画图啊?

------解决方案--------------------
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (isDrawPt & e.Button == MouseButtons.Left) // 画点
{
myPoint.X = e.X;
myPoint.Y = e.Y;
this.Capture = true; // 指示控件是否已俘获鼠标

//画圆
Graphics tempP = Graphics.FromHdc(MyWindowsAPI.GetWindowDC(pictureBox1.Handle));
Rectangle clipRect = new Rectangle(0, 0, ClientSize.Width, ClientSize.Height);
DrawEllipseRectangle(new PaintEventArgs(tempP, clipRect));
tempP.Dispose();

//保存到xml中
SavePointXml(myPoint.X, myPoint.Y, myPointRads);

//添加到内存中,方便最快的读取
pointAlSave.Add(myPoint.X); // 保存到数组中
pointAlSave.Add(myPoint.Y);
pointAlSave.Add(myPointRads);

}
}

这是画圆,画线自己计算一下坐标和半径,刷新我不会。
一定要异或线?
p1 = PointToScreen(startP);
p2 = PointToScreen(lastP);
ControlPaint.DrawReversibleLine(p1, p2, Color.Black);
------解决方案--------------------
GDI+中不能异或画图,还得用GDI的API函数~

此言不差,不过如果是控件上,.net 2.0里已经提供了异或笔绘制方法:
ControlPaint.DrawReversibleLine可以在窗体上异或绘制
------解决方案--------------------
Invalidate就不要用了。
Invalidate是使区域无效,但无效区域是要等到处理WM_PAINT的时候才去绘制的。如果你程序里这样作:
Invalidate();
绘图

这样你绘图完,系统才返回处理消息循环,这个时候你执行了invalidate,又会调用OnPaint,刚绘制的就都刷没了。
------解决方案--------------------
邮件已发送。BTW,我也是刚学习GDI+的,所以代码也存在问题,不过在我的机子运行还正常。
------解决方案--------------------
如果是刷新带来的问题,可以这样
Bitmap bit;
private void DrwaCross(Point p,int length,Color LineColor)
{
Graphics g =Graphics.FormImage(bit);
Pen pen = new Pen(LineColor);
g.DrawLine(pen,p.X-length,p.Y,p.X+length,p.Y);
g.DrawLine(pen,p.X,p.Y-length,p.X,p.Y+length);
pen.Dispose();
g.Dispose();
this.Refesh();
}
private void Form1_Load(object sender, System.EventArgs e )
{
bit = New Bitmap(1024, 768);
Graphics g =Graphics.FormImage(bit);
g.Clear(Color.Black);
g.Dispose();
}
private void Form1_Click(object sender, System.EventArgs e )
{
DrwaCross(this.PointToClient(this.MousePosition),5,Color.Red)
}
protected override void OnPaintBackground(System.Windows.Forms.PaintEventArgs pevent){
pevent.Graphics.DrawImage(bit, 0, 0);
}