Как я могу скопировать изображение, нарисованное на PictureBox, в буфер обмена? - PullRequest
0 голосов
/ 01 июля 2018

У меня есть программное обеспечение, которое создает трехмерный текст с использованием grafx.DrawString(), и мне нужно скопировать этот рисунок в буфер обмена. Когда я пытаюсь это сделать, выдается исключение NullReferenceException.

Как я могу скопировать графику, нарисованную на PictureBox?

Это код для рисования текста:

Dim grafx As Graphics
Private Sub draw_block_text10()
    Dim text_size As SizeF
    Dim back_brush As Brush = Brushes.Black 'COLOR FOR THE BOARDER TEXT
    Dim fore_brush As Brush = Brushes.Blue 'COLOR FOR THE MAIN TEXT


    Dim fnt As New Font("Microsoft Sans Serif", NumericUpDown1.Value, FontStyle.Regular)
    Dim location_x, location_y As Single 'USED IT FOR THE LOCATION
    Dim i As Integer

    'CREATE A GRAPHIC OBJECT IN THE PICTUREBOX.
    grafx = Me.PictureBox2.CreateGraphics()
    'CLEAR THE PICTUREBOX
    grafx.Clear(Color.White)

    'LOOK THE REQUIRED SIZE TO DRAW THE TEXT
    text_size = grafx.MeasureString(Me.TextBox1.Text, fnt)

    'ELIMINATE THE REDUNDANT CAlCULATION AFTER GETTING THE LOCATION.
    location_x = (Me.PictureBox2.Width - text_size.Width) / 2
    location_y = (Me.PictureBox2.Height - text_size.Height) / 2

    'FIRST, DRAW THE BLACK BACKGROUND TO GET THE EFFECT,
    'AND THE TEXT MUST BE DRAWN REAPETEDLY FROM THE OFFSET RIGHT, UP TO THE MAIN TEXT IS DRAWN.
    For i = CInt(nupDepth.Value) To 0 Step -1
        grafx.DrawString(TextBox1.Text, fnt, back_brush, _
        location_x - i, location_y + i)
    Next
    Dim mydataandtimeforsave = DateTime.Now.ToString("yyyyMMddHHmmss")
    'DRAW THE ROYAL BLUE FOR THE MAIN TEXT OVER THE BLACk TEXT
    grafx.DrawString(TextBox1.Text, fnt, fore_brush, location_x, location_y)
    Dim bmp As New Bitmap(Me.PictureBox2.Width, Me.PictureBox2.Height)
    Dim g As Graphics = Graphics.FromImage(bmp)
    g.Clear(Color.Transparent)

    ''Perform Drawing here

End Sub

Это код для копирования в буфер обмена:

Clipboard.SetDataObject( _
    DirectCast(PictureBox2.Image.Clone, Bitmap), _
    True)
    Beep()

1 Ответ

0 голосов
/ 01 июля 2018

Использование объекта Graphics, созданного из элемента управления PictureBox (PictureBox.CreateGraphics()) для рисования, фактически не устанавливает / не изменяет свойство Image объекта PictureBox. Вы можете подтвердить это, проверив PictureBox2.Image Is Nothing, который вернет истину , если в PictureBox не было изображения до его рисования .

Вместо этого создайте Image с размерами PictureBox, используйте Graphics.FromImage() для создания объекта Graphics, нарисуйте то, что вам нужно нарисовать, а затем назначьте изображение свойству PictureBox.Image.

Что-то вроде этого должно работать нормально:

Dim bmp As New Bitmap(PictureBox2.Width, PictureBox2.Height)
Using g As Graphics = Graphics.FromImage(bmp)
    g.Clear(Color.White)

    text_size = g.MeasureString(Me.TextBox1.Text, fnt)

    location_x = (Me.PictureBox2.Width - text_size.Width) / 2
    location_y = (Me.PictureBox2.Height - text_size.Height) / 2

    For i = CInt(nupDepth.Value) To 0 Step -1
        g.DrawString(TextBox1.Text, fnt, back_brush, location_x - i, location_y + i)
    Next

    g.DrawString(TextBox1.Text, fnt, fore_brush, location_x, location_y)
End Using

PictureBox2.Image = bmp

Примечание: всегда не забывайте утилизировать созданный объект Graphics, когда заканчиваете использовать его, вызывая .Dispose() или заключая его в Using выражение , как я это делал выше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...