본문 바로가기
프로그래밍/MFC

MFC-가상 버튼 만들기

by 리뷰하는 (게임)프로그래머_리프TV 2010. 5. 16.



가상으로 버튼을 만들어 보자.

먼저 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