본문 바로가기
개발

투명 이미지 그리기(MaskBlt, TransparentBlt)

by 솜씨제이 2007. 4. 3.

부분적으로 투명한 이미지는 상당히 쓸모가 많다. 특히 스킨 형태의 어플리케이션을 개발하려면 투명 이미지를 그리는 것은 꼭 필요한 요소 중 하나다. WIN32에서도 MaskBlt(), TransparentBlt() 등의 투명한 이미지를 그리기 위한 API를 제공하지만 MaskBlt()는 Windows NT 계열에서만 사용할 수 있고 TransparentBlt()는 Windows 98이나 2000이상에서만 사용이 가능하다.

만약 Windows 9X나 Windows 2000 미만에서 투명한 이미지를 그리려면 다음과 같은 방법으로도 가능하다. 최근에는 Windows 9X 사용자가 줄어서 거의 필요 없지만 말이다.

1. 먼저 배경색을 이용해서 마스크 비트맵을 만든다. 이미 마스크 비트맵이 있다면 생략이 가능하다.

    HBITMAP hbmMask = CreateBitmap(cxSrc, cySrc, 1, 1, NULL);
    HDC hdcMask = CreateCompatibleDC(hdc);
    HBITMAP hbmOld = (HBITMAP)SelectObject(hdcMask, hbmMask);
    COLORREF crOld = SetBkColor(hdcSrc, crMask);
    if (crOld == CLR_INVALID)
        return FALSE;
    BOOL bResult = BitBlt(hdcMask, 0, 0, cxSrc, cySrc, hdcSrc, xSrc, ySrc, SRCCOPY);
    SetBkColor(hdcSrc, crOld);

2. 만들어진 마스크 비트맵으로 이미지를 투명하게 그린다.

    crOld = SetBkColor(hdc, RGB(255, 255, 255));
    if (crOld == CLR_INVALID)
        return FALSE;
    BitBlt(hdc, x, y, cx, cy, hdcSrc, xSrc, ySrc, SRCINVERT);
    BitBlt(hdc, x, y, cx, cy, hdcMask, xSrc, ySrc, SRCAND);
    BitBlt(hdc, x, y, cx, cy, hdcSrc, xSrc, ySrc, SRCINVERT);
    SetBkColor(hdc, crOld);

3. 만들었던 마스크 비트맵과 DC를 지우는 걸 잊지 말자.

    DeleteObject(SelectObject(hdcMask, hbmOld));
    DeleteDC(hdcMask);

이렇게 그려주는 방식은 중간에 BitBlt()을 세 번 하기 때문에 화면이 깜박거린다. 깜박거림을 없애고 싶다면 비트맵을 하나 더 만들어서 더블 버퍼링을 하면 된다.

댓글1