기본적인 사각형을 그리는 코드를 조금 자세히 살펴봤으니 해당하는 구조로 사용해야하는 이유에 대해서
실험을 통해 알아보도록 하겠습니다.
* OLD를 왜 써야 하는가?
이 게시물에 가장 중요한 주제입니다. 간단히 말해서 기존에 생성한 GDI 오브잭트를 삭제하기 위해서 입니다.
계속해서 GDI 오브잭트를 생성하고 삭제를 하지 않는 다면, 나중에는 리소스가 쌓여서 프로그램에 악영향을
미치게 될 것 입니다.
물론 간단한 프로그램은 괜찮겠지만 지속적인 추후 프로그래밍을 위해 생성된 오브잭트와 읽어드린 파일,
생성한 힙 메모리 등은 당연히 해제를 해줘야 하는것이 좋은 습관이기 때문입니다.
그럼 OLD를 사용하는 이유에 대해서 알아보도록 하겠습니다.
1. 기존에 선택한 속성의 GDI 오브잭트는 선택된 상태에서 삭제가 되지 않습니다.
위에서 검정색상으로 채워진 사각형을 그리는 BRUSH를 생성한 후에 사각형하나를 그리고 MyBrush를 삭제한 후에 다시 사각형을 그렸습니다.
결과를 예상해보자면, 검정색을 채우는 MyBrush가 선택된 상태에서는 검은색이 그려지고 삭제된 후에는 흰색 사각형이 출력되어야 합니다.
[결과]
하지만, 결과를 보면 2개의 검은색 사각형이 그려집니다.
즉 MyBrush가 삭제가 되지 않았다는 것인데요, 처음에 DC기본값으로 선택된 GDI BRUSH 오브잭트를 사용자가 생성한 Brush로 바꾸어 주었는데 만약 선택된 MyBrush가 삭제된다면 더 이상 DC에 BRUSH를 그릴 오브잭트가 남아있지 않기 때문입니다.
그렇기에 현재 선택된 GDI 오브잭트는 삭제가 될 수 없으며 이를 대채하기 위해서 Old가 필요합니다.
2. 기존 GDI 오브잭트의 속성을 사용하기 위해서 필요합니다.
이전 게시물을 보면 SelectObject 는 매크로 함수로 지정된 디바이스 컨텍스트(DC)로 오브잭트를 선택하고
새로운 객체가 동일한 유형의 이전 객체를 대채한다고 설명하였습니다.
즉 동일한 GDI 오브잭트 끼리는 밀어낸다는 것인데요, 그렇다면 동일한 BRUSH를 통해서 밀어낸다면 어떨까요?
아래 코드를 보면 검은색 사각형의 GDI 오브잭트 속성으로 기존에 빨간색 상자를 밀어냈습니다.
[결과]
결과는 예상과 동일한 결과가 나왔습니다.
하지만 위에 코드는 정상적으로 기존 BRUSH는 삭제해주었지만, 기존에 설정된 BRUSH의 색상을 다시 불러올 수 없습니다. 만약 원래는 녹색으로만 BRUSH 설정을 원하고 처음 한개만 빨간색으로 칠하기를 원하는 코드를
다른 함수로 빠져나가게 작성하면 어떨까요?
위에서 보면 WM_PAINT 메세지가 실행될 경우 처음 BRUSH의 색상을 녹색으로 설정하였고
DrawBrush 함수에서 빨간색으로 BRUSH를 생성한 후에 사각형을 그리고 검은색 BRUSH로 밀어낸후에
빨간색 BRUSH를 삭제했습니다.
이후 다시 WM_PAINT case로 돌아와서 설정된 녹색으로 사각형이 그려지길 바라지만 아래와 같이 하지만 이럴경우 아래와 같은 결과가 발생합니다.
이 경우 검은색 BRUSH가 DC에 지정되어 있기 때문에 더 이상 녹색은 선언만 하고 다시 사용할 수 없게 됩니다.
하지만 old를 사용하게 되면 위 현상이 해결 됩니다.
* OLD를 써서 위 문제들을 해결.
결국에는 동일한 기능으로 발생된 부분이지만 위에서 제시한 문제점 2개를 해결한 코드입니다.
1. 기존에 선택한 속성의 GDI 오브잭트는 선택된 상태에서 삭제를 위한 밀어내기
처음 회색으로 사각형을 채운 후 해당하는 MyBrush를 삭제한 후에 사각형을 그려서 삭제되었는지 확인
하였습니다. 정상적으로 삭제된 부분이 확인되네요.
2. 기존 GDI 오브잭트의 속성을 사용 (기존에 선택된 GDI 오브잭트 완전 삭제)
[결과]
OldBrush를 통해서 빨간색의 오브잭트만을 삭제하여 주었고, DrawBrush 함수에서 완전히 빨간색 BRUSH를
삭제해주었기 때문에 DrawBrush 호출 후에WM_PAINT에 다시 돌아왔을때 녹색을 사용할 수 있습니다.
예제에 다양한 속성을 주기 위해서 이것 저것 속성을 사용했더니 오히려..예제에 일관성이 없고 더러워 져버렸습니다. ㅠㅠ.. 또 오타도 있네요..DeawBrush 라니.. 다음에는 신경을 써야겠습니다.
'프로그래밍 관련 > Win API' 카테고리의 다른 글
WIndows API - #9-4 그래픽 처리 - (비트맵 출력)(2) - 코드 살펴보기 (0) | 2015.09.06 |
---|---|
WIndows API - #9-3 그래픽 처리 - (비트맵 출력) (1) (0) | 2015.09.06 |
WIndows API - #9 -1. 그래픽 처리 (Old를 같이 쓰는 이유) (1) (0) | 2015.09.03 |
WIndows API - #8. 충돌 처리 (사각형 , 원형 , 마우스) - 작성 중.. (0) | 2015.09.01 |
WIndows API - #7. 키보드, 마우스 입력, 좌표 (InvalidateRect) (0) | 2015.09.01 |