해당 글을 보시기 전에 BitBlt에 대해 모르시면 이 글 읽어보시길 바랍니다.
오늘은 TransparentBlt에 대해 알아보겠습니다.
보통 비트맵을 읽어 표시를 할 때 BitBlt를 많이 사용합니다. 해당 함수는 비트맵을 그대로 표시하기 때문에 대화상자에 표시할 때 아래와 같이 표시 됩니다.
비트맵을 표시를 할 때 특정 색을 표시하고 싶지 않은 경우가 있는데 위의 경우가 그렇습니다.
그럴때 TransparentBlt를 사용하시면 됩니다.
아래의 비트맵을 다운받으셔서 리소스에 추가합니다.
위 그림과 같이 추가되면 됩니다. 그리고 확인 버튼을 더블클릭해서 아래와 같이 코딩합니다.
void CMFCApplication1Dlg::OnBnClickedOk()
{
// TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
HWND hwndDraw = m_stDraw.GetSafeHwnd();
HDC hdcDraw = ::GetDC(hwndDraw);
HDC hdcTemp = ::CreateCompatibleDC( hdcDraw );
HBITMAP hbmpDraw = (HBITMAP)::LoadImage( ::AfxGetInstanceHandle(), MAKEINTRESOURCE( IDB_BITMAP1 ), IMAGE_BITMAP, 16, 16, 0 );
HBITMAP hbmpOld = (HBITMAP)::SelectObject( hdcTemp, hbmpDraw );
::TransparentBlt( hdcDraw, 0, 0, 16, 16,
hdcTemp, 0, 0, 16, 16, RGB( 0, 0, 255 ) ); // RGB( 0, 0, 255 ) 표시 안함
HBITMAP hbmpSave = (HBITMAP)::LoadImage( ::AfxGetInstanceHandle(), MAKEINTRESOURCE( IDB_BITMAP2 ), IMAGE_BITMAP, 16, 16, 0 );
::SelectObject( hdcTemp, hbmpSave );
::TransparentBlt( hdcDraw, 32, 0, 16, 16,
hdcTemp, 0, 0, 16, 16, RGB( 0, 255, 0 ) ); // RGB( 0, 255, 0 ) 표시 안함
::SelectObject( hdcTemp, hbmpOld );
::DeleteObject( hbmpDraw );
::DeleteObject( hbmpSave );
::DeleteDC( hdcTemp );
}
실행 시켜 결과를 확인합니다.
정해진 색상을 표시하지 않은 것을 확인 하실 수 있습니다.