컴퓨터/Win32-API
지난 포스트에 이어서 그림판 구현하기 본격적인 소스코드 구현을 시작해 보도록 합시다.
기본적으로 소스코드를 구현할 틀을 만들어 보도록 합시다.
WindowsAPI - 실습 - 그림판 구현하기 1 (개요)
서론 지난 포스트에서 기본적인 WindowsAPI를 만들기 위한 몇 가지 방법들을 익혀왔습니다. 이제 배운 내용들을 합쳐서 간단한 그림판 기능을 구현하는 실습을 해보도록 하겠습니다. 본문에서는
blog-of-gon.tistory.com
우선 프로젝트를 진행하기 전에 파일을 나누려고 합니다.
구현할 소스코드가 많지 않으니, 간단하게 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 - 실습 - 그림판 구현하기 3 ( UI부분 구현 )
서론 본문에서는 지난 포스트에서 작성한 구조에 컨트롤 버튼 등을 만드는 UI작업을 진행해 보도록 하겠습니다. 2개의 토글 버튼과 색상을 제어할수 있는 색상판을 만들어 보도록 합시다. 이전
blog-of-gon.tistory.com
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