Member 10628309 Ответов: 1

Как отобразить на одной из двух моих форм выбранную область?


У меня есть небольшая программа, которая выбирает часть экрана и сохраняет ее в файл jpg или PDF, выбирая местоположение и размер Form2 со свойствами BorderStyle None, BackColor Aqua, Opacity 60%, WindowsState Normal и TopMost False. Он использует MouseDown, MouseMove и MouseUp в Form1 для выбора области из любого места на экране, поскольку свойство Form1 WindowsState имеет значение Maximized, BorderStyle-None, непрозрачность-2%, курсор-Cross и TopMost-True.

Программа отлично справляется с сохранением выделенной области либо в jpg-файл, либо в PDF-файл. Что я не могу сделать, так это отобразить выбранную область на экране после выбора, но перед сохранением в файл jpg или PDF. Я пробовал много вещей, но ничего не работает.

Вот код из интересующей области:

Private Sub Form1_MouseDown(sender As Object, e As MouseEventArgs) Handles Me.MouseDown
        Form2.Show()
        Form2.Location = Cursor.Position 'This is the starting X Y position
    End Sub

    Private Sub Form1_MouseMove(sender As Object, e As MouseEventArgs) Handles Me.MouseMove
        Form2.Size = Cursor.Position - Form2.Location 'This is the size, width & height, (X2-X1 & Y2-Y1)
    End Sub

    Private Sub Form1_MouseUp(sender As Object, e As MouseEventArgs) Handles Me.MouseUp
        Form2.Hide()
        Me.Hide()
        Dim screenshot = New System.Drawing.Bitmap(Form2.Width, Form2.Height)
        Dim graph As Graphics = Graphics.FromImage(screenshot)
        graph.CopyFromScreen(Form2.Bounds.X, Form2.Bounds.Y, 0, 0, Form2.Size)
        Form2.BackgroundImage = screenshot

        'Need code here to display the selected area before saving as jpg or PDF
        
        Threading.Thread.Sleep(2000)

        If MessageBox.Show("Save as JPG?", "File Type", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = _
                Windows.Forms.DialogResult.Yes Then
            Dim sPath As New SaveFileDialog
            sPath.Filter = "Image(*.jpg)|*,*"
            sPath.ShowDialog()
            Dim bmp As Bitmap = Form2.BackgroundImage
            bmp.Save(sPath.FileName + ".jpg")
        Else
            MessageBox.Show("You are saving as a PDF file")


Что я уже пробовал:


graph.DrawImage(Form2.BackgroundImage, 20, 30)

		    
                    

1 Ответов

Рейтинг:
2

OriginalGriff

Пара вещей:
Во-первых, графические контексты-это ограниченные ресурсы: когда вы их создаете, вы отвечаете за вызов Dispose, когда закончите с ними. Если вы этого не сделаете, вся система довольно быстро перестанет работать, так как она полагается на них, чтобы делать все, что связано с рисованием на экране. Самый простой способ-создать его в пределах Блок using[^] который избавится от контекта, когда он выйдет из сферы действия.
Во-вторых, как только вы нарисовали нужный вам участок в растровом изображении, вы можете делать с ним все, что захотите. Добавить элемент управления PictureBox на форму form1, и показать его там:

graph.CopyFromScreen(Form2.Bounds.X, Form2.Bounds.Y, 0, 0, Form2.Size)
MyPictureBox.Image = screenshot


Member 10628309

Спасибо за Ваш быстрый ответ...Я должен был поблагодарить тебя раньше. Что касается вашего комментария о dispose, то у меня есть такой код, но я его не показывал...Я не включил последние несколько строк кода, потому что не верил, что это имеет отношение к вопросу.

То, что я хотел бы сделать, это нарисовать прямоугольник вокруг выбранной области вместо того, чтобы показывать всю выбранную область в цвете aqua, как это происходит сейчас. Если у вас есть предложение относительно рисования прямоугольника, я был бы очень заинтересован. Мои учебники описывают рисование прямоугольника без использования PaintEventArgs, но вместо этого с использованием графики. Я не совсем понимаю.

Спасибо снова