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

+ Recent posts