Win32_API - GDI 선그리기4(Vector 활용해서 여러 선 저장하기)

컴퓨터/Win32-API

728x90
반응형

서론

지난 글에서 직접 링크드 리스트를 구현하여 여러 선들의 좌표를 저장하여 선을 그렸습니다. 

이런 식으로 하나하나 구현을 하면 공부에는 도움이 되지만, 효율에서는 너무나 떨어지게 됩니다. 

본문에서는 C++ STL에서 제공하는 vector클래스를 사용하여 조금 더 간단하게 선들을 저장할 수 있는 방법에 대해서 알아보도록 합시다.

 

 

 

Win32_API - GDI로 선그리기3(연속해서 여러 선 그리기)

서론 Win32_API - GDI로 선그리기2 (마우스 동작을 이용해봅시다.) 서론 지난 글에서 MoveToEx와 LineTo 2개의 함수를 이용해서 선을 그려봤습니다. 본문에서는 이 두 함수와 마우스 동작에 따른 처리를

blog-of-gon.tistory.com

 

 

C++ - STL vector 클래스 (손쉬운 동적배열)

서론 C++ STL 라이브러리에서 제공하는 vector클래스는 쉽게 원소를 추가 및 제거할 수 있는 가변 배열의 형태를 가진 컨테이너입니다. 즉 쉽게 동적으로 메모리를 할당하여 데이터를 관리할 수 있

blog-of-gon.tistory.com

 

라이브러리 추가

C++의 vector 클래스를 사용하기 위해서 라이브러리를 소스코드에 추가해줍시다.

#include <vector>
#include <algorithm>

 

vector클래스 선언

전역 변수로 vector클래스를 선언해 주도록 합시다. 이때 vector클래스에 담길 값은 POINT구조체 자료형입니다.

이때 pair 클래스를 응용해서 담아주도록 합시다.

std::vector<std::pair<POINT,POINT>> list;

 

선언한 vector를 통해 좌표 값 저장하기

WM_LBUTTONUP 동작을 하는 과정에서 좌표를 저장하도록 선언합니다. 이때 pair의 형태에 시작과 끝의 상태 좌표를 넣어주고 이 pair를 vector클래스에 넣어주도록 합시다.

    case WM_LBUTTONUP:
        end_pos.x = GET_X_LPARAM(lParam);
        end_pos.y = GET_Y_LPARAM(lParam);

        std::pair<POINT, POINT> temp;
        temp.first = start_pos;
        temp.second = end_pos;
        list.push_back(temp);
        count++;
        status = 0;
        break;

 

WM_PAINT 처리하기 (저장한 값으로 그리기)

이제 vector에서 하나씩 값을 꺼내와서 처리하도록 합시다.

    case WM_PAINT:
        {
            PAINTSTRUCT ps;
            hdc = BeginPaint(hWnd, &ps);

            if (status == 1) {
                MoveToEx(hdc, start_pos.x, start_pos.y, NULL);
                LineTo(hdc, end_pos.x, end_pos.y);
            }
            //예제 4를 위한 소스코드
            for (int i = 0; i < list.size(); i++)
            {
                MoveToEx(hdc, list[i].first.x, list[i].first.y, NULL);
                LineTo(hdc, list[i].second.x, list[i].second.y);
                }
            EndPaint(hWnd, &ps);
        }
        break;

 

지난 C언어로 직접 연결 리스트를 구현한 것보다 손쉽게 값들을 저장하고 사용할 수 있습니다. 또한 오랫동안 사용해온 라이브러리이기 때문에 그만큼 예외 발생에 대한 처리가 쉽고 문제가 생길 확률이 낮습니다.

 

지난번 글의 소스코드와 차이를 한번 비교해 보는 것도 좋은 방법입니다.

 

아직 문제점이 하나 더 있습니다.

해당 소스코드를 실행해서 프로그램을 동작시키면 원하는 대로 직선들이 그려지며 잘 출력하고 있습니다.

하지만 직선을 계속해서 그리다보면 여러분이 보시는 화면이 깜박거리는 현상이 발생됩니다. GDI 선 그리기 마지막에서는 이 문제점의 원인을 확인하고 해결하는 방법에 대해서 알아보도록 합시다.

 

728x90
반응형

Commnet

G91개발일지

Gon91(지구일)

91년생 공학엔지니어의 개발일지

TODAY :

YESTER DAY :

TOTAL :