如何在c ++ Windows窗体中编写Visual Studio 2012中的绘图面板?

时间:2014-10-31 18:52:55

标签: c++ visual-studio-2012

我需要用c ++编写学校项目的绘图面板(不,我不想用c#编写代码)。有谁知道这在Visual Studio 2012中是如何工作的?

1 个答案:

答案 0 :(得分:3)

首先,请考虑这是一个例外。虽然在这里寻求有关作业和家庭作业相关内容的帮助是完全没问题的(只要一定要提一下),但你应该尝试展示一些已经完成的代码或工作。不要只是说“我需要一些代码,谢谢。”因为这不是这个网站的工作方式。

请不要只复制并粘贴此代码。首先要了解它,然后使用它或将您学到的知识应用到您自己的代码中。

回到实际问题:有多种方法可以解决这个问题,但基本概念总是一样的(即使你试图创建一些矢量绘图程序)。以下行为了便于阅读而省略了类和名称空间。如果你保留标准的using指令,这对你来说应该不是问题(大多数情况都在System.Drawing)。请注意,我将直接在表单中实现所有内容。你也可以为此创建一个自定义用户控件(这可能是更好/更清洁的方法)。

首先,您需要一些控制来实际显示您的绘图。使用标准控件PictureBox对此非常好。 接下来,你需要一些图像来实际绘制。将私有Bitmap成员添加到您的用户表单中。 在这个例子中,我们将使用鼠标光标绘制一条线。始终在光标的上一个位置和当前位置之间绘制一条线。因此,我们必须将先前的位置存储在Point中。 鉴于前两点,您需要在表单(或用户控件)中的某个位置使用以下两个成员:

private Bitmap bitmap;
private Point oldPosition;

在您的表单的Load事件中,您必须创建Bitmap对象。我还使用GraphicsBitmap清除为白色,然后使用PictureBox显示它:

private void Form1_Load(object sender, EventArgs e)
{
    bitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height);
    using (Graphics g = Graphics.FromImage(bitmap))
        g.Clear(Color.White);
    pictureBox1.Image = bitmap;
}

接下来,只要用户点击PictureBox中的某个位置,我们就必须重置上一个光标位置。为此我向它添加了一个非常简单的MouseDown事件:

private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
    oldPosition = e.Location;
}

最后但并非最不重要的是,实际绘图发生在MouseMove事件中。为了使其正常工作,您必须执行一项检查和三个工作步骤:

  • 确定用户是否确实要绘制(按下鼠标左键?)。
  • 将线条绘制到位图中。
  • 将上一个光标位置更新为新位置。
  • 显示结果。

此代码可能如下所示:

private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
    {
        using (Graphics g = Graphics.FromImage(bitmap))
            g.DrawLine(Pens.Black, oldPosition, e.Location);
        oldPosition = e.Location;
        pictureBox1.Image = bitmap;
    }
}

如果一切正常,您应该可以在PictureBox上免费绘制:

Example form screenshot