그럼 비트맵 출력 코드를 살펴보겠습니다.
(WIndows API - #9 -1. 그래픽 처리 (Old를 같이 쓰는 이유) (1) 에서 설명된 내용은 제외하였습니다.)
먼저 , 윈도우즈에서는 비트맵을 곧바로 화면 DC로 출력하는 함수를 제공하지 않는다고 합니다.
비트맵의 크기가 다른 데이터에 비해 크기 때문에 출력속도가 낮기 때문이라고 합니다.
이 때문에 해당하는 파일을 먼저 읽어드리고(그리고) 난후에 출력해야하기 때문에 메모리 DC라는것을 만들어 화면 DC에 고속으로 복사하여 출력합니다. (그려지는 과정이 보여지지 않도록)
#include "resource.h"
resource.h 파일을 포함시킵니다.
해당 파일에는 추가한 이미지에 대한 정보가 들어있습니다.
HDC hdc,MemDC;
메모리 DC라는것을 만들기 위해서 MemDC를 선언합니다.
HBITMAP MyBitmap , OldBitmap;
비트맵의 리소스를 가지는 인스턴트 핸들을 선언합니다.
MemDC=CreateCompatibleDC(hdc);
지정된 장치와 호환 메모리 device context (DC)를 생성합니다.
즉 , 인자값으로 화면의 DC 핸들을 주면 이 화면과 동일한 특성의 DC를 메모리에 만들어 핸들값을 리턴해줍니다.
HDC CreateCompatibleDC( _In_ HDC hdc ); |
매게 변수 | 의미 |
hdc | 기존 DC에 대한 핸들 값을 입력합니다. 이 핸들이 NULL 이면 응용프로그램의 현재 화면과 호환되는 메모리 DC를 생성합니다. |
MyBitmap = LoadBitmap(_hInstance , MAKEINTRESOURCE(MUZI2));
HBITMAP MyBitmap에 지정된 리소스를 로드합니다.(리소스로 선택한 비트맵을 읽어옵니다.)
HBITMAP LoadBitmap( _In_ HINSTANCE hInstance, _In_ LPCTSTR lpBitmapName ); |
매게 변수 | 의미 |
hInstance | 실행 파일 모듈의 인스턴스 핸들 값을 입력합니다. 해당 인스턴트 핸들값에는 로드 할 비트맵이 포함되어 있습니다. |
lpBitmapName | 비트맵 리소스의 이름을 포함하는 null로 끝나는 문자열에 대한 포인터를 지정합니다. (쉽게 불러올 비트맵을 지정합니다. 해당 비트맵의 이름은 resource.h 파일에 리소스 기호와 값으로 지정되어 있습니다.) MAKEINTRESOURCE 메크로를 통해 이 값을 채울 수 있습니다. |
* MAKEINTRESOURCE 메크로
LPTSTR MAKEINTRESOURCE( WORD wInteger ); |
매게 변수 | 의미 |
wInteger | 메크로에서 사용될 리소스 이름을 포함하는 문자열 값을 입력합니다. |
OldBitmap=(HBITMAP)SelectObject(MemDC, MyBitmap);
SelectObject로 메모리 DC에 선택을 하게 되면 메모리 DC에 리소스에서 읽어온 비트맵이 그려져 있습니다.
또한 추후 지정된 MyBitmap을 삭제를 위해서 꼭 필요합니다.
BitBlt (hdc , 0 , 0 , 192 , 192 , MemDC , 0 , 0 , SRCCOPY);
메모리 DC에 있던 비트맵 이미지를 현 화면 DC의 픽셀에 대응하도록 사각형 형태로 복사합니다.
BOOL BitBlt( _In_ HDC hdcDest, _In_ int nXDest, _In_ int nYDest, _In_ int nWidth, _In_ int nHeight, _In_ HDC hdcSrc, _In_ int nXSrc, _In_ int nYSrc, _In_ DWORD dwRop ); |
매게 변수 | 의미 |
hdcDest | 복사 대상의 DC의 핸들값을 입력합니다. |
nXDest | 대상의 사각형 위 모서리의 X 좌표값을 입력합니다. |
nYDest | 대상의 사각형 위 모서리의 Y 좌표값을 입력합니다. |
nWidth | 대상의 사각형 폭 값을 입력합니다. |
nHeight | 대상의 사각형 높이 값을 입력합니다. |
hdcSrc | 복사할 DC의 핸들 값을 입력합니다. |
nXSrc | 복사될 좌측 상단의 X 좌표를 입력합니다. |
nYSrc | 복사될 좌측 상단의 Y 좌표를 입력합니다. |
dwRop | 래스터의 연산코드를 지정합니다. (출력될 이미지의 효과) 예제에서는 기본값인 SRCCOPY를 사용했습니다. 자세한 값들은 아래 링크를 참조. https://msdn.microsoft.com/ko-kr/library/windows/desktop/dd183370(v=vs.85).aspx |
DeleteDC(MemDC);
지정한 device context (DC)를 삭제합니다,
BOOL DeleteDC( _In_ HDC hdc ); |
매게 변수 | 의미 |
hdc | 삭제될 DC 핸들 값을 입력합니다. |
GetObject(hBit,sizeof(BITMAP),&bit);
지정된 그래픽 객체의 대한 정보를 검색합니다.
int GetObject( _In_ HGDIOBJ hgdiobj, _In_ int cbBuffer, _Out_ LPVOID lpvObject ); |
매게 변수 | 의미 |
hgdiobj | 그래픽에 대한 객체의 핸들을 입력합니다. 이 값에는 비트맵 , 브러시 , 폰트 ,팔레트 , 펜 또는 CreateDIBSection 함수를 호출하여 만든 독립적인 비트맵의 핸들 값이 될 수 있습니다. ( CreateDIBSection는 다음에 연구해보기로 합시다 :D ) |
cbBuffer | 기록될 버퍼의 바이트 숫자를 기록합니다. |
lpvObject | 지정된 그래픽 개제에 대한 버퍼의 포인터 값입니다. 버퍼의 그래픽 유형별 수신 정보의 종류는 HGDIOBJ로 지정할 수 있습니다. |
'프로그래밍 관련 > Win API' 카테고리의 다른 글
WIndows API - #9-6 그래픽 처리 - (더블 버퍼링 - 자세히 보기)(2) (0) | 2015.09.07 |
---|---|
WIndows API - #9-5 그래픽 처리 - (더블 버퍼링)(1) (0) | 2015.09.07 |
WIndows API - #9-3 그래픽 처리 - (비트맵 출력) (1) (0) | 2015.09.06 |
WIndows API - #9 -2. 그래픽 처리 (Old를 같이 쓰는 이유) (2) (0) | 2015.09.03 |
WIndows API - #9 -1. 그래픽 처리 (Old를 같이 쓰는 이유) (1) (0) | 2015.09.03 |