StretchBlt함수는 지정된 Device Context영역을 Bitmap복사합니다. 이 기능은 BitBlt함수와 같지만 StretchBit함수는 복사된 Bitmap을 늘이거나 축소하고 좌우대칭을 바꾸는등의 추가적인 작업이 가능합니다.
Declare Function StretchBlt Lib "gdi32" Alias "StretchBlt" (ByVal hdc As Integer, ByVal x As Integer, ByVal y As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer, ByVal hSrcDc As Integer, ByVal xSrc As Integer, ByVal ySrc As Integer, ByVal nSrcWidth As Integer, ByVal nSrcHeight As Integer, ByVal dwRop As Integer) As Integer
▶VB.NET 선언
[DllImport("gdi32")]
public static extern int StretchBlt(int hdc, int x, int y, int nWidth, int nHeight, int hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, int dwRop);
▶C# 선언
StretchBlt함수의 첫번째인수는 복사된 영역이 표시될 대상 Device Context를 기술하고 여섯번째 인수는 복사할 영역의 Device Context를 기술합니다.
[Windows API] - GetDC - Window및 Control의 Device Context 구하기
[Windows API] - GetWindowDC - 현재 Windows화면의 Device Context 구하기
두번째와 세번째인수는 복사된 영역이 표시될 시작좌표를 설정하며 네번째 다섯번째 인수는 앞에서 지정한 영역에서부터 복사된 영역을 표시할 크기를 지정합니다.
일곱번째와 여덟번째 인수는 지정된 Device Context로 부터 복사할 시작영역의 좌표를 설정하고 아홉번째와 열번째 인수에서 지정된 영역으로부터 복사할 영역의 크기를 기술합니다.
마지막인수는 복사된 영역이 표시될 형태를 지정하는 것으로 다음 인수중 하나를 설정하거나 필요에 따라 or단위(VB에서는 Or, C#에서는 |)로 중복하여 기술합니다.
상수 | 값 | 설명 |
BLACKNESS | 42 | 검은색으로 표시 |
DSTINVERT | 550009 | 대상을 반전 |
MERGECOPY | C000CA | 원본과 대상을 AND조합 |
MERGEPAINT | BB0226 | 원본과 대상을 OR조합 |
NOTSRCCOPY | 330008 | 원본을 반전 |
NOTSRCERASE | 1100A6 | 원본과 대상을 OR조합/반전 |
PATCOPY | F00021 | pattern 복사 |
PATINVERT | 5A0049 | 대상을 pattern과 XOR조합 |
PATPAINT | FB0A09 | pattern을 반전과 OR조합 |
SRCAND | 8800C6 | 원본을 AND연산 |
SRCCOPY | CC0020 | 복사 |
SRCERASE | 440328& | 반전된 대상을 원본과 AND연산 |
SRCINVERT | 660046 | 원본과 대상을 XOR조합 |
WHITENESS | HFF0062& | 흰색으로 표시 |
값에서 VB.NET은 &H, C#은 0x로 16진수로 표시합니다.
위 인수를 토대로 PictureBox가 두개인 상황에서 대상 Device Context의 PictureBox1으로 부터 왼쪽 0부터 가로 100까지, 위쪽 0부터 세로 100까지 해당 Image를 복사한 다음 지정된 Device Context의 PictureBox2에 왼쪽 0부터 가로 100까지, 위쪽 0부터 세로 100까지 똑같이 표시하려면 함수는 다음과 같이 호출될 수 있습니다.
Const SRCCOPY As Integer = &HCC0020
Dim idcd, idcs As Integer
idcd = GetDC(PictureBox2.Handle)
idcs = GetDC(PictureBox1.Handle)
StretchBlt(idcd, 0, 0, 100, 100, idcs, 0, 0, 100, 100, SRCCOPY)
▶VB.NET 호출
Const int SRCCOPY = 0xCC0020;
int idcd, idcs;
idcd = GetDC((int)PictureBox2.Handle);
idcs = GetDC((int)PictureBox1.Handle);
StretchBlt(idcd, 0, 0, 100, 100, idcs, 0, 0, 100, 100, SRCCOPY);
▶C# 호출
이때 만일 복사된 Image를 전체적으로 2배 확대하여 표시하려면 네번째와 다섯번째 인수에서 표시할 크기를 다음과 같이 늘려주면 됩니다.
StretchBlt(idcd, 0, 0, 200, 200, idcs, 0, 0, 100, 100, SRCCOPY)
▶VB.NET 호출
StretchBlt(idcd, 0, 0, 200, 200, idcs, 0, 0, 100, 100, SRCCOPY);
▶C# 호출
또한 좌우 혹은 상하대칭을 바꾸어 표시하려면 두번째와 세번째 인수값을 조정하여 표시를 시작할 위치를 바꾸고 네번째와 다섯번째 인수에서 크기를 역으로 지정하면 자연스럽게 대칭이 바뀌어 표시됩니다.
StretchBlt(idcd, 100, 0, -100, 100, idcs, 0, 0, 100, 100, SRCCOPY)
▶VB.NET(좌우바뀜 예제)
StretchBlt(idcd, 0, 100, 100, -100, idcs, 0, 0, 100, 100, SRCCOPY)
▶VB.NET(상하바뀜 예제)
StretchBlt(idcd, 100, 0, -100, 100, idcs, 0, 0, 100, 100, SRCCOPY);
▶C#(좌우바뀜 예제)
StretchBlt(idcd, 0, 100, 100, -100, idcs, 0, 0, 100, 100, SRCCOPY);
▶C#(상하바뀜 예제)
'.NET > Windows API for .NET' 카테고리의 다른 글
BitBlt - 지정된 영역을 Bitmap복사 (0) | 2019.08.09 |
---|---|
ShowCursor - Mouse Cursor의 숨김/해제 (0) | 2019.08.09 |
GetLocalTime - System상의 지역과 관련된 날짜및 시간구하기 (0) | 2019.08.06 |
DeleteFile - File삭제 (0) | 2019.08.06 |
RemoveDirectory - 지정한 Folder 삭제 (0) | 2019.08.06 |