ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Visual c++ 2015 MFC 프로그래밍 1장 연습문제
    개발일지/MFC 프로그래밍 2020. 3. 27. 10:09
    반응형

    <연습문제 1>

    실습 1-1에서 작성한 <간단한 Win32 SDK 윈도우 프로그램>을 수정하여 다음과 같은 기능을 추가할 수 있도록 구현해보자.

    생성된 윈도우에서 마우스 버튼을 눌렀을 경우와 마우스가 이동 중일 때 윈도우의 중앙에 문자열을 출력해보자. 마우스 왼쪽 버튼을 눌렀을 경우에는 마우스가 눌려졌습니다.”라는 문자열을, 마우스가 이동 중일 경우는 마우스가 이동 중입니다.” 라는 문자열을 출력한다. 왼쪽 마우스 버튼을 때었을 경는 출력된 문자열을 지운다.

    <소스코드>

    소스코드에 추가할 부분은 다음과 같다. 우선 szTitleName을 편의상 연습문제1로 변경했으며, 주로 변경할 부분은 LRESULT CALLBACK WndProc(HWND hwnd, UNIT message, WPARAM wParam, LPARAM Iparam) 안의 내용이다. LPTSTR szMsg1은 실습문제 1) 을 따라 작성할 수 있으나 조금 변경하자면 연습문제 1-1, 연습문제 1-2 등으로 바꾸어도 좋을 듯 하다. 주로 바꿀 것은 szMsg4와 szMsg5의 내용을 추가하고 Switch-case문 안에 아래의 내용을 추가하는 것이다. 

    case WM_LBUTTONDOWN: //마우스를 눌렀을 때

            hdc = GetDC(hwnd);

            GetClientRect(hwnd, &rect);

            DrawText(hdc, szMsg4, strlen(szMsg4), &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

            ReleaseDC(hwnd, hdc);

            break;

        case WM_MOUSEMOVE:  //마우스를 이동시켰을 때

            hdc = GetDC(hwnd);

            GetClientRect(hwnd, &rect);

            DrawText(hdc, szMsg5, strlen(szMsg5), &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

            ReleaseDC(hwnd, hdc);

            break;

        case WM_LBUTTONUP: //마우스를 떼었을 때

            InvalidateRect(hwnd, NULL, TRUE); 

            break;

     


    <연습문제 2>

    위에서 작성한 <연습1>에 이어서 마우스 왼쪽 버튼에 대해 다음과 같은 기능이 추가되도록 구현해보자.

    생성된 윈도우에서 마우스가 눌러졌을 경우 마우스가 눌러졌습니다.” 라는 텍스트와 함께 마우스가 눌린 점의 좌표 값을 마우스를 눌러진 위치에 출력해 보도록 하자.

     

    <소스코드>

    소스코드에 추가할 부분은 다음과 같다. 우선 LRESULT CALLBACK WndProc(HWND hwnd, UNIT message, WPARAM wParam, LPARAM Iparam) 안에 POINT MousePoint;를 선언해주고 차례대로

        LPTSTR szMsg6 = new char[10];

        MousePoint.x = LOWORD(IParam);

        MousePoint.y = HIWORD(IParam);

    를 추가로 선언해 준다. 또한 switch-case문 안의 내용에 다음과 같이 내용을 추가하면 된다.

        case WM_LBUTTONDOWN:

            hdc = GetDC(hwnd);

            GetClientRect(hwnd, &rect);

            DrawText(hdc, szMsg4, strlen(szMsg4), &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);

            wsprintf(szMsg6, "X:%Id, Y:%Id", MousePoint.x, MousePoint.y); //연습문제 2번에 추가된 내용

            TextOut(hdc, MousePoint.x, MousePoint.y, szMsg6, strlen(szMsg6)); //연습문제 2번에 추가된 내용

            ReleaseDC(hwnd, hdc);

            break;

     


    프로그램을 작성하다 보면 책이 2015 버전에 맞추어져 있어 visual 2019를 사용하여 프로그래밍을 할 경우 빨간 줄이 그이는 것을 볼 수 있다. 이를 수정하는 방법은 매우 간단하다. 우선 소스파일을 우클릭 시 그 파일의 속성을 변경할 수 있는 [속성]을 볼 수 있다. 혹은 상단의 [프로젝트(p)]를 선택 시에도 [속성]을 변경할 수 있게 된다. 그렇게 되면 하단의 속성 페이지가 뜨게 된다.

     

    이때 static LPTSTR szAppName = "EasyText"; 등에서 "(내용)" 안에 빨간줄이 그이는 것을 막기위한 속성 변경은 두가지만 변경해 주면 된다. [구성속성] 페이지 부분에 [고급] 탭을 눌러보면 문자 집합에 [유니코드 문자 집합 사용] 이라고 되어있는 것을 [멀티 바이트 문자 집합 사용]으로 변경하고 적용시킨다. 또한 [C/C++] 페이지 부분의 [언어] 탭에 들어가서 [준수 모드]를 [아니요] 로 변경하면 빨간줄이 없어지게 된다. 준수 모드는 쉽게 설명하자면 프로그래밍에 대해 빡빡한 규칙을 적용하겠느냐는 의미라고 볼 수 있다.

     

    그 다음 실행을 진행하게 된다면 우리는 또 다른 문제점을 맞이하게 된다. 바로 LNK2019로 뜨는 외부참조를 찾을 수 없다는 설명이 뜰 것이다. 이는 위의 사진과 같이 속성 변경을 해주면 해결되게 된다. 2015 버전의 경우에는 win32 프로그래밍을 하기 위한 템플릿 설정이지만 2019 버전으로 올라가면서 마법사 템플릿을 사용하게 된다. 그러면서 .exe 파일을 실행하는 방법이 콘솔로 바뀌게 되었는데 우리는 WINDOWS를 사용해야 하므로 마찬가지로 속성 페이지 안에 들어가 [링커]의 [시스템] 탭에 하위 시스템을 [콘솔] 에서 [창]으로 변경해 주고 적용해주면 LNK2019 오류가 뜨지 않게 된다.

    반응형
Designed by Tistory.