ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Visual C++2015 MFC 프로그래밍 3장 연습문제
    개발일지/MFC 프로그래밍 2020. 4. 9. 22:55
    반응형

    <문제 1>

     

    마우스와 키보드를 이용하여 스톱워치 기능을 하는 프로그램 작성하라.

    휴대폰에 있는 스톱워치 앱의 기능을 보면 시작”,”중지”,”기록”,”계속”,”초기화등이 있다. 마우스와 키보드를 이용하여 이와 유사한 기능을 가진 스톱워치 프로그램을 작성한다. 초기화면은 00:00.00 이며 왼쪽 마우스 버튼을 클릭하면 스톱워치가 실행되고 다시 왼쪽 마우스 버튼을 클릭하면 정지되고 다시 왼쪽 마우스 버튼을 클릭하면 계속 실행된다. 따라서 왼쪽 마우스가 시작”,”중지”,”계속기능을 한다. 오른쪽 마우스 버튼을 클릭하면 초기화 하시겠습니까?” 라는 메시지가 뜨면서 초기화가 되게 한다. 키보드 스페이스 바를 누르면 스톱워치를 기록하게 되는데 최대 40개로 세로로 출력되게 하고 40개가 출력된 후에는 출력한 것들이 사라지면서 다시 기록되게 한다.

     

    <추가한 프로그램에 대한 설명>

    각자의 함수에 맞는 곳에 적절한 코드를 작성했습니다.

    1) OnTimer 함수에는 시간을 00.00의 부분에 msecond 단위로 1초부터 99초까지 진행하며 99초 이상이라면 1초로바꾸고 1초가 59초가 되면 분이 되는 코드를 작성하였습니다.

    m_nMSec += 1;

            if (m_nMSec > 99) {

                   m_nSecond += 1;

                   m_nMSec = 0;

            }

            if (m_nSecond > 59) {

                   m_nMinute += 1;

                   m_nSecond = 0;

            }

    2) LButton에 대하여 스톱워치가 돌아가고 있다면 setTimer를 통해 스톱워치를 실행시키며 1/100초로 시작되며 만약 다시 L보튼을 누르면 스톱워치를 정지시키는 KillTimer 함수를 사용했습니다. 첨부된 코드는 다음과 같습니다.

    if (m_strStopWatchRun == false) {

                   SetTimer(0, 10, NULL);

                   m_strStopWatchRun = true;

            }

            else if (m_strStopWatchRun == true) {

                   KillTimer(0);

                   m_strStopWatchRun = false;

            }

    3) 키보드 스페이스 바를 누르면 스톱워치를 기록하게 만들기 위해 스톱워치가 실행중이고 nChar가 스페이스바 였을 때 기록하도록 하며 또한 거기에 if문을 추가하여 Couont40을 넘기면 m_strRecord를 초기화시키는 작업을 진행하였습니다. 만약 그것이 아니라면 Record를 출력하고 count1 올리는 코드를 작성하였습니다. 첨부된 코드는 다음과 같습니다.

    if (nChar == VK_SPACE && m_strStopWatchRun == true) {

                   if (m_nCount >= 40)

                   {

                           m_nCount = 0;

                           for (int n = 0; n < 40; n++) {

                                  m_strRecord[n].Empty();

                           }

                   }

                   m_strRecord[m_nCount] = m_strStopWatch;

                   m_nCount += 1;

            }

    4)오른쪽 마우스가 초기화 기능을 할 수 있도록 RButtonDown을 추가 또한 이 곳에 코드를 AfxMessageBox를 통하여 출력했으며 그 전의 조건에 m_strStopWatchRunbool 값이 falsed여야 진행되도록 하였습니다. 만약 이게 true라면 작동 중 초기화를 불가능하게 막아두었습니다. 추가되는 코드는 다음과 같습니다.

    if (m_strStopWatchRun == false)

            {

                   if (AfxMessageBox(_T("초기화 하시겠습니까?"), MB_YESNO | MB_ICONQUESTION) == IDYES)

                   {

                           KillTimer(0);

                           for (int n = 0; n < 40; n++)

                           {

                                  m_strRecord[n].Empty();

                           }

                           m_nCount = 0;

                           m_nMinute = 0;

                           m_nSecond = 0;

                           m_nMSec = 0;

                           m_strStopWatch.Format(_T("%02d: %02d. %02d"), m_nMinute, m_nSecond, m_nMSec);

                           Invalidate();

                   }

            }

            if (m_strStopWatchRun == true)

            {

                   if (AfxMessageBox(_T("작동 중에는 스톱워치를 초기화시킬 수 없습니다."), MB_OK | MB_ICONWARNING) == IDYES) {}

            }

    5) 스톱워치와 기록을 OnDraw 함수에서 출력하기 위해서는 1장에 사각형으로 그리는 CRect rect와 굴림체, 글자크기 100CFont 객체를 생성하는 코드를 추가하였습니다. 스톱워치를 제외하고 스톱워치를 기록하기 위한 함수에 rect가 사용됩니다. 추가되는 코드는 다음과 같습니다.

    CRect rect;

            GetClientRect(&rect);

            CClientDC dc(this);

            CFont big_font;

            big_font.CreateFont(100,0,0,0, FW_NORMAL,FALSE,FALSE,0,

                   DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,

                   DEFAULT_QUALITY, DEFAULT_PITCH | FF_SWISS, _T("굴림체"));

            dc.SelectObject(big_font);

            dc.DrawText(m_strStopWatch, rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

            int z = 0;

            for (int n = 0; n < 40; n++) {

                   pDC->TextOutW(10, 10 + z, m_strRecord[n]);

                   z += 20;

                   if (z > 790) {

                           z = 0;

                   }

            }

     

     

    <문제 2>

     

    <실습 3-3> 에서 작성한 프로그램에 왼쪽 마우스 Drag& Drop하는 기능을 추가하는 프로그램을 다음과 같이 작성하라.

    문자열을 왼쪽 마우스로 누른 채로 드래그하면 문자열이 따라오고 버튼을 떼었을 때 문자열이 그 자리에 출력할 수 있게 구현한다.

     

    <추가한 프로그램에 대한 설명>

     

    각자의 함수에 맞는 곳에 적절한 코드를 작성했습니다.

    1) Drag & Drop을 할 때 필요한 멤버 변수를 추가했습니다. 또한 프로젝트의View()에 직접적으로 초기화를 진행했습니다.

    : m_strOutPut(_T(""))

            , m_ptLocation(0)

            , m_bDrag(false)

    2) OnLButtonDown 함수를 수정하여 왼쪽 마우스를 눌렀을 때 일정 범위 내 해당시 드래그를 시작하는 것으로 세팅하였습니다. 추가된 코드는 다음과 같습니다.

    if (point.x - m_ptLocation.x <= 30 && point.x - m_ptLocation.x >= -30 &&

                   point.y - m_ptLocation.y <= 30 && point.y - m_ptLocation.y >= -30)

            {

                   m_bDrag = true;

            }

            else {

                   m_bDrag = false;

            }

    3) 드래그 중 마우스 움직임에 따라 문자열이 이동하는 기능을 구현하기 위해 WM_MOUSEMOVE 함수인 OnMouseMove에 밑에와 같은 코드를 추가하였습니다.

    if (m_bDrag == true) {

                   m_ptLocation.x = point.x;

                   m_ptLocation.y = point.y;

            }

            Invalidate();

    4) WM_LBUTTONUP 함수인 OnLButtonUp함수를 추가하고 다음과 같은 코드를 추가하였습니다.

    if (m_bDrag == true)

            {

                   m_bDrag = false;

            }

     

    반응형
Designed by Tistory.