본문 바로가기
MFC and C++

Window program의 기본 개념

by 연원랑 2022. 6. 15.

1. Window의 program 설계 개념.

  Window program의 객체 지향적 분할.

      A) 프로그램의 메인 윈도우를 마치 창틀과 창을 분리해 내듯이 윈도우의 틀과 안쪽의 클라이언트 영역으로

     분리해서 서로 다른 오브젝트로 분리.

  Document 와 View를 분리한 이유.

    A) 기능을 분리하고 클래스의 역할을 분담 시킴으로써, 각 클래스의 구현을 단순화 시킬 수 있음.

    B) 같은 데이터라도 보여주는 방법은 다양할 수 있다는 것임.

 

2. Window Dialog Base Project 생성 시 기본 파일.

  MFC Window program의 기본 실행.

  CWinApp 클래스

    A) 역할.

      (1) 프로그램의 시작과 종료를 담당

      (2) 프로그램이 시작 될 때, 메인 프레임 윈도우를 생성

      (3) 메세지 루프를 돌면서 프로그램을 구동

      (4) 프로그램 전체를 대표하는 기능

 

    B) CWinApp 파생 클래스에서 실제 할 일

      (1) CWinApp 로부터 상속 받은 클래스 초기화 함수 재정의 및 프로그램 초기화 루틴 작성

      (2) ExitInstance 함수는 초기화 함수에 프로그램 초기화를 위해 수행했던 작업들 재정의

  CWnd 클래스

    A) 역할.

      (1) 윈도우의 크기, 위치, 모양, 상태 등을 제어

      (2) 윈도우에서 발생되는 메세지 처리

 

    B) 메세지 처리 원리.

Win32 API 를 이용한 윈도우 프로그램 기본.

// WinMainBasic.cpp : 응용프로그램에대한진입점을정의합니다.
//
#include "stdafx.h"
#include "WinMainBasic.h"
#define MAX_LOADSTRING 100
// 전역변수:
HINSTANCE hInst; // 현재인스턴스입니다.
TCHAR szTitle[MAX_LOADSTRING]; // 제목표시줄텍스트입니다.
TCHAR szWindowClass[MAX_LOADSTRING]; // 기본창클래스이름입니다.
// 이코드모듈에들어있는함수의정방향선언입니다.
ATOM MyRegisterClass(HINSTANCE hInstance);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
int APIENTRY _tWinMain(HINSTANCE hInstance,
 HINSTANCE hPrevInstance,
 LPTSTR lpCmdLine,
int nCmdShow)
{
 UNREFERENCED_PARAMETER(hPrevInstance);
 UNREFERENCED_PARAMETER(lpCmdLine);
// TODO: 여기에코드를입력합니다.
 MSG msg;
 HACCEL hAccelTable;
// 전역문자열을초기화합니다.
 LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
 LoadString(hInstance, IDC_WINMAINBASIC, szWindowClass, MAX_LOADSTRING);
 MyRegisterClass(hInstance);
// 응용프로그램초기화를수행합니다.
if (!InitInstance (hInstance, nCmdShow))
 {
return FALSE;
 }
 hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINMAINBASIC));
// 기본메시지루프입니다.
while (GetMessage(&msg, NULL, 0, 0))
 {
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
 {
 TranslateMessage(&msg);
 DispatchMessage(&msg);
 }
 }
return (int) msg.wParam;
}
//
// 함수: MyRegisterClass()
//
// 목적: 창클래스를등록합니다.
//
// 설명:
//
// Windows 95에서추가된'RegisterClassEx' 함수보다먼저
// 해당코드가Win32 시스템과호환되도록
// 하려는경우에만이함수를사용합니다. 이함수를호출해야
// 해당응용프로그램에연결된
// '올바른형식의' 작은아이콘을가져올수있습니다.
//
ATOM MyRegisterClass(HINSTANCE hInstance)
{
 WNDCLASSEX wcex;
 wcex.cbSize = sizeof(WNDCLASSEX);
 wcex.style = CS_HREDRAW | CS_VREDRAW;
 wcex.lpfnWndProc = WndProc; // 윈도우 메시지를 처리하기 위한 기본 함수 포인터로써 모든 윈도우 응용프로그램은
// WinProc가 있어야함
 wcex.cbClsExtra = 0;
 wcex.cbWndExtra = 0;
 wcex.hInstance = hInstance;
 wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WINMAINBASIC));
 wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
 wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
 wcex.lpszMenuName = MAKEINTRESOURCE(IDC_WINMAINBASIC);
 wcex.lpszClassName = szWindowClass;
 wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
return RegisterClassEx(&wcex);
}
//
// 함수: InitInstance(HINSTANCE, int)
//
// 목적: 인스턴스핸들을저장하고주창을만듭니다.
//
// 설명:
//
// 이함수를통해인스턴스핸들을전역변수에저장하고
// 주프로그램창을만든다음표시합니다.
//
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
 HWND hWnd;
 hInst = hInstance; // 인스턴스핸들을전역변수에저장합니다.
 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
 CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)
 {
return FALSE;
 }
 ShowWindow(hWnd, nCmdShow);
 UpdateWindow(hWnd);
return TRUE;
}
//
// 함수: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// 목적: 주창의메시지를처리합니다.
//
// WM_COMMAND - 응용프로그램메뉴를처리합니다.
// WM_PAINT - 주창을그립니다.
// WM_DESTROY - 종료메시지를게시하고반환합니다.
//
//
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
 PAINTSTRUCT ps;
 HDC hdc;
switch (message)
 {
case WM_COMMAND:
 wmId = LOWORD(wParam);
 wmEvent = HIWORD(wParam);
// 메뉴의선택영역을구문분석합니다.
switch (wmId)
 {
case IDM_ABOUT:
 DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
break;
case IDM_EXIT:
 DestroyWindow(hWnd);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
 }
break;
case WM_PAINT:
 hdc = BeginPaint(hWnd, &ps);
// TODO: 여기에그리기코드를추가합니다.
 EndPaint(hWnd, &ps);
break;
case WM_DESTROY:
 PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd, message, wParam, lParam);
 }
return 0;
}
// 정보대화상자의메시지처리기입니다.
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
 UNREFERENCED_PARAMETER(lParam);
switch (message)
 {
case WM_INITDIALOG:
return (INT_PTR)TRUE;
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
 {
 EndDialog(hDlg, LOWORD(wParam));
return (INT_PTR)TRUE;
 }
break;
 }
return (INT_PTR)FALSE;
}

'MFC and C++' 카테고리의 다른 글

어셈블리어  (0) 2022.06.16
Dump 파일로 디버깅 하기  (0) 2022.06.16

댓글