パターン画像を使って転送          <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