Выполните Paint поверх нескольких элементов управления

У меня короткая проблема. Как я могу нарисовать такое изображение поверх любого controls, например textbox и т. д.

Это мой код:

Private Sub GroupBox6_Paint(sender As Object, e As PaintEventArgs) Handles GroupBox6.Paint
    If txtStatus.Text = "Cancelled" Then
        Try
            Dim newImage As Image = Image.FromFile(FOLDER_PATH & "\completed.png")
            Dim x As Single = ((GroupBox6.Width / 2) - (463 / 4))
            Dim y As Single = 10
            Dim width As Single = 463 / 2
            Dim height As Single = 242 / 2
            e.Graphics.DrawImage(newImage, x, y, width, height)
        Catch ex As Exception
        End Try
     End If
End Sub

И это мой вывод:

введите здесь описание изображения

поэтому моя цель - нарисовать изображение Completed поверх textbox, label внутри моего groupbox есть идеи?


person Muj    schedule 07.12.2016    source источник
comment
Вы хотите показать изображение как наложение, когда пользователь завершил процесс, и скрыть основные элементы управления? Я думаю, что проще использовать элемент управления PictureBox, который отображается вместо группового поля, когда статус «Отменено», вместо того, чтобы рисовать изображение в групповом поле.   -  person Markus    schedule 07.12.2016
comment
@Markus, если я использую окно изображения, оно не прозрачно, поэтому я рисую изображение на элементе управления, который будет его удерживать. но в моем случае txtbox и label закрывают изображение. я просто хочу нарисовать его и, возможно, отправить перед групповым ящиком и другим элементом управления внутри группового ящика.   -  person Muj    schedule 07.12.2016
comment
Есть два решения, которые я могу придумать. 1. Создайте многослойное окно и покажите его поверх элементов управления. 2. Сделайте снимок экрана той части, в которой появится изображение, и нарисуйте его в picbox, а затем нарисуйте изображение png   -  person γηράσκω δ' αεί πο    schedule 10.12.2016
comment
@γηράσκωδ'αείπολλάδιδασκόμε хм. Можете ли вы дать мне пример кода или идею о том, как это сделать. Я думаю, что шаг 2 будет работать.   -  person Muj    schedule 10.12.2016
comment
Вы должны быть в состоянии заставить его работать с изображением с прозрачным PNG и некоторыми настройками. Другие методы, которые рисуют прямо на экране, весьма несовершенны, потому что вы не являетесь владельцем экрана. Проверьте это: stackoverflow.com/questions/4144371/a-picturebox-problem трудно помочь больше w /oa воспроизводящий код.   -  person Simon Mourier    schedule 10.12.2016
comment
@SimonMourier Другие методы, которые рисуют на экране напрямую... где вы видели такой метод?   -  person γηράσκω δ' αεί πο    schedule 11.12.2016


Ответы (1)


Вам нужно два bitmaps и picturebox, чтобы это работало. Первое — это изображение png, а второе — изображение picturebox:

Private pngImage, picBoxImage As Image

В событии загрузки формы инициализируйте два изображения:

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    pngImage = Image.FromFile(FOLDER_PATH & "\completed.png") //load it once
    picBoxImage = CType(pngImage.Clone, Image)

    PictureBox1.Size = New Size(CInt(463 / 2), CInt(242 / 2))
    PictureBox1.Parent = GroupBox6
    PictureBox1.Image = picBoxImage
    PictureBox1.Visible = False //you dont want it at the beggining
End Sub

sub для отображения изображения:

Private Sub ShowCompletedMessage()
    Dim screenLocation As Point
    Dim gr As Graphics
    //you can pass these values as parameters in the sub if you want to make the code more generic
    Dim x As Integer = CInt(((GroupBox6.Width / 2) - (463 / 4)))
    Dim y As Integer = 10
    Dim width As Integer = CInt(463 / 2)
    Dim height As Integer = CInt(242 / 2)

    //Ensure that picturebox is not visible. If it is you don't need to take a screenshot
    If PictureBox1.Visible = True Then
        Return
    End If

    gr = Graphics.FromImage(picBoxImage)

    //you need to transform the coordinates to screen ones
    screenLocation = GroupBox6.PointToScreen(New Point(x, y))

    //draw the portion of the screen to your bitmap
    gr.CopyFromScreen(screenLocation.X, screenLocation.Y, 0, 0, New Size(width, height), CopyPixelOperation.SourceCopy)

    //draw the png image on top
    gr.DrawImage(pngImage, 0, 0, width, height)

    PictureBox1.Location = New Point(x, y)
    PictureBox1.BringToFront()
    PictureBox1.Visible = True

    gr.Dispose()
    gr = Nothing


    Return

End Sub

Каждый раз, когда вы хотите показать сообщение, вызовите вышеуказанную подпрограмму. Вы сами решаете откуда и когда. Вам нужно скрыть picturebox, если он вам больше не нужен

PictureBox1.Visible = False
person γηράσκω δ' αεί πο    schedule 10.12.2016
comment
где я должен разместить этот код в моей форме? внутри события рисования группового ящика? так что я могу попробовать и увидеть результат - person Muj; 13.12.2016
comment
@Muj Меняются ли ширина, высота и позиция изображения png? Конечно, позиция будет относительно GroupBox6. - person γηράσκω δ' αεί πο; 13.12.2016
comment
да, но куда мне вставить этот код, чтобы система его выполнила? в groupbox6 paint event? или еще где? - person Muj; 13.12.2016