블로그는 나의 힘!
[ Programing ]/API2010. 2. 4. 02:51

//!< <<< 알파값 적용으로 투명하게 >>>


void DrawBitmapAlphaBlend(HINSTANCE hInst, HDC hdc)
{
     //!< LoadImage() 함수는 아이콘, 비트맵, 커서등을 읽어들일수 있다.
     //!< LoadBitmap()은 비트맵 리소스만 읽어들인다.
     HBITMAP hbm = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_BITMAP3));

     //!< DC 객체를 새로 생성하는 함수 CreateCompatibleDC()
     //!< 어떤 DC를 생성하느냐? 
     //!< 인자로 주어진 hdc와 픽셀 포맷이 같은 DC를 생성.
     HDC MemDC = CreateCompatibleDC(hdc);

    /* SelectObject() 함수는 지정해준 DC가 어떤 객체를 관리할 수 있도록 연결해준다.
        -> MemDC 가 객체 hbm 을 관리할수 있도록 연결해준다.
        => 즉 SelectObject() 함수는 어떤 DC가 관리할 수 있는 모든 객체와 해당 DC를 연결해주는 역할을 한다.
        여기서 말하는 객체란 DC가 관리할 수 있는 모든 형태. ( Pen, Brush, Bitmap ... )
        그런데 만약 MemDC가 이전에 이미 관리하던 객체가 있다면?
        원래 객체를 잃어버리지 않도록 임시로 받아둔다. (holdbm)
        받아둔 원 객체는 나중에 다시 연결해준다. (복구) */
     HBITMAP holdbm = (HBITMAP)SelectObject(MemDC, hbm);

     //!<이미지 사이즈 정보 구하기.
     BITMAP bm;
     GetObject(hbm, sizeof(BITMAP), &bm);

     //!< 화면에 뿌려주는 함수. 
     //!< MemDC 가 화면에 뿌려질 이미지 데이터를 관리하고 있으므로  
     //!< 화면 픽셀에 뿌려줄 데이터를 MemDC로부터 전달받는다. 
     //!< 여기서 화면이라는 객체를 관리하는 것 -> hdc
     BitBlt( hdc, 0, 250, bm.bmWidth,bm.bmHeight, MemDC, 0,0, SRCCOPY); 

     BLENDFUNCTION blend; 
     blend.BlendFlags   = 0;
     blend.AlphaFormat   = AC_SRC_ALPHA;
     blend.BlendOp    = AC_SRC_OVER;
     blend.SourceConstantAlpha = 120;

     //!< 설정된 알파값으로 투명하게 만든다.
     AlphaBlend(hdc, 0, 0, bm.bmWidth, bm.bmHeight, MemDC, 0, 0, bm.bmWidth, bm.bmHeight, blend);

     //!< 다 그렸으면 MemDC 를 원래 상태로 복구한다.
     SelectObject(MemDC, holdbm);

     //!< 비트맵 이미지 해제.
     DeleteObject(hbm);

     //!< 생성할때 바로 해제부터 해준다. (습관)
     DeleteDC( MemDC);
}

 

Posted by Mister_Q