티스토리 뷰

과제 내용

1. 실험실습 과제명 교재 1 장의 1.5절 버튼 사용하기 API 프로그램에서 다음의 조건을 만족하도록 프로그램을 수 정하시오.

(1) 다음 그림과 같이 메인 윈도우 타이틀은 “Visual C++ 출석수업 대체 실습과제물” 이라 하 고 메인 윈도우에는 본인의 학번과 이름 “201934-123456 홍길동” 이 각각 출력된다. (설명을 위한 예시임)

(2) 두 개의 차일드 윈도우를 만드는데, 첫 번째 차일드 윈도우 타이틀은 “신청기한” 이고 윈 도우에는 “2020.5.8., 18:00까지” 가 출력된다. 두 번째 차일드 윈도우 타이틀은 “제출기간” 이 고 윈도우에는 “2020.5.11.-5.22,18:00까지 ”가 출력된다. 또한 하나의 버튼을 만들고 캡션이 름은 “추가접수”로 한다.

(3) 다음 그림과 같이 메인 윈도우 하단에 [소속]과 [제출방법] 두 개의 버튼을 만든다.

(4) [소속] 버튼을 클릭했을 때는 메시지박스에 본인의 소속 지역대학을 출력한다. 예를들면 다음 그림과 같이 메시지 박스에는 “서울지역대학” , 캡션은 “소속”이 나타난다.

(5) [제출방법]버튼을 클릭하면, 다음 그림과 같이 메시지 박스에는 “온라인제출”, 캡션은 “제 출방법” 이 나타난다.

(6) 차일드 윈도우의 [추가접수]버튼을 클릭하면 다음 그림과 같이 메시지 박스에는 “5.27,18:00 까지”, 캡션은 “추가접수” 가 나타난다.

 

2. 작성방법 온라인 제출이므로 다음 (1),(2)를 하나의 파일에 ‘붙여넣기’ 하여 제출한다.

(1) HelloAPI.cpp 파일(WinMain 함수가 있는 소스코드) 내용 전체.

(2) 프로그램을 실행했을 때 나타나는 초기 윈도우 화면, [소속], [제출방법],[추가접수] 버튼을 각각 클릭 했을 때 나타나는 각각의 윈도우 화면 전체를 모두 캡쳐한다. 따라서 제출하는 윈도 우 화면은 앞의 그림에서 보듯이 모두 4개이다.

(3) 주의: 과제물은 API 프로그래밍이므로 MFC를 사용하면 인정하지 않는다.

 

3. 과제물은 다음의 순서로 작성한다.

(1) 프로그램( HelloAPI.cpp 의 소스코드 )

(2) 출력결과( 4개의 윈도우 )

 

