画像透過転送 <TOP>
画像を透過転送します。
BitBlt ビットブロック転送
CreateBitmap 指定された幅・高さ・色形式を持つビットマップを作成
SetBkColor デバイスコンテキストの背景色を設定
SelectObject 指定されたデバイスコンテキストのオブジェクトを選択
CreateCompatibleBitmap デバイスコンテキストと互換性のあるビットマップを作成
CreateCompatibleDC 指定されたデバイスコンテキストに関連するデバイスと互換性のあるメモリデバイスコンテキストを作成
DeleteObject 指定されたデバイスコンテキストを削除
GetDC
デバイスコンテキストのハンドルを取得
ReleaseDC デバイスコンテキストを解放
'================================================================ '= 画像透過転送 '= (TransparentBlt2.bas) '================================================================ #include "Windows.bi" Type RECT Left As Long Top As Long Right As Long Bottom As Long End Type ' ビットブロック転送を行う。コピー元からコピー先のデバイスコンテキストへ、指定された長方形内の各ピクセルの色データをコピー Declare Function Api_BitBlt& Lib "gdi32" Alias "BitBlt" (ByVal hDestDC&, ByVal X&, ByVal Y&, ByVal nWidth&, ByVal nHeight&, ByVal hSrcDC&, ByVal xSrc&, ByVal ySrc&, ByVal dwRop&) ' 指定された幅・高さ・色形式を持つビットマップを作成 Declare Function Api_CreateBitmap& Lib "gdi32" Alias "CreateBitmap" (ByVal nWidth&, ByVal nHeight&, ByVal nPlanes&, ByVal nBitCount&, lpBits As Any) ' デバイスコンテキストの背景色を設定 Declare Function Api_SetBkColor& Lib "gdi32" Alias "SetBkColor" (ByVal hDC&, ByVal crColor&) ' 指定されたデバイスコンテキストのオブジェクトを選択 Declare Function Api_SelectObject& Lib "gdi32" Alias "SelectObject" (ByVal hDC&, ByVal hObject&) ' デバイスコンテキストと互換性のあるビットマップを作成 Declare Function Api_CreateCompatibleBitmap& Lib "gdi32" Alias "CreateCompatibleBitmap" (ByVal hDC&, ByVal nWidth&, ByVal nHeight&) ' 指定されたデバイスコンテキストに関連するデバイスと互換性のあるメモリデバイスコンテキストを作成 Declare Function Api_CreateCompatibleDC& Lib "gdi32" Alias "CreateCompatibleDC" (ByVal hDC&) ' 指定されたデバイスコンテキストを削除 Declare Function Api_DeleteDC& Lib "gdi32" Alias "DeleteDC" (ByVal hDC&) ' ペン、ブラシ、フォント、ビットマップ、リージョン、パレットのいずれかの論理オブジェクトを削除し、そのオブジェクトに関連付けられていたすべてのシステムリソースを解放。オブジェクトを削除した後は、指定されたハンドルは無効になる Declare Function Api_DeleteObject& Lib "gdi32" Alias "DeleteObject" (ByVal hObject&) ' 指定されたウィンドウのクライアント領域または画面全体を表すディスプレイデバイスコンテキストのハンドルを取得 Declare Function Api_GetDC& Lib "user32" Alias "GetDC" (ByVal hWnd&) ' デバイスコンテキストを解放 Declare Function Api_ReleaseDC& Lib "user32" Alias "ReleaseDC" (ByVal hWnd&, ByVal hDC&) #define SRCAND &H8800C6 '転送先の画像とAND演算して転送 #define SRCCOPY &HCC0020 'そのまま転送 #define SRCERASE &H440328 '転送先ビットマップを反転、その結果と転送元ビットマップを論理AND演算子で結合 #define SRCINVERT &H660046 '転送先の画像とXOR演算して転送 #define SRCPAINT &HEE0086 '転送先の画像とOR演算して転送 #define NOTSRCCOPY &H330008 '転送元の色データが全反転 #define NOTSRCERASE &H1100A6 'コピー元の色と、コピー先の色を論理OR演算子で結合し、さらに反転 #define MERGECOPY &HC000CA 'コピー元の色と、コピー先の色を論理AND演算子で結合 #define MERGEPAINT &HBB0226 '反転した転送元ビットマップとパターンビットマップを論理OR演算子で結合 #define vbWhite &HFFFFFF '白のカラーコード #define vbBlack &H000000 '黒のカラーコード Var shared Picture1 As Object Var shared Radio(3) As Object Var Shared Button1 As Object Var shared Bitmap As Object Picture1.Attach GetDlgItem("Picture1") For i = 0 To 3 Radio(i).Attach GetDlgItem("Radio" & Trim$(Str$(i + 1))) : Radio(i).SetFontSize 14 Next i Button1.Attach GetDlgItem("Button1") : Button1.SetFontSize 14 BitmapObject Bitmap '================================================================ '= '================================================================ Declare Sub TransparentBlt(OutDstDC As Long, DstDC As Long, SrcDC As Long, SrcRect As RECT, DstX As Integer, DstY As Integer, TransColor As Long) Sub TransparentBlt(OutDstDC As Long, DstDC As Long, SrcDC As Long, SrcRect As RECT, DstX As Integer, DstY As Integer, TransColor As Long) Var W As Integer Var H As Integer Var MonoMaskDC As Long Var hMonoMask As Long Var MonoInvDC As Long Var hMonoInv As Long Var ResultDstDC As Long Var hResultDst As Long Var ResultSrcDC As Long Var hResultSrc As Long Var hPrevMask As Long Var hPrevInv As Long Var hPrevSrc As Long Var hPrevDst As Long Var OldBC As Long Var Ret As Long W = SrcRect.Right - SrcRect.Left + 1 H = SrcRect.Bottom - SrcRect.Top + 1 'モノクロマスクおよびインバートマスクの作成 MonoMaskDC = Api_CreateCompatibleDC(DstDC) MonoInvDC = Api_CreateCompatibleDC(DstDC) hMonoMask = Api_CreateBitmap(W, H, 1, 1, ByVal 0) hMonoInv = Api_CreateBitmap(W, H, 1, 1, ByVal 0) hPrevMask = Api_SelectObject(MonoMaskDC, hMonoMask) hPrevInv = Api_SelectObject(MonoInvDC, hMonoInv) 'デバイスコンテキストとビットマップの作成 ResultDstDC = Api_CreateCompatibleDC(DstDC) ResultSrcDC = Api_CreateCompatibleDC(DstDC) hResultDst = Api_CreateCompatibleBitmap(DstDC, W, H) hResultSrc = Api_CreateCompatibleBitmap(DstDC, W, H) hPrevDst = Api_SelectObject(ResultDstDC, hResultDst) hPrevSrc = Api_SelectObject(ResultSrcDC, hResultSrc) 'モノクロマスクのコピー OldBC = Api_SetBkColor(SrcDC, TransColor) nRet = Api_BitBlt(MonoMaskDC, 0, 0, W, H, SrcDC, SrcRect.Left, SrcRect.Top, SRCCOPY) TransColor = Api_SetBkColor(SrcDC, OldBC) 'マスクのインバース作成 Ret = Api_BitBlt(MonoInvDC, 0, 0, W, H, MonoMaskDC, 0, 0, NOTSRCCOPY) 'バックグラウンドの作成 Ret = Api_BitBlt(ResultDstDC, 0, 0, W, H, DstDC, DstX, DstY, SRCCOPY) 'モノクロマスクとのAND演算 Ret = Api_BitBlt(ResultDstDC, 0, 0, W, H, MonoMaskDC, 0, 0, SRCAND) 'オーバーラップの作成 Ret = Api_BitBlt(ResultSrcDC, 0, 0, W, H, SrcDC, SrcRect.Left, SrcRect.Top, SRCCOPY) 'インバースモノクロマスクとのAND演算 Ret = Api_BitBlt(ResultSrcDC, 0, 0, W, H, MonoInvDC, 0, 0, SRCAND) '二つのXOR演算 Ret = Api_BitBlt(ResultDstDC, 0, 0, W, H, ResultSrcDC, 0, 0, SRCINVERT) '出力 Ret = Api_BitBlt(OutDstDC, DstX, DstY, W, H, ResultDstDC, 0, 0, SRCCOPY) 'クリーンアップ hMonoMask = Api_SelectObject(MonoMaskDC, hPrevMask) Ret = Api_DeleteObject(hMonoMask) hMonoInv = Api_SelectObject(MonoInvDC, hPrevInv) Ret = Api_DeleteObject(hMonoInv) hResultDst = Api_SelectObject(ResultDstDC, hPrevDst) Ret = Api_DeleteObject(hResultDst) hResultSrc = Api_SelectObject(ResultSrcDC, hPrevSrc) Ret = Api_DeleteObject(hResultSrc) Ret = Api_DeleteDC(MonoMaskDC) Ret = Api_DeleteDC(MonoInvDC) Ret = Api_DeleteDC(ResultDstDC) Ret = Api_DeleteDC(ResultSrcDC) End Sub '================================================================ '= '================================================================ Declare Sub Radio1_on edecl () Sub Radio1_on() Bitmap.LoadFile "Bike1.bmp" Picture1.DrawBitmap Bitmap, 0, 0 Bitmap.DeleteObject Cls End Sub '================================================================ '= '================================================================ Declare Sub Radio2_on edecl () Sub Radio2_on() Bitmap.LoadFile "Bike5.bmp" Picture1.DrawBitmap Bitmap, 0, 0 Bitmap.DeleteObject Cls End Sub '================================================================ '= '================================================================ Declare Sub Radio3_on edecl () Sub Radio3_on() Cls End Sub '================================================================ '= '================================================================ Declare Sub Radio4_on edecl () Sub Radio4_on() Cls End Sub '================================================================ '= '================================================================ Declare Sub MainForm_Start edecl () Sub MainForm_Start Radio1_on End Sub '================================================================ '= '================================================================ Declare Sub Button1_on edecl () Sub Button1_on() Var rc As RECT Var phDC As Long Var fhDC As Long Var Mask As Long Var Ret As Long phDC = Api_GetDC(Picture1.GethWnd) fhDC = Api_GetDC(GethWnd) rc.Left = 0 rc.Top = 0 rc.Right = Picture1.GetWidth rc.Bottom = Picture1.GetHeight cls If Radio(2).GetCheck = 1 Then Mask = vbWhite Else If Radio(3).GetCheck = 1 Then Mask = vbBlack End If TransparentBlt fhDC, fhDC, phDC, rc, 30, 60, Mask Ret = Api_ReleaseDC(phDC, Picture1.GethWnd) Ret = Api_ReleaseDC(fhDC, GethWnd) End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End