Компьютерная графика, мультимедиа и игры на Visual C#

       

Рисование сложных линий и печать всей формы как снимка экрана


Листинг 6.1. Код для рисования прямоугольника.

private void Form1_Paint(object sender, PaintEventArgs e)

{

    //Задаем цвет и толщину пера:

    Pen myPen1 = new Pen(Color.Black, 3);

    //Объявляем объект myRectangle и создаем экземпляр этого объекта:

    Rectangle myRectangle = new Rectangle(10, 15, 150, 200);

    //Рисуем фигуру:

    e.Graphics.DrawRectangle(myPen1, myRectangle);

    //Высвобождаем память, выделенную объекту myPen1:

    myPen1.Dispose();

}

Листинг 6.2. Код для рисования кривых линий.

private void Form1_Paint(object sender, PaintEventArgs e)

{

      //Задаем цвет и толщину перьев:

      Pen myPen1 = new Pen(Color.Black, 3);

      Pen myPen2 = new Pen(Color.Black, 1);

      //Объявляем объекты и создаем экземпляры этих объектов:

      Point myPoint1 = new Point(50, 50);

      Point myPoint2 = new Point(100, 25);

      Point myPoint3 = new Point(200, 5);

      Point myPoint4 = new Point(275, 50);

      Point myPoint5 = new Point(300, 150);

      Point myPoint6 = new Point(350, 200);

      Point myPoint7 = new Point(250, 250);

      Point[] myCurvePoints =

      {

      myPoint1,

      myPoint2,

      myPoint3,

      myPoint4,

      myPoint5,

      myPoint6,

      myPoint7

      };

      //Рисуем линии:

      e.Graphics.DrawLines(myPen1, myCurvePoints);

      e.Graphics.DrawClosedCurve(myPen2, myCurvePoints);

      //Высвобождаем память от перьев myPen1, myPen2:

      myPen1.Dispose();

      myPen2.Dispose();

}

Листинг 6.3. Метод для фотографирования клиентской области формы.

[System.Runtime.InteropServices.DllImport("gdi32.dll")]

public static extern long BitBlt(IntPtr hdcDest,

int nXDest, int nYDest, int nWidth, int nHeight,

IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);

private Bitmap myMemoryImage;

private void myCaptureScreen()

{

      Graphics myGraphics = this.CreateGraphics();

      Size s = this.Size;

      myMemoryImage = new Bitmap(s.Width, s.Height,

                                                 myGraphics);


      Graphics myMemoryGraphics =
      Graphics.FromImage(myMemoryImage);
      IntPtr dc0 = myGraphics.GetHdc();
      IntPtr dc1 = myMemoryGraphics.GetHdc();
      BitBlt(dc1, 0, 0, this.ClientRectangle.Width,
            this.ClientRectangle.Height,
            dc0, 0, 0, 13369376);
            myGraphics.ReleaseHdc(dc0);
            myMemoryGraphics.ReleaseHdc(dc1);
}
Листинг 6.4. Код для рисования изображения.
private void printDocument1_PrintPage(object sender,
      System.Drawing.Printing.PrintPageEventArgs e)
{
      e.Graphics.DrawImage(myMemoryImage, 0, 0);
}
Теперь дважды щелкаем по кнопке Print (рис. 6.1) в режиме проектирования. Открывается файл Form1.cs с шаблоном, в который записываем сначала одну строку для вызова приведенного выше метода:
   myCaptureScreen();
а затем записываем код для кнопки из приведенного выше параграфа “Методика печати изображения на принтере”.
Листинг 6.5. Метод для фотографирования элемента управления PictureBox.
[System.Runtime.InteropServices.DllImport("gdi32.dll")]
public static extern long BitBlt(IntPtr hdcDest,
int nXDest, int nYDest, int nWidth, int nHeight,
IntPtr hdcSrc, int nXSrc, int nYSrc, int dwRop);
private Bitmap myMemoryImage;
private void myCaptureScreen()
{
      Graphics myGraphics = pictureBox1.CreateGraphics();
      myMemoryImage = new Bitmap(
            pictureBox1.Width,
            pictureBox1.Height, myGraphics);
      Graphics myMemoryGraphics =
            Graphics.FromImage(myMemoryImage);
      IntPtr dc0 = myGraphics.GetHdc();
      IntPtr dc1 = myMemoryGraphics.GetHdc();
      BitBlt(dc1, 0, 0, pictureBox1.ClientRectangle.Width,
            pictureBox1.ClientRectangle.Height,
            dc0, 0, 0, 13369376);
      myGraphics.ReleaseHdc(dc0);
      myMemoryGraphics.ReleaseHdc(dc1);
}

Содержание раздела