DOBON.NETプログラミング道掲示板

■35517 / 5階層)  重なったPictureBox同士を透過する方法
□投稿者/ KOZ 一般人(28回)-(2023/09/09(Sat) 11:50:05)
  • アイコン
    2023/09/09(Sat) 11:50:38 編集(投稿者)
    
    Windows 8 から子ウインドウがレイヤードウインドウになれるので、アプリケーションマニュフェストを追加して
    
          <!-- Windows 8 -->
          <!--<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}" />-->
    
    のコメントアウトを解除すると、簡単に透過できますね。
    
    # GetWindowLong/SetWindowLong を使っているのは手抜きです。(長くなるので)
    # プロセスが 64bit なら GetWindowLongPtr,SetWindowLongPtr を使うのが正式なやり方。
    # 64bit で SetWindowLong を使うと成功しても戻り値がゼロになってしまいます。
    
    Imports System.Runtime.InteropServices
    
    Public Class Form1
    
        Private Const WS_EX_LAYERED = &H80000
        Private Const GWL_EXSTYLE = -20
        Private Enum LWA
            COLORKEY = &H1
            ALPHA = &H2
        End Enum
    
        Private Sub PictureBox_HandleCreated(sender As Object, e As EventArgs) _
                    Handles PictureBox1.HandleCreated,
                            PictureBox2.HandleCreated
            Dim pic = DirectCast(sender, PictureBox)
            pic.Image = My.Resources.megane_hikaru_woman
            pic.SizeMode = PictureBoxSizeMode.Zoom
            pic.BackColor = Color.Gray
            Dim dwStyle = GetWindowLong(pic.Handle, GWL_EXSTYLE)
            dwStyle = dwStyle Or WS_EX_LAYERED
            SetWindowLong(pic.Handle, GWL_EXSTYLE, dwStyle)
            SetLayeredWindowAttributes(
                    pic.Handle, ColorTranslator.ToWin32(pic.BackColor),
                    0, LWA.COLORKEY)
        End Sub
    
        <DllImport("user32.dll")>
        Private Shared Function GetWindowLong(
                    hWnd As IntPtr, nIndex As Integer) As Integer
        End Function
    
        <DllImport("user32.dll")>
        Private Shared Function SetWindowLong(
                    hWnd As IntPtr, nIndex As Integer,
                    dwNewLong As Integer) As Integer
        End Function
    
        <DllImport("user32.dll")>
        Private Shared Function SetLayeredWindowAttributes(
                    hWnd As IntPtr, crKey As Integer,
                    bAlpha As Byte, dwFlags As LWA) As Boolean
        End Function
    
    End Class
    
    透過画像のまわりに BackColor が残ってしまいますが、目立たない色を設定しておくといいです。
    
    
    

解決み!
268×285 => 235×250
イメージ
layeredWindow.jpg
/15KB
違反を報告
削除キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[4]: 重なったPictureBox同士を透過する方法 /KOZ 返信無し
 
上記関連ツリー

Nomalアイコン 重なったPictureBox同士を透過する方法 / 本体は眼鏡 (23/09/05(Tue) 08:53) #35510 1693871617.jpg/9KB
Nomalアイコン Re[1]: 重なったPictureBox同士を透過する方法 / 魔界の仮面弁士 (23/09/05(Tue) 09:52) #35511
│└Nomalアイコン Re[2]: 重なったPictureBox同士を透過する方法 / 本体は眼鏡 (23/09/06(Wed) 08:38) #35514 解決み!
Nomalアイコン Re[1]: 重なったPictureBox同士を透過する方法 / KOZ (23/09/05(Tue) 12:01) #35512
  └Nomalアイコン Re[2]: 重なったPictureBox同士を透過する方法 / KOZ (23/09/05(Tue) 12:10) #35513
    └Nomalアイコン Re[3]: 重なったPictureBox同士を透過する方法 / 本体は眼鏡 (23/09/06(Wed) 08:40) #35515 解決み!
      └Nomalアイコン Re[4]: 重なったPictureBox同士を透過する方法 / KOZ (23/09/06(Wed) 18:19) #35516 解決み!
        └Nomalアイコン 重なったPictureBox同士を透過する方法 / KOZ (23/09/09(Sat) 11:50) #35517 解決み! layeredWindow.jpg/15KB ←Now

All 上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信

Mode/  Pass/


- Child Tree -