void CVirtualButtonView::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
if(m_BtnRect.PtInRect(point)) //버튼이 위치한 영역을 클릭했는가?
{
m_bClicked = !m_bClicked; //flag 토글
RedrawWindow(&m_BtnRect); //윈도우 지정된 범위만 다시그림, 즉 WM_PAINT 메세지 발생
}
CView::OnLButtonDown(nFlags, point);
}
void CVirtualButtonView::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
if(m_bClicked) //버튼이 위치한 영역인가?
{
m_bClicked=!m_bClicked;
RedrawWindow(&m_BtnRect);
}
if(m_BtnRect.PtInRect(point))
{
AfxMessageBox(_T("버튼을 클릭했다."));
}
CView::OnLButtonUp(nFlags, point);
}
void CVirtualButtonView::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO: 여기에 메시지 처리기 코드를 추가합니다.
// 그리기 메시지에 대해서는 CView::OnPaint()을(를) 호출하지 마십시오.
CRect Rect(m_BtnRect);
Rect += CRect(1,1,1,1);
dc.Rectangle(&Rect);
// 주어진 좌표와 색상으로 테두리 없는 사각형을 그리고 내부를 칠한다. 자주쓰임
dc.FillSolidRect(&m_BtnRect, ::GetSysColor(COLOR_BTNFACE));
//GetSysColor() 함수는 인자에 해당하는 시스템 색상을 반환하며, 윈도우 운영체제에 설정된 값이다.
if(m_bClicked)
{
//테두리가 잇는 사각형을 그리며, 왼쪽/위 선의 색상과 오른쪽/아래 선의 색상을 각기 다른 색으로 명시가 가능
dc.Draw3dRect(m_BtnRect, ::GetSysColor(COLOR_3DSHADOW),
::GetSysColor(COLOR_3DLIGHT));
}else
{
dc.Draw3dRect(m_BtnRect, ::GetSysColor(COLOR_3DLIGHT),
::GetSysColor(COLOR_3DSHADOW));
}
dc.SetBkColor(::GetSysColor(COLOR_BTNFACE));
dc.SetTextColor(::GetSysColor(COLOR_BTNTEXT));
if(m_bClicked)
{
CRect Rect = m_BtnRect;
Rect += CRect(0,0,2,2);
//DrawText() 함수는 다양한 옵션으로 문자열을 쓸 수 있다.
dc.DrawText(_T("Test Button"), &Rect, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
}else
{
dc.DrawText(_T("Test Button"), &m_BtnRect, DT_CENTER | DT_SINGLELINE | DT_VCENTER);
}
}
'Windows > MFC' 카테고리의 다른 글
비트맵과 이미지 처리 (0) | 2011.11.14 |
---|---|
DrawText() 함수 예제 및 연습 (0) | 2011.11.13 |
글꼴과 문자열 다루기 (0) | 2011.11.13 |
키보드 입력 (0) | 2011.11.12 |
MFC 코드의 흐름 (1) | 2011.11.12 |