4. 교수 홈페이지(http://cs.knou.ac.kr/~khkim/)에서 Visual C++프로그래밍=> 학습정보=> 교재 예제 프로젝트(VS2019) 에서 “1장 2강-4강 .HelloAPI-용량줄임.zip” 프로젝트 파일을 다운로드 하여 수정하면 쉽게 할 수 있다.


HelloAPI.cpp

  • 급하게 짜느라 네이밍 규칙이 개떡같다 ..
#include <windows.h>

#define ID_OK_BTN   2000
#define ID_SUBMISSION_WAY_BTN   2001
#define ID_ADDITIONAL_REGISTER_BTN   2002

HINSTANCE g_hInst;
LPCTSTR lpszClass = L"HelloAPI";
LPCTSTR ChildClassName = L"ChildWin";
LPCTSTR ChildClassName1 = L"ChildWin1";

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK ChildWndProc1(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);


int APIENTRY WinMain(HINSTANCE hInstance,
   HINSTANCE hPrevInstance,
   LPSTR lpszCmdParam,
   int nCmdShow)
{
   HWND hWnd;
   MSG Message;
   WNDCLASS WndClass;
   g_hInst = hInstance;

   WndClass.cbClsExtra = 0;
   WndClass.cbWndExtra = 0;
   WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
   WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
   WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
   WndClass.hInstance = hInstance;
   WndClass.lpfnWndProc = (WNDPROC)WndProc;
   WndClass.lpszClassName = lpszClass;
   WndClass.lpszMenuName = NULL;
   WndClass.style = CS_HREDRAW | CS_VREDRAW;
   RegisterClass(&WndClass);     //메인윈도우 클래스 등록

   WndClass.lpfnWndProc = ChildWndProc;      //차일드 윈도우 프로시저
   WndClass.lpszClassName = ChildClassName; //차일드 윈도우 클래스이름
   RegisterClass(&WndClass);     


   WndClass.lpfnWndProc = ChildWndProc1;      //차일드 윈도우 프로시저
   WndClass.lpszClassName = ChildClassName1; //차일드 윈도우 클래스이름
   RegisterClass(&WndClass);

   hWnd = CreateWindow(lpszClass,         //윈도우클래스 이름
      L"Visual C++ 출석수업 대체 실습과제물",             //윈도우타이틀
      WS_OVERLAPPEDWINDOW | WS_VISIBLE,   //윈도우스타일
      200, 200,                     //윈도우가 보일때 X Y좌표
      800, 600,                     //윈도우의 폭과 높이            
      (HWND)NULL,                     //부모윈도우 핸들
      (HMENU)NULL,                  //윈도우가 가지는 메뉴핸들
      hInstance,                     //인스턴스핸들
      NULL);                        //여분의 데이터

   ShowWindow(hWnd, nCmdShow);

   while (GetMessage(&Message, 0, 0, 0)) {
      TranslateMessage(&Message);
      DispatchMessage(&Message);
   }
   return Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage,
   WPARAM wParam, LPARAM lParam)
{
   LPCTSTR text = L"201934-153694 김진성";
   switch (iMessage) {
   case WM_PAINT:
   {
      PAINTSTRUCT ps;
      HDC hdc = BeginPaint(hWnd, &ps);
      TextOut(hdc, 100, 100, text, lstrlen(text));
      EndPaint(hWnd, &ps);
      return 0;
   }
   case WM_CREATE:
   {
      HWND hChildWnd = CreateWindow(
         ChildClassName,           // 차일드 윈도우 클래스 이름 
         L"신청기한",               // 윈도우 타이틀 
         WS_OVERLAPPEDWINDOW | WS_CHILD,  // 윈도우  스타일 
         50,             // 윈도우 보일 때 x 좌표 
         150,             // 윈도우 보일 때 y 좌표 
         260,             // 윈도우 폭
         200,             // 윈도우 높이
         hWnd,               // 부모 윈도우
         (HMENU)1000,           // 차일드 윈도우ID 
         g_hInst,                 // 인스턴스 핸들 
         (LPVOID)NULL);         // 여분의 데이터         

      ShowWindow(hChildWnd, SW_SHOW);

      HWND hChildWnd1 = CreateWindow(
         ChildClassName1,           // 차일드 윈도우 클래스 이름 
         L"제출기간",               // 윈도우 타이틀 
         WS_OVERLAPPEDWINDOW | WS_CHILD,  // 윈도우  스타일 
         400,             // 윈도우 보일 때 x 좌표 
         150,             // 윈도우 보일 때 y 좌표 
         260,             // 윈도우 폭
         200,             // 윈도우 높이
         hWnd,               // 부모 윈도우
         (HMENU)1000,           // 차일드 윈도우ID 
         g_hInst,                 // 인스턴스 핸들 
         (LPVOID)NULL);         // 여분의 데이터         
      ShowWindow(hChildWnd1, SW_SHOW);

      hChildWnd = CreateWindow(
         L"button",              // 윈도우 클래스 이름 
         L"소속",         // 윈도우 타이틀 
         WS_CHILD | WS_VISIBLE,    // 윈도우 스타일 
         50,             // 윈도우 보일 때 x 좌표 
         400,             // 윈도우 보일 때 y 좌표 
         150,             // 윈도우 폭
         30,             // 윈도우 높이
         hWnd,               // 부모 윈도우
         (HMENU)ID_OK_BTN,      // 컨트롤 ID
         g_hInst,                 // 인스턴스 핸들 
         (LPVOID)NULL);         // 여분의 데이터

      hChildWnd = CreateWindow(
         L"button",              // 윈도우 클래스 이름 
         L"제출방법",         // 윈도우 타이틀 
         WS_CHILD | WS_VISIBLE,    // 윈도우 스타일 
         400,             // 윈도우 보일 때 x 좌표 
         400,             // 윈도우 보일 때 y 좌표 
         150,             // 윈도우 폭
         30,             // 윈도우 높이
         hWnd,               // 부모 윈도우
         (HMENU)ID_SUBMISSION_WAY_BTN,      // 컨트롤 ID
         g_hInst,                 // 인스턴스 핸들 
         (LPVOID)NULL);         // 여분의 데이터
      if (!hChildWnd)    return -1;
      return 0;
   }
   case WM_COMMAND:
   {
      if (LOWORD(wParam) == ID_OK_BTN)
      {
         MessageBox(hWnd, L"서울지역대학", L"소속", MB_OK);
      }
      if (LOWORD(wParam) == ID_SUBMISSION_WAY_BTN)
      {
         MessageBox(hWnd, L"온라인제출", L"제출방법", MB_OK);
      }
      if (LOWORD(wParam) == ID_ADDITIONAL_REGISTER_BTN)
      {
         MessageBox(hWnd, L"5.27, 18:00 까지", L"추가접수", MB_OK);
      }
      return 0;
   }
   case WM_DESTROY:
      PostQuitMessage(0);
      return 0;
   }
   return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}
LRESULT CALLBACK ChildWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   LPCTSTR text = L"2020.5.8, 18:00까지";
   switch (message)
   {
      case WM_PAINT:
      {
         PAINTSTRUCT ps;
         HDC hdc = BeginPaint(hWnd, &ps);
         TextOut(hdc, 10, 10, text, lstrlen(text));
         EndPaint(hWnd, &ps);
         return 0;
      }
   }

   return DefWindowProc(hWnd, message, wParam, lParam);
}
LRESULT CALLBACK ChildWndProc1(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
   LPCTSTR text = L"2020.5.11-5.22, 18:00까지";
   switch (message)
   {
      case WM_PAINT:
      {
         PAINTSTRUCT ps;
         HDC hdc = BeginPaint(hWnd, &ps);
         TextOut(hdc, 10, 30, text, lstrlen(text));
         EndPaint(hWnd, &ps);
         return 0;
      }
      case WM_CREATE:
      {
         HWND hChildWnd = CreateWindow(
            L"button",              // 윈도우 클래스 이름 
            L"추가접수",         // 윈도우 타이틀 
            WS_CHILD | WS_VISIBLE,    // 윈도우 스타일 
            40,             // 윈도우 보일 때 x 좌표 
            100,             // 윈도우 보일 때 y 좌표 
            80,             // 윈도우 폭
            30,             // 윈도우 높이
            hWnd,               // 부모 윈도우
            (HMENU)ID_ADDITIONAL_REGISTER_BTN,      // 컨트롤 ID
            g_hInst,                 // 인스턴스 핸들 
            (LPVOID)NULL);         // 여분의 데이터
         if (!hChildWnd)
            return -1;
         return 0;
      }
      case WM_COMMAND: 
      {
         if (LOWORD(wParam) == ID_ADDITIONAL_REGISTER_BTN)
         {
            MessageBox(hWnd, L"5.27, 18:00 까지", L"추가접수", MB_OK);
         }
      }
   }
   return DefWindowProc(hWnd, message, wParam, lParam);

 

 

 

반응형
댓글