이번에는 컨트롤 버튼 [누르면 작동하는 일반적인 버튼들] 을 구현하는 코드이다.
코딩해야 하는 부분이 많다.
일단 프로젝트 속성은 전과 같고.
┌ VirtualButtonView.h 파일의 수정부분 ┐
#pragma once
class CVirtualButtonView : public CView
{
protected: // serialization에서만 만들어집니다.
CVirtualButtonView();
DECLARE_DYNCREATE(CVirtualButtonView)
// 특성입니다.
public:
CVirtualButtonDoc* GetDocument() const;
//추가부분 시작
CRect m_BtnRect; // 버튼이 그려질 위치
BOOL m_bClicked; // 버튼이 클릭된 상태인지 나타내는 플래그
//추가부분 종료
//////////////////////////////////////////////////////////
CVirtualButtonView::CVirtualButtonView()
{
// TODO: 여기에 생성 코드를 추가합니다.
//추가부분 시작
m_BtnRect = CRect(10,10,210,40);
m_bClicked = FALSE;
//추가부분 종료
}
///////////////////추가 수정 부분 ///////////////////
다음으로는 왼클릭 버튼의 작업에 따른 두 메시지 핸들러 함수의 코딩이다.
먼저 다운 키부터.
// CVirtualButtonView 메시지 처리기
void CVirtualButtonView::OnLButtonDown(UINT nFlags, CPoint point)
{
if(m_BtnRect.PtInRect(point))
{//버튼이 위치한 영역을 클릭하였는가?
m_bClicked = !m_bClicked;
RedrawWindow(&m_BtnRect); // 플래그를 토글하고 윈도우를 다시 그린다.
}
CView::OnLButtonDown(nFlags, point);
}
/////////////////////////////////////////////////
그다음은 업 키 .
////////////////////////////////////////////////
void CVirtualButtonView::OnLButtonUp(UINT nFlags, CPoint point)
{
if(m_bClicked)
{//버튼이 위치한 영역인가?
m_bClicked = !m_bClicked;
RedrawWindow(&m_BtnRect);
// 플래그를 토글하고 윈도우를 다시 그린다.
}
if(m_BtnRect.PtInRect(point))
{
AfxMessageBox(L"버튼을 클릭했습니다.");
}
CView::OnLButtonUp(nFlags, point);
}
/////////////////////////////////////////////////
클릭에 관한 메시지 출력을 다 코딩했으니 이제 메인이 되는 프린트 함수를 등록하자.
void CVirtualButtonView::OnPaint()
{
CPaintDC dc(this); // device context for painting
CRect Rect(m_BtnRect);//시스템이 정의한 버튼 색상으로 버튼의 영역을 칠한다. ?
Rect += CRect(1,1,1,1);
dc.Rectangle(&Rect);
dc.FillSolidRect(&m_BtnRect, ::GetSysColor(COLOR_BTNFACE));
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;
//눌러진 상태면 글씨가 출력되는 위치를 1픽셀 조절한다.
Rect += CRect(0,0,2,2);
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);
}
}
///////////////////////////////////////////////////////////코딩이 완료되었으므로 출력화면을 보자.
ㄴ 일반적인 클릭 후 화면
ㄴ꾹 누르고 있는 상태의 스크린샷
잘 안보이므로 돋보기 기능을 활용하여 확대해 보았다.
해당 상태는 아직 버튼을 누르지 않은 상태. 잘 보면 테두리 안쪽이 회색으로 되어있음을 알 수 있다.
버튼을 누르고 있게되면 회색 부분이 흰색 부분으로 바뀐다.
마지막은 역시 파일업로드.
'공부 > MFC' 카테고리의 다른 글
Visual C++ 2008 MFC Chapter 7 GDI 실습예제 (0) | 2011.12.05 |
---|---|
Visual C++ 2008 MFC Chapter 7 GDI - 7 끝부분.. 으으. (0) | 2011.12.05 |
Visual C++ 2008 MFC Chapter 7 GDI - 6 글꼴과 문자열 (0) | 2011.12.02 |
Visual C++ 2008 MFC Chapter 7 GDI - 5 실습 예제 (0) | 2011.12.02 |
Visual C++ 2008 MFC Chapter 7 GDI - 5 도형 그리기 (2) | 2011.12.02 |