가상으로 버튼을 만들어 보자.
먼저 WM_LBUTTONDOWN과 WM_LBUTTONUP, WM_PAINT에 대해서 메시지탭에서 추가해 주자.
//View::OnLButtonDown
if( m_BtnRect.PtInRect( point ) ) // 현재 마우스 위치가 Rect안에 존재 하는지 확인해 준다.
{ // 그렇다면
m_bClicked = !m_bClicked; // m_bClicked를 반대로 변경( 아마 false에서 true가 될 것이다.)
RedrawWindow( &m_BtnRect ); // 화면 갱신
}
//View::OnLButtonUp
if( m_bClicked ) // 버튼을 땠을 때 그 값이 true라면
{
m_bClicked = !m_bClicked; // false로 변경
RedrawWindow(&m_BtnRect); // 화면 갱신
}
if( m_BtnRect.PtInRect( point ) ) // 만약 버튼을 땠을 때 그 위치가 아직 버튼안에 있다면
{
AfxMessageBox(L"버튼을 클릭 했습니다."); // 메시지 박스를 띄운다.
}
여기까지는 특별히 어려운게 없다.
단순히 클릭을 하면 메시지 박스를 띄우는 것이라 생각 할 수 있지만,
우리가 원하는건 가상 버튼이다, 이제 WM_PAINT를 살펴 보자.
//View::OnPaint
// 임시로 Rect에 m_BtnRect를 대입
CRect Rect( m_BtnRect );
Rect += CRect( 1, 1, 1, 1 ); // 그 Rect에 모든 좌표에 +1을 시킨다.
dc.Rectangle( &Rect ); // +1 시킨 Rect를 화면에 그리고
// 기존의 m_BtnRect에는 시스템 색상을 입힌다.
dc.FillSolidRect( &m_BtnRect, ::GetSysColor( COLOR_BTNFACE ) );
// 만약 버튼이 눌려 있는 상태라면
if( m_bClicked )
{
// m_BtnRect를 Draw3dRect를 사용해 그린다.
// 왼쪽/위는 어둠게,
// 오른쪽/아래는 밝게 넣는다.
dc.Draw3dRect( m_BtnRect,
::GetSysColor( COLOR_3DSHADOW ),
::GetSysColor( COLOR_3DLIGHT ) );
}
// 그렇지 않다면?(평소 상태)
else
{
// m_BtnRect를 Draw3dRect를 사용해 그린다.
// 왼쪽/위는 밝게
// 오른쪽/아래는 어둠게 넣는다.
dc.Draw3dRect( m_BtnRect,
::GetSysColor( COLOR_3DLIGHT ),
::GetSysColor( COLOR_3DSHADOW ) );
}
// dc에 백그라운드 색상와, text색상을 지정해 준다.
dc.SetBkColor( ::GetSysColor( COLOR_BTNFACE ) );
dc.SetTextColor( ::GetSysColor( COLOR_BTNTEXT ) );
// 만약 눌린 상태라면
if( m_bClicked )
{
// 임시 Rect를 만들고, m_BtnRect의 정보를 넣어 준 후
CRect Rect = m_BtnRect;
// 우측, 하단의 크기를 +2 시킨다.
Rect += CRect( 0, 0, 2, 2 );
// 그 안에 Text 출력
dc.DrawText( L"Test Button", &Rect,
DT_CENTER | DT_SINGLELINE | DT_VCENTER );
}
else
{
// 평상시 상태라면 그냥 그 위치 그대로 출력
dc.DrawText( L"Test Button", &m_BtnRect,
DT_CENTER | DT_SINGLELINE | DT_VCENTER );
}
중요한 내용은 다 주석을 달아 놓았다.
처음 보는 부분도 존재하지만 특별히 이해가 가지 않는 부분은 없는거 같다.
Draw3dRect는 2번째 인자로 왼쪽과 위쪽의 색상을,
3번째 인자로 오른쪽과 아래의 색상을 추가 정의 할 수 있다.(즉 입체감을 주기 위해 존재한다고 보면 될듯 하다)
// 실행 화면
실제 버튼도 아닌 것이 입체적인 효과를 내고 있다.
'프로그래밍 > MFC' 카테고리의 다른 글
MFC-CImage 클래스 (0) | 2010.05.17 |
---|---|
MFC-비트맵 띄우기 (0) | 2010.05.16 |
MFC-부채꼴 그리기 (0) | 2010.05.16 |
MFC-도형 그리기 (0) | 2010.05.16 |
MFC-선 그리기 (0) | 2010.05.16 |