►index

     スポンサーサイト

    --------

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

     VB.NET 重ねるPictureBoxコントロール 背景を透過にする(その1)

    2013-05-28

    重なるPictureコントロールの背景を透過にするにするのは、.NETでは普通にできません。
    なぜなら、標準では、透明部分はコントロールの親コントロールを表示してしまうからです。

    っということで、重なったPictureコントロールの背景に背面コントロールが見える状態にするPictureBoxの拡張クラスを作成しました。参考にして下さい。

    【注意】OnPaintBackgroundイベントを利用するクラスなので、自動描画してくれて便利ですが、多くの画像を重ねるとすごく処理が重くなります。っということで、手動で描画する方法を(その2)でご紹介します。


    完成形↓

    image

     

    これは、次の拡張PictureBoxを重ねて表示しています。

    image


    《実現方法》
    下図(A)の部分(コントロール1)をキャプチャーして、下図(B)の赤点線領域(コントロール2のBackgroundImage)に描画すると実現できます。

    image

     

     

    【拡張PictureBoxの使用例】

    前提条件:フォーム上にPanel(Panel1)を配置し、Panel上に拡張PictureBoxを配置する。

     

    Public Class Form

     

        Private Sub MDIParent1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

            拡張PictureBoxの親にパネルを指定する。

            Me.PictureBoxEx2_1.Parent = Panel1

            Me.PictureBoxEx2_2.Parent = Panel1

            Me.PictureBoxEx2_3.Parent = Panel1

        End Sub

     

    End Class



    ''' <summary>

    ''' 重ね透過対応 拡張PictureBox

    ''' </summary>

    ''' <remarks></remarks>

    Public Class PictureBoxEx2

        Inherits PictureBox

        Sub New()

            MyBase.New()

            Me.BackColor = Color.Transparent

        End Sub

     

        ''' <summary>

        ''' BackgroundImage描画

        ''' </summary>

        ''' <param name="pevent"></param>

        ''' <remarks></remarks>

        Protected Overrides Sub OnPaintBackground( _

            ByVal pevent As System.Windows.Forms.PaintEventArgs)

            MyBase.OnPaintBackground(pevent)

     

            ' 親コントロールとの間のコントロールを親側から描画

            For i As Integer = Me.Parent.Controls.Count - 1 To 0 Step -1

                Dim c As Control = Me.Parent.Controls(i)

                If c Is Me Then

                    Exit For

                End If

                If Not TypeOf (c) Is PictureBoxEx2 Then

                    Continue For

                End If

                If Me.Bounds.IntersectsWith(c.Bounds) = False Then

                    Continue For

                End If

     

                Me.DrawBackControl(c, pevent)

            Next

        End Sub

     

        ''' <summary>

        ''' 自コントロールのBackgroundImageに背面側のコントロール(重なり部分)を描画

        ''' </summary>

        ''' <param name="c"></param>

        ''' <param name="pevent"></param>

        ''' <remarks></remarks>

        Private Sub DrawBackControl(ByVal c As Control, ByVal pevent As PaintEventArgs)

            Using bmp As New Bitmap(c.Width, c.Height, Imaging.PixelFormat.Format32bppArgb)

                '背面側コントロール全体をキャプチャーし、bmp変数に収録

                c.DrawToBitmap(bmp, New Rectangle(0, 0, c.Width, c.Height))

     

                Dim offsetX As Integer = c.Left - Me.Left

                Dim offsetY As Integer = c.Top - Me.Top

     

                '自コントロールのBackgroundImageにキャブチャー画像を描画。

                '(本来は重なり部分のみを描画すれば良いがoffsetXにマイナス値も指定可能な為、

                'キャプチャー画像全体を描画して、処理を簡略化している。)

                pevent.Graphics.DrawImage(bmp, offsetX, offsetY, c.Width, c.Height)

            End Using

        End Sub

     

    End Class

     

     

    VB.NET 重なるPictureBoxコントロールの背景を透過にする(その2)へつづく


    【参考URL】http://youryella.wankuma.com/Library/Extensions/Control/Transparent.aspx
    上記URLのサンプルを参考にして微調整し作成しております。


    トラックバック

    コメントの投稿

    非公開コメント

    PR
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。