CRgn 클래스는 윈도우 영역 자체를 객체화한 클래스이다.
다음은 CRgn 클래스를 이용한 코드이다.
void CTextRgnView::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect RectLeft = CRect(50,50,250,150);
CRect RectRight = CRect(250,50,450,150);
dc.FillSolidRect(&RectLeft, RGB(192,0,0));
dc.FillSolidRect(&RectRight, RGB(192,192,192));
// 앞서 만든 두 사격형을 별도의 영역으로 만든다.
CRgn rgnLeft, rgnRight;
rgnLeft.CreateRectRgnIndirect(RectLeft);
rgnRight.CreateRectRgnIndirect(RectRight);
// DC 의 폰트 설정을 바꾼다.
LOGFONT lf;
::ZeroMemory(&lf, sizeof(lf));
lf.lfHeight = 72;
wsprintf(lf.lfFaceName, _T("%s"), _T("Arial"));
CFont Font;
Font.CreateFontIndirect(&lf);
CFont *pOldFont = dc.SelectObject(&Font);
dc.SetBkMode(TRANSPARENT);
//dc.TextOut(60,65,_T("TEST STRING");
// 왼쪽 영역을 선택하여 문자열을 출력한다.
dc.SetTextColor(RGB(192,192,192));
dc.SelectClipRgn(&rgnLeft); //rgnLeft 를 벗어난 문자열은 출력되지 않는다.
dc.TextOut(60,65,_T("TEST STRING"));
// 오른쪽 영역을 선택하여 문자열을 출력한다.
dc.SetTextColor(RGB(192,0,0));
dc.SelectClipRgn(&rgnRight); //rgnRight 를 벗어난 문자열은 출력되지 않는다.
dc.TextOut(60,65,_T("TEST STRING"));
dc.SelectObject(pOldFont);
}
다음은 이미지를 투명하게 해놓고 마우스 왼쪽 버튼을 누루면서 움직이면 200범위로 불투명하게 보이는 코드다.
void CImageRgnView::OnPaint()
{
CPaintDC dc(this); // device context for painting
m_ImgSample.AlphaBlend(dc.m_hDC, 0,0,50);
CRgn Rgn;
Rgn.CreateEllipticRgn(m_rectVisible.left, m_rectVisible.top, m_rectVisible.right, m_rectVisible.bottom);
dc.SelectObject(&Rgn);
m_ImgSample.BitBlt(dc.m_hDC, 0,0);
}
void CImageRgnView::OnMouseMove(UINT nFlags, CPoint point)
{
if(nFlags & MK_LBUTTON) //왼쪽 버튼을 누루면서 움직였는지 체크, 비트연산한다.
{
m_rectVisible = CRect(point.x - 100, point.y - 100, point.x + 100, point.y + 100);
//앞뒤, 옆옆으로 100씩 2번이니까 200의 차이가 난다.
RedrawWindow();
}
CView::OnMouseMove(nFlags, point);
}
void CImageRgnView::OnLButtonUp(UINT nFlags, CPoint point)
{
m_rectVisible = CRect(0,0,0,0);
RedrawWindow();
CView::OnLButtonUp(nFlags, point);
}
곰플레이어 스킨같은거 만드는 방법
CRgn 클래스를 이용해서 만들면 된다. 다음은 기초 코드이다.
CMainFrame 클래스에 OnCreate() 에서 작성하면 된다.
m_RgnRect1.CreateRectRgn(0,0,100,100);
m_RgnRect2.CreateRectRgn(70,70,170,170);
m_RgnRect3.CreateRectRgn(0,0,0,0);
m_RgnRect3.CombineRgn(&m_RgnRect1, &m_RgnRect2, RGN_XOR);
SetWindowRgn( (HRGN)m_RgnRect3, TRUE);
'Windows > MFC' 카테고리의 다른 글
RGB 와 CMYK, HSV, HLS (0) | 2011.11.15 |
---|---|
ATL, STL, COM 은 무엇인가? (0) | 2011.11.15 |
윈도우 화면 캡쳐하기 (0) | 2011.11.14 |
CImage 클래스 (0) | 2011.11.14 |
고급 이미지 출력 함수 ( TransparentBlt() , AlphaBlend() ) (0) | 2011.11.14 |