이번에 살펴볼 것은,
이미지에 대해서 특정 부분만 보여준다거나(감춘다거나), 이미지특성을 반전시키는 것에 대해서 통합해서 살펴보자.
먼저 실행 화면은 다음과 같다.
*이미지의 내용은 중요하지 않습니다.
이미지를 보면 특정 원안에 부분만 이미지가 보여지고(저 원은 움직일 수 있고 사이즈 조정이 가능합니다.)
원엔에 특정 사각형은 그 부분의 이미지가 반전되는 것을 확인 할 수 있다.
코드를 살펴보자.
먼저 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 |