본문 바로가기
프로그래밍/MFC

MFC-ImageRgn( 이미지의 특정 부분에 특수효과 삽입하기 )

by 리뷰하는 (게임)프로그래머_리프TV 2010. 5. 19.




이번에 살펴볼 것은,

이미지에 대해서 특정 부분만 보여준다거나(감춘다거나), 이미지특성을 반전시키는 것에 대해서 통합해서 살펴보자.

먼저 실행 화면은 다음과 같다.

*이미지의 내용은 중요하지 않습니다.

이미지를 보면 특정 원안에 부분만 이미지가 보여지고(저 원은 움직일 수 있고 사이즈 조정이 가능합니다.)
원엔에 특정 사각형은 그 부분의 이미지가 반전되는 것을 확인 할 수 있다.


코드를 살펴보자.
먼저 View클래스에 멤버 변수로,

public:
	CImage m_Image;
	CRect m_Rect;​


CImage와 Crect를 하나씩 생성해 주자.

그리고 WM_PAINT, WM_KEYDOWN, WM_CREATE 메시지를 각각 추가해 주자.

// View::OnCreate
	// 최초에 Rect(원)의 범위를 잡아준다.
	// 수치를 보면 알겠지만 Size 0의 원을 그려준 것이다.
	m_Rect = CRect( 300, 300, 300, 300 );
	// 특정 이미지를 불러온다.
	m_Image.Load( TEXT("image.jpg") );​

 

// View::OnKeyDown
	switch( nChar )
	{
	case VK_LEFT:	// 원을 이동하기 위한 부분(좌우 구현)
		m_Rect.MoveToX( m_Rect.left-10 );
		break;
	case VK_RIGHT:
		m_Rect.MoveToX( m_Rect.left+10 );
		break;
	case VK_UP:		// 원의 크기를 변경한다.
		m_Rect += CRect( 10, 10, 10, 10 );
		break;
	case VK_DOWN:
		m_Rect -= CRect( 10, 10, 10, 10 );
		break;
	}

	RedrawWindow();​

 

// View::OnPaint
	// 이미지에 대해서 알파값을 적용한다
	// 이 수치를 조정하면 흐린 이미지에서 특정 부분만(예제에서는 원)
	// 선명하게 이미지를 보여주는 행동들을 할 수 있다.
	m_Image.AlphaBlend( dc.m_hDC, 0, 0, 0 );

	// 원에 대한 부분에 rgn을 적용해 분할한다.
	CRgn rgn;
	rgn.CreateEllipticRgn( m_Rect.left,
		m_Rect.top,
		m_Rect.right,
		m_Rect.bottom );

	// dc에 특정 영역만(원) 잡아준다
	dc.SelectClipRgn( &rgn );

	// 선명한 이미지를 그 특정 영역에 그려준다.
	m_Image.BitBlt( dc.m_hDC, 0, 0 );

	// 이미지 반전을 위한 부분 브러쉬를 사용한다.
	CBrush NewBrush( PS_SOLID, RGB(255, 255, 255) );
	CBrush* pOldBrush = dc.SelectObject( &NewBrush );

	// R2_NOT 이라는 속성값을 사용하여 반전 할 수 있게 한다.
	dc.SetROP2( R2_NOT );

	// 사각영역을 그리면 그 안에 이미지는 반전된다.
	dc.Rectangle( 100, 100, 300, 300 );

	dc.SelectObject( pOldBrush );​


소스에 대한 기본 설명은 주석에 다 포함 시켜 놓았다. 특별히 어려운 부분이 존재하진 않고,
특정 영역을 분할한다는 개념만 잡으면 어렵지 않다.

'프로그래밍 > MFC' 카테고리의 다른 글

MFC-TextRgn( 게이지에 따른 텍스트 변화 )  (0) 2010.05.19
MFC-CImage( 스크린 샷 찍기 )  (0) 2010.05.17
MFC-CImage 클래스  (0) 2010.05.17
MFC-비트맵 띄우기  (0) 2010.05.16
MFC-가상 버튼 만들기  (0) 2010.05.16