1. 프로젝트 생성
우선 시작하기에 앞서 WinAPI를 먼저 설정을 한다.
VisualStdio를 통해 만들것이며 c++의 window데스크톱 애플리케이션으로 프로젝트를 하나 만들어준다.

생성을 하고 보면 이미 어느정도 작성되어있는 기본적인 코드들이 있다 해당 코드들은 f5를 눌러 프로그램을 실행해보면

이러한 창을 만드는 기본적인 코드이다.
기본적인 코드에 대해서 이해를 한 후 여기에 필요한 코드들을 하나씩 추가해본다.
2. WinMain
2-1 화면
프로그램이 시작할 제일 처음 호출하는 함수로
주로 창을 생성하고, 메세지 루프를 돌리는 역할을 맡는다.

해당 함수의 안의 코드안에 아래와 같은 부분이 창을 생성하는 부분이다.

해당 InitInstance 함수는 정의로 이동하여 보면

CreateWindowW로 초기에 윈도우 창관련 코드가 있다.
해당 안에 들어있는 매개변수로 조정을 할 수 있는데 하나하나 설명을 하면
szWindowClass = 생성할때 호출할 클래스의 이름
szTitle = 생성된 윈도우 창의 이름
이렇게 두개는 전역변수로 가보면 아래 처럼 초기화 하는 부분이 있다.


이런식으로 바꾸고 실행하면

이렇게 제목이 바뀐다.
WS_OVERLAPPEDWINDOW = 스타일 변경 옵션 변수
CW_USEDEFAULT, 0 = 시작 위치
CW_USEDEFAULT, 0 = 창 크기
해당 두개는 창 크기와 위치 설정하는 변수이다.
0,0 으로 하면 왼쪽 위의 좌표를 가리킨다. 대강 값을 변경해보면서 하면 감을 잡을 수 있다.
2-2 메세지 루프

입출력 관련 내용, 마우스 움직임, 클릭 , 키보드 입력을 돌려주는 루프부분으로
실질적으로 처리해주는 부분은 따로 있다.
WndProc 윈도우프로시저라는 부분이다.

f9를 이용해서 각 case에 하나씩 걸어주고 실행을 하여 기본 버튼들을 눌러보면 알 수 있다.
WM_COMMAND = 메뉴 눌렀을 경우
IDM_ABOUT = 메뉴 안의 정보
IDM_EXIT = 메뉴 안의 끝내기
WM_PAINT = 화면을 생성할때 (그릴때)
화면에 글씨를 한번 적어보기 전에 기본적으로 알아야 하는 정보들이 있다.
앞에 H가 붙은 부분들은 Handle이라는 뜻으로, H 뒤에 붙은 친구를 컨트롤하는 손잡이 역할이라고 보면 된다.
DC = Device Context로 DC영역을 가리키는 말인데, 내가 표현 또는 구현할 수 있는 그릴 수 있는 화면을 DC영역이라 한다.
그릴 수 없는 부분 제목이나 메뉴있던 영역은 캡션이라고 부른다.
즉 본문 코드에서 나오는 HDC는 출력하는 부분 모두에 관여 컨트롤한다고 보면 된다.
이제 화면에 글씨를 적어보자
TextOut을 이용해서 적을 수 있다. 화면을 그릴떄 필요한 hdc, 시작위치 좌표(DC영역 기준), 텍스트, 텍스트 크기


다음은 그리기의 기본인 점을 찍는 것부터 해보자.
SetPixel을 이용한다, 좌표 두개, 점 색상 rgb로 주어진다.
점 하나만 찍으면 잘 보이지 않으니 반복문을 이용해서 여러개 찍어본다.


좌표 두곳에 +i 를해서 하면 대각선 아래, 한쪽만 +i를 해주면 아마 직선이 나올 것이다.
이중 포문으로해서 +i +j를 해주면 아마 사각형이 나올 것이다.
물론 점으로 표현 안해줘도

따로 함수가 존재한다.
마우스 버튼을 이용해 점 찍기


점만 찍어도 상관은 없지만 for문 돌려서 점으로 선 그어주기


WM_MOUSEMOVE를 이용하면 안눌러도 마우스 움직임에 따라 선을 막 그어줌
그렇다면 마우스 버튼을 눌러서 점을 그어보고 싶다면 어떻게 해야 할까?
처음엔 if (WM_LBUTTONDOWN)을 하고 안에 선긋는걸 해봤는데 동작이 안된다.. ㅋㅋㅋㅋ
찾아보니 변수를 생성해서 해야함
일단 전역 변수로 이전 좌표를 만들어줄 포인트와 눌렀는지 확인을 위한 bool변수를 만들어준다.
// 전역변수로 하는거보다 struct로하는게 나은가?는 잘모르겠다


전체 코드는 이렇게 나온다.
아까 위의 전역변수를 객체로 만드는 방법이 있다.
새로운 헤더파일을 하나 만들어 클래스로 관리 하는 방법이다.
이제 해당 클래스 함수를 적절한 타이밍에 꺼내어 쓰면된다.

하는 중에 문제가 생겼다.
프레임 워크에서 헤더파일을 읽지를 못한다.

이거 먼저 해결하고 가겠다.
파일의 위치오류로 상대경로 기준으로 framework.h파일의 위치가 아닌 컴파일 기준 경로로 되어있어 생기는 오류로 알게되어.
../ 을 이용해 더 위로 타고 올라가 object를 찾아 include를 해주면 해결이 되었다.

이제 다시 본문으로 와서 기존에 작성했던 부분들을 추가 및 수정을 진행한다.
Paintool은 포인터로 가져오면 힙 영역을 사용하여 데이터 영역으로 가는 비용을 최소화 시켜 효율성을 올리고, 가독성도 좋아진다.

HWND를 객체에 매개변수로 넣어주고 기존의 코드 주석처리 하고 코드 수정해
객체화를 해준다.


이제 객체화 한 클래스 함수로 이동하여 기존의 코드를 동작시켜줄 내부 함수를 작성해준다.

이렇게 하고 실행하면 아까와 같은 동작을 하게 된다.
이제 키보드 입력을 통해 펜 색깔 바꿔주기
아까 만든 PaintTool 클래스에서 keydown함수를 만들어 매개변수로 WPARAM값을 넣어주고
펜색깔의 개수를 초기화해줄 상수값 PEN_SIZE와 배열 hPens
브러쉬 크기 변경을 위한 hBrushes 만들어준다.

그다음 메인 함수의 케스에 키다운을 추가해주고 함수 불러오기

색을 바꾸기 위한 PaintTool의 OnKeyDown내부 함수 코드 작성

실행 해보면

3색이 나온다.
'WinAPI' 카테고리의 다른 글
| 다시 공부 하는 Win API (6) - 슈팅 게임 만들기(4) (0) | 2025.11.27 |
|---|---|
| 다시 공부 하는 Win API (5) - 슈팅 게임 만들기(3) (0) | 2025.11.25 |
| 다시 공부 하는 Win API (4) - 슈팅 게임 만들기(2) (0) | 2025.10.20 |
| 다시 공부 하는 Win API (3) - 슈팅 게임 만들기(1) (0) | 2025.10.18 |
| 다시 공부 하는 Win API (2) - 점, 선, 도형 그리기 및 색상 변경 (0) | 2025.10.16 |