WindowsAPI - 실습 - 그림판 구현하기 2 ( 프로젝트 구조 설계 및 시작)

컴퓨터/Win32-API

728x90
반응형

서론

지난 포스트에 이어서 그림판 구현하기 본격적인 소스코드 구현을 시작해 보도록 합시다. 

기본적으로 소스코드를 구현할 틀을 만들어 보도록 합시다.

 

지난 글

 

 

WindowsAPI - 실습 - 그림판 구현하기 1 (개요)

서론 지난 포스트에서 기본적인 WindowsAPI를 만들기 위한 몇 가지 방법들을 익혀왔습니다. 이제 배운 내용들을 합쳐서 간단한 그림판 기능을 구현하는 실습을 해보도록 하겠습니다. 본문에서는

blog-of-gon.tistory.com

 

프로젝트 파일 구조 

우선 프로젝트를 진행하기 전에 파일을 나누려고 합니다. 

구현할 소스코드가 많지 않으니, 간단하게 3개 정도로 나누도록 하겠습니다. 

  • WinMain과 WinProc가 존재하는 소스코드 (Paint.cpp)
더보기
// Paint.cpp : Defines the entry point for the application.
//

#include "framework.h"
#include "Paint.h"

//함수 원형 선언 부분
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);

// 전역변수
HINSTANCE hInst;                               


// WinMain함수 부분
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    hInst = hInstance; // 인스턴스 핸들을 전역 변수에 저장합니다.

    /*윈도우 설정 및 메인 윈도우를 생성합니다.*/
    HWND hWnd = InitMainWindowSet(hInstance, &WndProc, L"Paint");
    //정상적으로 생성되었다면 윈도우를 갱신합니다.
    if (!hWnd)
    {
        return FALSE;
    }
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);
    MSG msg;
    // 기본 메시지 루프입니다:
    while (GetMessage(&msg, nullptr, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return (int)msg.wParam;
}

// WndProc 함수부분
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    switch (message)
    {
    case WM_CREATE:
    {
        //버튼 생성 및 이미지 씌우기
        break;
    }
    case WM_COMMAND:
    {
        //각종 버튼에 따른 동작 
        break;
    }
        /*각종 마우스 동작에 따른 컨트롤*/
    case WM_MOUSEMOVE:
    {
        break;
    }
    case WM_LBUTTONDOWN:
    {
        break;
    }
    case WM_LBUTTONUP:
    {
        break;
    }
    case WM_RBUTTONDOWN:
    {
        break;
    }
    case WM_RBUTTONUP:
    {
        break;
    }
    case WM_PAINT:
    {
        PAINTSTRUCT ps;
        HDC hdc = BeginPaint(hWnd, &ps);
        // TODO: Add any drawing code that uses hdc here...
        EndPaint(hWnd, &ps);
        break;
    }
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
    default:
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
}
  • 내가 만든 함수들을 보관하는 소스코드 (MySource.cpp)
더보기
#include "MySource.h"

//윈도우 창 설정
HWND InitMainWindowSet(HINSTANCE hInstance, WNDPROC WndProc,const WCHAR* name)
{
    WNDCLASSEXW wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = NULL;
    wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = name;
    wcex.hIconSm = NULL;
    RegisterClassExW(&wcex);
    return CreateWindowW(name, name, WS_OVERLAPPEDWINDOW,
        CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr);
}

//버튼생성하기 
//이미지 씌우기
//더블버퍼링
//색상선택
//버튼 제어
//등등 기능을 쪼개서 하나씩 추가할 예정

이 2가지 소스코드를 작성하는 곳과 리소스를 이용해서 구현을 하도록 합시다. 이후에 필요하다면 조금 더 세분화하는 작업을 거치도록 하겠습니다.

 

목적은 

Paint.ccp를 통해서는 직관적으로 프로그램이 흘러가는 과정을 볼 수 있도록 하고

MySource.cpp를 통해서는 구현된 기능들의 세부 기능을 쉽게 살펴볼 수 있게 하기 위함입니다.

현 프로젝트의 디렉터리 구조를 보면 아래와 같습니다.

헤더 파일과 소스코드 파일에 대한 이해가 부족하다면 링크를 참조해주세요.

 

 

메인 윈도우 창 등록 및 생성하기

우선 메인 윈도에 관한 함수를 생성해 보도록 합시다. 

메인 윈도우에 관련된 윈도 정보를 설정한 후 등록하고, 윈도를 생성하는 과정까지 하나의 함수로 묶어서 생성했습니다.

  • 함수의 원형  MySource.h

해당 위치에 함수의 원형을 선언해 주도록 합시다.

#pragma once

#include "framework.h"
#include "Paint.h"

//초기 구조 적용 함수
HWND InitMainWindowSet(HINSTANCE hInstance, WNDPROC WndProc,const WCHAR* name);

 

  • 함수의 구현 부분 MySource.cpp

해당 함수의 세부적인 부분을 구현해 보도록 합시다.

#include "MySource.h"

//윈도우 창 설정
HWND InitMainWindowSet(HINSTANCE hInstance, WNDPROC WndProc,const WCHAR* name)
{
    //윈도우 창 구조체 설정 및 적용하기
    WNDCLASSEXW wcex;
    wcex.cbSize = sizeof(WNDCLASSEX);
    wcex.style = CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc = WndProc;
    wcex.cbClsExtra = 0;
    wcex.cbWndExtra = 0;
    wcex.hInstance = hInstance;
    wcex.hIcon = NULL;
    wcex.hCursor = LoadCursor(nullptr, IDC_ARROW);
    wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
    wcex.lpszMenuName = NULL;
    wcex.lpszClassName = name;
    wcex.hIconSm = NULL;
    RegisterClassExW(&wcex);

    //해당 윈도우 창을 가지고와서 윈도우 창 생성하기
    return CreateWindowW(name, name, WS_MAXIMIZE| WS_SYSMENU,
        100, 100, 750, 750, nullptr, nullptr, hInstance, nullptr);
}

CreateWindow 과정에서 2가지 스타일을 적용했습니다.

  • WS_MAXIMIZE - 설정한 최댓값으로 윈도를 불러옵니다.
  • WS_SYSMENU - 시스템 메뉴를 불러옵니다.

 

  • WinMain에서 함수 적용하기
// WinMain함수 부분
int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    hInst = hInstance; // 인스턴스 핸들을 전역 변수에 저장합니다.

    /*윈도우 설정 및 메인 윈도우를 생성합니다.*/
    HWND hWnd = InitMainWindowSet(hInstance, &WndProc, L"Paint");
    //정상적으로 생성되었다면 윈도우를 갱신합니다.
    if (!hWnd)
    {
        return FALSE;
    }
    ShowWindow(hWnd, nCmdShow);
    UpdateWindow(hWnd);

WinMain 부분에서는 InitMainWindowSet 함수를 호출한 것만 확인이 됩니다. 

간단하게 메인 윈도우를 생성하는 과정을 확인할 수 있습니다.

 

구현 화면

아무것도 없는 윈도우가 하나 생성이 되었습니다.

이제 하나씩 기능들을 구현해가면서 프로그램을 만들어 보도록 하겠습니다.

 

 

WindowsAPI - 실습 - 그림판 구현하기 3 ( UI부분 구현 )

서론 본문에서는 지난 포스트에서 작성한 구조에 컨트롤 버튼 등을 만드는 UI작업을 진행해 보도록 하겠습니다. 2개의 토글 버튼과 색상을 제어할수 있는 색상판을 만들어 보도록 합시다. 이전

blog-of-gon.tistory.com

 

728x90
반응형

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :