본문 바로가기

공부/MFC

Visual C++ 2008 MFC Chapter 7 GDI - 7 컨트롤 버튼 구현


이번에는 컨트롤 버튼 [누르면 작동하는 일반적인 버튼들] 을 구현하는 코드이다.

코딩해야 하는 부분이 많다. 

일단 프로젝트 속성은 전과 같고.



┌ 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);
}

}
///////////////////////////////////////////////////////////

코딩이 완료되었으므로 출력화면을 보자.

ㄴ 일반적인 클릭 후 화면

                              ㄴ꾹 누르고 있는 상태의 스크린샷



잘 안보이므로 돋보기 기능을 활용하여 확대해 보았다. 

해당 상태는 아직 버튼을 누르지 않은 상태. 잘 보면 테두리 안쪽이 회색으로 되어있음을 알 수 있다.
 


버튼을 누르고 있게되면 회색 부분이 흰색 부분으로 바뀐다.


마지막은 역시 파일업로드.