보통 BitBlt로 메모리의 이미지를 화면에 그리면,(BitBlt가 그리는 함수는 아니지만 그렇다 치자)
원본 비트맵의 원하지않는 배경까지 다 그려져서 네모지게 보인다.
어떻게 해결해야하나 고민하다가..알아낸 것이 알파블랜딩!!
알파블랜딩은 지정한 픽셀을 투명하게 만드는거다.
(알파블랜딩은 opacity를 나타내는 알파값을 이용해 특정한 블랜딩 함수로 두 색상을 섞는 기법입니다. '투명'이라는 개념이 아니죠 :D)
여러가지 방법이 있지만, 가장 손쉬운 방법은 msimg32.lib의 TransparentBlt 함수를 이용하는거다.
TransparentBlt(화면DC, 출력좌표X, 출력좌표Y, 넓이, 높이,
소스DC, 출력할좌표X, 출력할좌표Y, 넓이, 높이, 컬러키)
이를 이용하면 원하는 색상을 투명하게 만들 수 있다.(투명도를 조정할 수 있는건 아닌거같다)
또한 '소스디씨의 어디부터 어디까지 복사하겠다' 가 명확해서 애니메이션을 위해 여러동작의 이미지가
하나의 이미지파일에 포함되어있는 경우 사용하기 좋다.
이걸 사용해서 한번 출력해 보자.(적당히 필요한 부분만 적음)
#pragma comment(lib, "msimg32.lib") //이 라이브러리를 링크해야한다.
.....
HDC hdc, backMemDC, MemDC; //더블버퍼링으로
HBITMAP hImage, hOld;
static HBITMAP hBackBit=NULL;
.....
hdc=BeginPaint(hWnd,&ps);
MemDC = CreateCompatibleDC(hdc);
backMemDC = CreateCompatibleDC(hdc);
hBackBit=CreateCompatibleBitmap(hdc,rt.right , rt.bottom); //rt는 RECT rt; 윈도우 크기 갔고있다.
hOld = (HBITMAP)SelectObject(backMemDC,hBackBit);
FillRect(backMemDC, &rt, (HBRUSH)GetStockObject(GRAY_BRUSH)); //투명처리가 되었는지 확인하기 위해 회색배경으로
hImage=LoadeBitmap(g_hInstance,MAKEINTRESOURCE(IDB_BITMAP1));
SelectObject(MemDC,hImage);
TransparentBlt( backMemDC, x, y, WIDTH, HEIGHT, MemDC, sx, sy, WIDTH, HEIGHT, RGB(255,255,255) );
//흰색을 투명영역으로 지정했습니다.
BitBlt(hdc,0,0,rt.right,rt.bottom,backMemDC,0,0,SRCCOPY);
SelectObject(backMemDC,hOld);
DeleteObject(hBackBit);
DeleteObject(hImage);
DeleteDC(MemDC);
DeleteDC(backMemDC);
EndPaint(hWnd,&ps);
......
//종료
BitBlt와 크게 다르지 않아서 어색함이 없다.
그리고 잘된다 ㅎ
아, TransparentBlt는 BitBlt보다 속도가 느려서 화면전환이 많은
곳에선 잘 쓰이지 않는다고한다.
그래도 뭐. 나는 잘 쓰련다..
'Coding Note' 카테고리의 다른 글
[C++] Hello World- (0) | 2011.03.02 |
---|---|
[C++] C++ 시작하기 전. (0) | 2011.03.02 |
[winAPI] MSVRC100.dll MSVRP100.dll - VS프로그램 실행시 필요 (0) | 2011.02.22 |
[winAPI] 얌얌.exe - 더블버퍼 & 틩기기 (0) | 2011.02.16 |
[winAPI] 더블버퍼링 - 깜빡임 없애기 (5) | 2011.02.16 |