컴퓨터/Win32-API
지난 포스트에 이어서 그림판 구현하기 본격적인 소스코드 구현을 시작해 보도록 합시다.
기본적으로 소스코드를 구현할 틀을 만들어 보도록 합시다.
우선 프로젝트를 진행하기 전에 파일을 나누려고 합니다.
구현할 소스코드가 많지 않으니, 간단하게 3개 정도로 나누도록 하겠습니다.
// 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;
}
#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를 통해서는 구현된 기능들의 세부 기능을 쉽게 살펴볼 수 있게 하기 위함입니다.
현 프로젝트의 디렉터리 구조를 보면 아래와 같습니다.
헤더 파일과 소스코드 파일에 대한 이해가 부족하다면 링크를 참조해주세요.
우선 메인 윈도에 관한 함수를 생성해 보도록 합시다.
메인 윈도우에 관련된 윈도 정보를 설정한 후 등록하고, 윈도를 생성하는 과정까지 하나의 함수로 묶어서 생성했습니다.
해당 위치에 함수의 원형을 선언해 주도록 합시다.
#pragma once
#include "framework.h"
#include "Paint.h"
//초기 구조 적용 함수
HWND InitMainWindowSet(HINSTANCE hInstance, WNDPROC WndProc,const WCHAR* name);
해당 함수의 세부적인 부분을 구현해 보도록 합시다.
#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가지 스타일을 적용했습니다.
// 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 - 실습 - 그림판 구현하기 4 (버튼 제어 추가 & 오류 수정) (0) | 2022.04.19 |
---|---|
WindowsAPI - 실습 - 그림판 구현하기 3 ( UI부분 구현 ) (0) | 2022.04.15 |
WindowsAPI - 실습 - 그림판 구현하기 1 (개요) (0) | 2022.04.13 |
Win32_API - 체크버튼과 토글버튼 구현하기 (0) | 2022.04.11 |
Win32_API - 아이콘 버튼 (버튼에 이미지를 설정하기) (0) | 2022.04.08 |
91년생 공학엔지니어의 개발일지
TODAY :
YESTER DAY :
TOTAL :
Commnet