パターン画像を使って転送 <TOP>
LoadImage
画像ファイルの読み込み
BitBlt
ビットブロック転送を行う。コピー元からコピー先のデバイスコンテキストへ、指定された長方形内の各ピクセルの色データをコピー
PatBlt
指定の範囲内を現在のパターンブラシで塗りつぶす
CreatePatternBrush 指定されたビットマップパターンを持つ論理ブラシを作成
CreateCompatibleDC 指定されたデバイスコンテキストに関連するデバイスと互換性のあるメモリデバイスコンテキストを作成
SelectObject 指定されたデバイスコンテキストのオブジェクトを選択
GetObject
オブジェクト取得
DeleteObject 論理オブジェクトを削除し、そのオブジェクトに関連付けられていたすべてのシステムリソースを解放
GetDC
指定されたウィンドウのデバイスコンテキストのハンドルを取得
ReleaseDC
デバイスコンテキストを解放
'================================================================ '= パターン画像を使って転送 '= (PatBlt.bas) '================================================================ #include "Windows.bi" #define SRCCOPY &HCC0020 'そのまま転送 #define SRCPAINT &HEE0086 '転送先の画像とOR演算して転送 #define SRCAND &H8800C6 '転送先の画像とAND演算して転送 #define SRCINVERT &H660046 '転送先の画像とXOR演算して転送 #define SRCERASE &H440328 '転送先ビットマップを反転、その結果と転送元ビットマップを論理AND演算子で結合 #define NOTSRCCOPY &H330008 '色を反転して転送 #define NOTSRCERASE &H1100A6 'コピー元の色と、コピー先の色を論理OR演算子で結合し、さらに反転 #define MERGECOPY &HC000CA 'コピー元の色と、コピー先の色を論理AND演算子で結合 #define MERGEPAINT &HBB0226 '反転した転送元ビットマップとパターンビットマップを論理OR演算子で結合 #define PATCOPY &HF00021 '指定のパターンで描画先へコピー #define PATINVERT &H5A0049 'XORで指定のパターンと描画先の色を組み合わせる #define PATPAINT &HF80A09 '指定パターンの色と、コピー元の色を反転した色を論理OR演算子で結合し、結果をコピー先の色と論理OR演算子 #define DSTINVERT &H550009 'コピー先を反転してコピー #define BLACKNESS &H42 'すべてを黒にしてコピー #define WHITENESS &HFF0062 'すべてを白にしてコピー #define LR_LOADFROMFILE &H10 '外部ファイルからロードする #define IMAGE_BITMAP 0 'ビットマップ Type BITMAP bmType As Long bmWidth As Long bmHeight As Long bmWidthBytes As Long bmPlanes As Integer bmBitsPixel As Integer bmBits As Long End Type ' 画像ファイルの読み込み Declare Function Api_LoadImage& Lib "user32" Alias "LoadImageA" (ByVal hInst&, ByVal lpszName$, ByVal uType&, ByVal cxDesired&, ByVal cyDesired&, ByVal fuLoad&) ' ビットブロック転送を行う。コピー元からコピー先のデバイスコンテキストへ、指定された長方形内の各ピクセルの色データをコピー 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_PatBlt& Lib "gdi32" Alias "PatBlt" (ByVal hDC&, ByVal x&, ByVal y&, ByVal nWidth&, ByVal nHeight&, ByVal dwRop&) ' 指定されたビットマップパターンを持つ論理ブラシを作成 Declare Function Api_CreatePatternBrush& Lib "gdi32" Alias "CreatePatternBrush" (ByVal hBitmap&) ' 指定されたデバイスコンテキストに関連するデバイスと互換性のあるメモリデバイスコンテキストを作成 Declare Function Api_CreateCompatibleDC& Lib "gdi32" Alias "CreateCompatibleDC" (ByVal hDC&) ' 指定されたデバイスコンテキストのオブジェクトを選択 Declare Function Api_SelectObject& Lib "gdi32" Alias "SelectObject" (ByVal hDC&, ByVal hObject&) ' オブジェクト取得 Declare Function Api_GetObject& Lib "gdi32" Alias "GetObjectA" (ByVal hObject&, ByVal nCount&, lpObject As Any) ' 論理オブジェクトを削除し、そのオブジェクトに関連付けられていたすべてのシステムリソースを解放 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&) Var Shared Picture(1) As Object Var Shared Button(1) As Object Var Shared Combo1 As Object For i = 0 To 1 Picture(i).Attach GetDlgItem("Picture" & Trim$(Str$(i + 1))) Button(i).Attach GetDlgItem("Button" & Trim$(Str$(i + 1))) : Button(i).SetFontSize 14 Next i Combo1.Attach GetDlgItem("Combo1") : Combo1.SetFontSize 14 Var Shared hBitmap As Long Var Shared ItemData(3) As Long Var Shared hDC1 As Long Var Shared hDC2 As Long '================================================================ '= '================================================================ Declare Sub MainForm_Start edecl () Sub MainForm_Start() Var bmp As BITMAP Var mhDC As Long Var Ret As Long Combo1.AddString "PATCOPY" : ItemData(0) = PATCOPY Combo1.AddString "PATINVERT" : ItemData(1) = PATINVERT Combo1.AddString "WHITENESS" : ItemData(2) = WHITENESS Combo1.AddString "BLACKNESS" : ItemData(3) = BLACKNESS Combo1.SetCursel 0 'ファイルからBitmapをロード hBitmap = Api_LoadImage(0, "TEST7.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE) 'Picture1のデバイスコンテキストを取得 hDC1 = Api_GetDC(Picture(0).GethWnd) 'メモリデバイスコンテキストを作成 mhDC = Api_CreateCompatibleDC(hDC1) 'Object取得 Ret = Api_GetObject(hBitmap, Len(bmp), bmp) 'Object選択 Ret = Api_SelectObject(mhDC, hBitmap) '指定の(PictureBox)のデバイスコンテキストにメモリデバイスコンテキストのデータを転送 Ret = Api_BitBlt(hDC1, 0, 0, bmp.bmWidth, bmp.bmHeight, mhDC, 0, 0, SRCCOPY) End Sub '================================================================ '= '================================================================ Declare Sub Button1_on edecl () Sub Button1_on() Picture(1).Cls End Sub '================================================================ '= '================================================================ Declare Sub Button2_on edecl () Sub Button2_on() Var Rop As Long Var hObject As Long Var hOrgObject As Long Var Ret As Long hDC2 = Api_GetDC(Picture(1).GethWnd) 'dwRop取得 Rop = ItemData(Combo1.GetCursel) hObject = Api_CreatePatternBrush(hBitmap) hOrgObject = Api_SelectObject(hDC2, hObject) Ret = Api_PatBlt(hDC2, 0, 0, Picture(1).GetWidth, Picture(1).GetHeight, Rop) Ret = Api_SelectObject(hDC2, hOrgObject) Ret = Api_DeleteObject(hObject) Ret = Api_ReleaseDC(Picture(0).GethWnd, hDC1) Ret = Api_ReleaseDC(Picture(1).GethWnd, hDC2) End Sub '================================================================ '= '================================================================ While 1 WaitEvent Wend Stop End