[WinAPI] 특정 색 제외하고 표시 – TransparentBlt

[WinAPI] 특정 색 제외하고 표시 – TransparentBlt

해당 글을 보시기 전에 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 );
}

실행 시켜 결과를 확인합니다.

정해진 색상을 표시하지 않은 것을 확인 하실 수 있습니다.