이미지 컨트롤에는 DC가  없다. 그래서 대부분 픽처박스를 사용하는대, 대신 픽처박스를 사용하기 위해서는 많은 양의 리소스가 필요하다. 그러면 이미지 컨트롤에 대한 DC는 얻을수 없지만, 이미지 컨트롤의 picture 속성에 지정된 이미지에 대한 DC를 생성할수 있다. 이 DC를 활용하면 픽처박스에 사용하는 DC와 같은 효과를 낼수 있다. 그러면 리소스 사용을 줄일수 있다.

다음 소스의 초기 화면이다.


왼쪽은 이미지 컨트롤이며 오른쪽 박스는 픽처 박스다. 버튼을 누르면 다음 이미지와 같이 복사가 된다

picture 속성을 그냥 설정 한 것이 아니라, 이미지 컨트롤의 이미지에 대한 DC를 얻고, 그 DC를 활용하여 픽처박스에 BitBlt API 함수를 사용하여 복사를 하였다. 그래서 왼쪽 이미지 컨트롤의 이미지는 이미지 컨트롤의 strech 속성이 설정 되어 있어서 원래 이미지가 이미지 컨트롤에 맞게 그 크기가 조정된 상태다. 그러나 DC는 원래 이미지에 대한 DC 이므로 이미지의 원래 크기와 같다. 이것을 픽처 박스에 복사하다 보니 위의 그림과 같이 복사되었다.

소스는 다음과 같다.
' 이미지에 대한 DC 생성을 하여 복사
Option Explicit

Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc 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 CreateDC(sPic As StdPicture) As Long ' 이미지에 대한 DC 생성
   Dim hdcPicture As Long

   hdcPicture = CreateCompatibleDC(ByVal 0&)
   SelectObject hdcPicture, sPic.Handle
   CreateDC = hdcPicture
End Function

Private Sub Command1_Click()
    Dim hdc As Long
   
    Picture1.ScaleMode = vbPixels
    hdc = CreateDC(Image1.Picture) ' 이미지에 대한 DC를 생성한다
    With Picture1
        BitBlt .hdc, 0, 0, .ScaleWidth, .ScaleHeight, hdc, 0, 0, SRCCOPY ' 이미지 복사
    End With
    DeleteDC hdc
End Sub

+ Recent posts