F.R.I.D.A.Y.

Win32 프로그램 생성하기 6: 사진 암호 part1. 격자 생성 본문

DEV/C C++

Win32 프로그램 생성하기 6: 사진 암호 part1. 격자 생성

F.R.I.D.A.Y. 2021. 4. 2. 22:11
반응형

Windows에서는 사진 암호라 해서 제스쳐를 이용한 로그인 기능을 제공하고 있습니다. 실제 사진 암호처럼 구성하는 것은 어렵겠지만 여러 지점을 순서대로 눌러서 인증을 하는 프로그램을 한 번 생성해보겠습니다.

⁂ 이전 Win32 프로그램 생성하기 5의 최종 코드에서 시작합니다.


격자 생성하기

현재 생성한 윈도우는 아무 무늬가 존재하지 않습니다. 각 지점을 구분지을 수 있는 무언가가 필요합니다. 그래야 정확히 지점을 선택할 수 있으니까요.

우리가 사용할 것들입니다.

  • HDC
  • PAINTSTRUCT
  • MoveToEx
  • LineTo

이 항목을 이용해 WM_PAINT 메시지가 들어왔을 때 격자 무늬를 생성할 겁니다.

이벤트 핸들링

먼저 윈도우가 그려야할 필요가 있을 때 받는 WM_PAINT를 위한 메시지 핸들러가 필요합니다. 이렇게 구성하겠습니다.

LRESULT OnPaint(HWND hwnd) { } LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_CLOSE:{ PostQuitMessage(0); return 0; } case WM_DESTROY: { DestroyWindow(hwnd); return 0; } } switch (uMsg) { case WM_PAINT: { return OnPaint(hwnd); // 메시지 핸들러로 넘겨줍니다. } } return DefWindowProc(hwnd, uMsg, wParam, lParam); } 

WindowProc는 OS로부터 모든 메시지를 받습니다. 따라서 이 함수에서 메시지 처리를 하게되면, 그 길이가 굉장히 길어집니다. 따라서 OnPaint라 불리는 함수로 따로 빼어 작업하겠습니다. 이 때, WM_PAINT는 윈도우 핸들이 필요하므로 HWND 값을 받는 인자 하나를 구성해 만듭니다.

OnPaint

이곳에서 격자무늬를 생성할 겁니다. 격자 무늬는 800x500 크기로 생성하겠습니다. 50px 단위로요.

먼저 DC를 생성해줍니다.

LRESULT OnPaint(HWND hwnd) { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); // 코드 영역 return EndPaint(hwnd, &ps); }

 

BeginPaint는 DC를 얻는 함수이고, EndPaint는 DC를 해제하는 함수입니다. 따라서 이 두 함수는 쌍으로 작성해주어야 합니다.

MoveToEx

격자는 선으로 이루어진 관계로, 선을 그려야합니다. 선은 시작과 끝이 존재하는데, MoveToEx 함수는 시작 위치로 붓을 이동하는 명령을 한다고 보면 됩니다. 코드 영역에 아래의 코드를 입력하고 실행을 시켜봅니다.

 for (int i = 1; i <= 800 / 50; ++i) { MoveToEx(hdc, i * 50 -1 , 0, nullptr); LineTo(hdc, i * 50 -1 , 500); }

격자의 세로 선을 그린 모습

그 코드 아래로 가로 선을 그리는 코드를 추가해줍니다.

 for (int i = 1; i <= 500 / 50; ++i) { MoveToEx(hdc, 0, i * 50, nullptr); LineTo(hdc, 800, i * 50); }

그럼 이미지와 같은 격자가 완성되는 것을 볼 수 있습니다.

중간 코드 점검

여기까지 따라왔다면 아래의 코드를 가지고 있게 됩니다.

LRESULT OnPaint(HWND hwnd) { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); for (int i = 1; i <= 800 / 50; ++i) { MoveToEx(hdc, i * 50 -1 , 0, nullptr); LineTo(hdc, i * 50 -1 , 500); } for (int i = 1; i <= 500 / 50; ++i) { MoveToEx(hdc, 0, i * 50, nullptr); LineTo(hdc, 800, i * 50); } return EndPaint(hwnd, &ps); } 

⁕ WinMain, WindowProc는 변경된 부분이 거의 존재하지 않으므로 작성하지 않습니다.


다음은 격자를 만들었으니, 마우스 입력에 반응하도록 만들어보겠습니다.

# index

728x90
반응형
Comments