픽처박스는 윈도우의 핸들이 있기 때문에 DC를 생성할 수 있다.
그렇치만 이미지박스 같은 경우는 윈도우가 아니기 때문에 DC를 생성할 수 없다.
그러면 이미지 박스의 DC를 어떻게 얻을가.

이미지 박스의 DC는 생성할 수 없으니가, 이미지 박스가 포함하는 이미지는 핸들을 가지고 있으므로
메모리의 DC를 생성하고, 이 DC와 메모리를 연결하면 DC를 사용하여 이미지 박스 안의 이미지를 컨트롤할 수 있다.
메모리의 DC를 생성하기 위해서는 CreateCompatibleDC를 사용하면 DC를 생성할 수 있다.

* DC(Device Context)는 구조체를 말하는 것이며, hDC가 이 구조체를 핸들링 할 수 있는 번호 즉 DC의 핸들이다.

지정된 DC와 호완되는 DC를 메모리에 만든다.
생성한 DC는 DeleteDC로 제거한다.

● 선언

Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long

● 인수
hDC ━ 호완되는 DC 핸들, 즉 어떤 장치의 DC이냐, Null이면 현재 화면과 호완되는 메모리 DC를 생성한다

● 반환
성공 ━ 지정된 DC와 호완되는 메모리에 생성한 DC 핸들
실패 ━ Null

다음은 소스의 초기 이미지이다.


다은 이미지의 DC를 생성해서 그 DC와 이미지를 연결하고, 생성한 DC에서 픽처박스의 DC에 복하는 결과이다. 이미지 복사를 버튼을 클릭하면 픽처박스에 복사된다


소스이다
Option Explicit

Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
Private Declare Function BitBlt Lib "gdi32" (ByVal hdcDest As Long, ByVal XDest As Long, ByVal YDest As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hdcSrc As Long, ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Private Const SRCCOPY = &HCC0020

Public Function CreateImageDC(sPic As StdPicture) As Long ' 이미지에 대한 DC 생성
    Dim hdcPicture As Long ' 메모리 DC

   hdcPicture = CreateCompatibleDC(ByVal 0&) ' 메모리 DC 생성
   SelectObject hdcPicture, sPic.Handle ' 생성한 DC와 이미지 연결
   CreateImageDC = hdcPicture
End Function

Private Sub cmdImageCopy_Click() ' 이미지 복사
    Dim hdc As Long

    Picture1.ScaleMode = vbPixels
    hdc = CreateImageDC(Image1.Picture) ' 이미지에 대한 DC를 생성한다
    With Picture1
        BitBlt .hdc, 0, 0, .ScaleWidth, .ScaleHeight, hdc, 0, 0, SRCCOPY ' 이미지 복사
    End With
    DeleteDC hdc ' 이미지에 대한 DC 삭제
End Sub

+ Recent posts