그렇치만 이미지박스 같은 경우는 윈도우가 아니기 때문에 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
'API' 카테고리의 다른 글
OleCreatePictureIndirect을 사용한 비트맵을 이미지 개체 만들기, 이미지 합성 (0) | 2011.09.30 |
---|---|
CreateCompatibleBitmap을 사용한 메모리를 이용한 이미지 복사 (0) | 2011.09.30 |
ChangeDisplaySettings을 사용한 해상도 변경 (0) | 2011.09.29 |
EnumDisplaySettings을 사용한 현재 디스플레이애 대한 모든 모드 정보 얻기 (0) | 2011.09.29 |
EnumDisplayDevices를 사용한 디스플레 장치 정보 얻기 (0) | 2011.09.28 |