그림 그리기 프로그램 만들기

상준·2025년 9월 10일

Visual Studio 2022 프로그램 설치

웹사이트(https://visualstudio.microsoft.com/ko/vs/)에서 [Visual Studio 다운로드]를 클릭하고 VisualStudioSetup.exe 파일 실행시키기


MFC를 이용하기 위해 C++를 사용한 데스크톱 개발에서 'C++ MFC(x86 및 x64)'를 선택한 후 설치

Visual Studio 2022를 실행시켜 시작 화면에서 [새 프로젝트 만들기]를 선택

[새 프로젝트 만들기]를 선택한 후 [Windows 데스크톱 마법사] 템플릿을 선택하고 다음 버튼

찾지 못하였다면 하단의 [추가 도구 및 기능 설치]를 클릭한 후 설치

[새 프로젝트 구성]의 [프로젝트 이름]에 프로젝트 이름을 입력하고 default 값을 그래도 두고 만들기 버튼

[애플리케이션 종류] 콤보 박스에서 [데스크톱 애플리케이션(.exe)] 항목을 선택한 후 [추가 옵션]에서 [빈 프로젝트]를 체크하고 확인 버튼 누르면 프로젝트가 만들어짐

프로젝트가 생성되면 [솔루션 탐색기]의 [소스 파일]을 오른쪽 마우스를 눌러 [추가] - [새 항목]을 선택

cpp파일에 소스 코드 입력

draw.cpp

#include <Windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {
	WNDCLASS WndClass; // 윈도우 클래스 구조체
	HWND hwnd;		   // 윈도우 핸들
	MSG msg;		   // 메시지 구조체

	WndClass.style = CS_HREDRAW | CS_VREDRAW;
	WndClass.lpfnWndProc = WndProc;	// 윈도우 프로시저
	WndClass.cbClsExtra = 0;		// 윈도우 클래스 데이터영역
	WndClass.cbWndExtra = 0;		// 윈도우 데이터 영역
	WndClass.hInstance = hInstance;	// 인스턴스 핸들
	WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); // 아이콘 핸들
	WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);   // 커서 핸들
	WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
	// 배경 브러시 핸들(밝은 회색배경)
	WndClass.lpszMenuName = NULL;			 // 메뉴 이름
	WndClass.lpszClassName = TEXT("Mclass"); // 윈도우 클래스 이름
	if (!RegisterClass(&WndClass)) return 1; // 윈도우 클래스 register

	hwnd = CreateWindow(		    // 윈도우 생성 API 함수
		TEXT("MClass"),			   // 등록된 윈도우 클래스 이름
		TEXT("마우스로 그림그리기"),  // 타이틀바에 출력될 문자
		WS_OVERLAPPEDWINDOW,	   // 윈도우 스타일
		CW_USEDEFAULT,			   // 윈도우좌측상단의 x좌표
		CW_USEDEFAULT,			   // 윈도우좌측상단의 y좌표
		CW_USEDEFAULT,			   // 윈도우의 너비
		CW_USEDEFAULT,			   // 윈도우의 높이
		NULL,					   // 부모 윈도우의 핸들
		NULL,					   // 메뉴 또는 자식 윈도우의 핸들
		hInstance,				   // 어플리케이션 인스턴스 핸들
		NULL					   // 윈도우 생성 데이터의 주소
	);
	ShowWindow(hwnd, nCmdShow);	   // 프레인 윈도우를 화면에 표시

	while (GetMessage(&msg, NULL, 0, 0) > 0) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) {
	HDC hdc;
	PAINTSTRUCT ps;

	static POINT MousePos; // 마우스 x,y 좌표를 저장할 변수

	static BOOL bDrawing = FALSE;

	switch (iMessage) {
		case WM_LBUTTONDOWN:
			MousePos.x = LOWORD(lParam);
			MousePos.y = HIWORD(lParam);
			bDrawing = TRUE;
			SetCapture(hWnd);
			return 0;
		case WM_MOUSEMOVE:
			if (bDrawing == TRUE) {
				hdc = GetDC(hWnd);
				MoveToEx(hdc, MousePos.x, MousePos.y, NULL);
				MousePos.x = LOWORD(lParam);
				MousePos.y = HIWORD(lParam);
				LineTo(hdc, MousePos.x, MousePos.y);
				ReleaseDC(hWnd, hdc);
			}
			return 0;
		case WM_LBUTTONUP:
			bDrawing = FALSE;
			ReleaseCapture();
			return 0;
		case WM_PAINT:
			hdc = BeginPaint(hWnd, &ps);
			EndPaint(hWnd, &ps);
			return 0;
		case WM_DESTROY:
			PostQuitMessage(0);
			return 0;
	}
	return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}

[Ctrl + F5] 키를 눌러서 프로그램을 실행시키거나 로컬 Windows 디버거를 클릭해서 실행

profile
컴공생 공부

0개의 댓글