您的位置:首页 > 其它

DrawingVisual和DrawingContext的简单应用(在Image上画图)

2013-06-13 10:57 489 查看
1.新建一个继承Image的基类,因为要在Image对象上画图,所以下面的代码必须放入基类中,如果放在加载图片的主窗体上,背景会变成黑色。

protected override Visual GetVisualChild(int index)
{
return visuals[index];
}
protected override int VisualChildrenCount
{
get
{
return visuals.Count;
}
}


下面是新建的基类代码

/// <summary>
/// DrawingImage.xaml 的交互逻辑
/// </summary>
public partial class DrawingImage : Window
{
private DrawingImages img_ = new DrawingImages();
public DrawingImage()
{
InitializeComponent();
this.Content = img_;
img_.Stretch = Stretch.Fill;
img_.MouseLeftButtonDown += new MouseButtonEventHandler(img__MouseLeftButtonDown);
img_.MouseMove += new MouseEventHandler(img__MouseMove);
img_.MouseLeftButtonUp += new MouseButtonEventHandler(img__MouseLeftButtonUp);
img_.MouseDown += new MouseButtonEventHandler(img__MouseDown);
InitDrawImage();

}

void img__MouseDown(object sender, MouseButtonEventArgs e)
{
if (e.ChangedButton==MouseButton.Right)
img_.DeleteVisualAll();
}

private void InitDrawImage()
{
int X = (int)this.Width;
int Y = (int)this.Height;
DrawingVisual dv = new DrawingVisual();
using (DrawingContext dc = dv.RenderOpen())
{
Rect rect = new Rect(new Point(0, 0), new Size(X, Y));
Brush bc = new SolidColorBrush(Colors.LightBlue);
Pen pen = new Pen(Brushes.Pink, 1);
dc.DrawRectangle(bc, pen, rect);
dc.DrawText(new FormattedText("LightBlue", CultureInfo.CurrentCulture, FlowDirection.LeftToRight, new Typeface("微软雅黑"), (int)Y / 32, Brushes.White), new Point((int)X / 25, (int)Y / 21));
}
var rtbitmap = new RenderTargetBitmap(X, Y, 0.0, 0.0, PixelFormats.Default);
rtbitmap.Render(dv);
img_.Source = rtbitmap;
}

private Point? _startPoint;
private DrawingVisual selectionSquare;
void img__MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
_startPoint = e.GetPosition(this.img_);
selectionSquare = new DrawingVisual();
this.img_.AddVisual(selectionSquare);
this.img_.CaptureMouse();

}

private Brush selectionSquareBrush = Brushes.Transparent;
private Pen selectionSquarePen = new Pen(Brushes.LightPink, 2);
private void DrawSelectionSquare(Point point1, Point point2)
{
if (selectionSquare == null)
return;
using (DrawingContext dc = selectionSquare.RenderOpen())
{
dc.DrawRectangle(selectionSquareBrush, selectionSquarePen,
new Rect(point1, point2));
}
}

void img__MouseMove(object sender, MouseEventArgs e)
{
if (_startPoint == null)
return;
Point endPoint = e.GetPosition(this.img_);
DrawSelectionSquare((Point)_startPoint, endPoint);

}

void img__MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
this.img_.ReleaseMouseCapture();
_startPoint = null;
}

}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: