65.9K
CodeProject 正在变化。 阅读更多。
Home

2D 绘图插件

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.60/5 (6投票s)

2008年1月7日

CPOL

2分钟阅读

viewsIcon

50359

downloadIcon

2340

在您的窗口上绘制基本图形。

引言

这是一个类库,它实现了一个用户控件,该控件充当插件。该插件封装了基本的绘图功能,并公开了一个接口以获取绘图内容,以二维坐标值的形式呈现。用户只需将此组件从工具箱拖放到任何控件(容器类型)中。 之后,它立即增加了使用鼠标命令绘制基本图形对象的功能。

背景

开发这种插件的想法是为了减少开发人员每次开发需要从用户获取图形绘制输入并对其进行处理的应用程序时所付出的努力。 例如,一个用于计算一些多边形的交点的应用程序,例如圆形、矩形等。 每次编写代码以允许用户绘制对象并在窗口上反映它们都会浪费开发人员的大量时间。 使用此组件使开发人员能够开始使用自己的算法,而无需编写绘图代码。

使用代码

代码可以分为以下几个部分

  1. 注册事件。
  2. 在窗口设备上下文和内存位图中绘制。
  3. 计算每种绘图类型的更新区域。
  4. 使用右键单击修改参数。

1. 注册事件

插件组件注册父控件的事件以用于绘图目的。

this.Parent.MouseDown += new MouseEventHandler(Parent_MouseDown);
this.Parent.MouseMove += new MouseEventHandler(Parent_MouseMove);
this.Parent.MouseUp += new MouseEventHandler(Parent_MouseUp);
this.Parent.Paint += new PaintEventHandler(Parent_Paint);

2. 在窗口设备上下文和内存位图中绘制

void DrawOnMem(Graphics g)
{
    g.SmoothingMode = SmoothingMode.HighQuality;
    Pen pen = new Pen(penColor, penWidth);
    Brush brush = new SolidBrush(Color.FromArgb(127, brushColor));

    if (startPoint != Point.Empty && endPoint != Point.Empty)
    {
        switch (drawType)
        {
            case type.LINE:
                g.DrawLine(pen, startPoint, endPoint);
                break;
            case type.CIRCLE:
                if (Fill.Checked)
                    g.FillEllipse(brush, Rectangle(startPoint, endPoint));
                g.DrawEllipse(pen, Rectangle(startPoint, endPoint));
                break;
            case type.RECT:
                if (Fill.Checked)
                    g.FillRectangle(brush, Rectangle(startPoint, endPoint));
                g.DrawRectangle(pen, Rectangle(startPoint, endPoint));
                break;
            case type.FREEHAND:
                g.DrawLine(pen, startPoint, endPoint);
                break;
            case type.NONE:
                break;
            default:
                break;
        }
    }
    pen.Dispose();
    brush.Dispose();
}

3. 计算每种绘图类型的更新区域

对每种绘图类型计算最佳大小区域是为了停止在绘制对象期间闪烁。 FindEnclosingRect 计算线的直接外部区域。

private Region FindEnclosingRect(Point st,Point en)
{
    double r = Math.Sqrt(Math.Pow((en.Y - st.Y), 2) + Math.Pow((en.X - st.X), 2));
    Rectangle rc = new Rectangle(0, 0, (int)r, 0);
    rc.Inflate((int)penWidth+1, (int)penWidth+1);
    Region rgn = new Region(rc);

    double m = (((double)en.Y - st.Y))/ (en.X - st.X);
    double angle = Math.Atan(m);

    if (en.X < st.X)
        angle += 3.14;
    Matrix mtrx = new Matrix();
    mtrx.Reset();
    mtrx.Rotate((float)(angle*180 * 7 / 22));
    rgn.Transform(mtrx);
    mtrx.Reset();
    mtrx.Translate(st.X, st.Y);
    rgn.Transform(mtrx);

    return rgn; 
}

还有其他一些函数,主要计算矩形、圆形和线的边界区域,而鼠标移动会在窗口设备上下文中绘制这些对象,并且一旦绘图完成,就会将绘图存储在内存设备上下文中。

关注点

如果开发人员想要每个绘图的 2D 坐标,只需取消注释将坐标存储在数组中并在运行时读取的行即可。

历史

没有更新……至 2008/01/07。

© . All rights reserved.