본문 바로가기

API

StockObject를사용한 GDI브러쉬 색 변경

틀린 정보가 다소 있을 수 있습니다! 만약 틀린 내용이 있을 시 댓글로 피드백 주시면 감사할 듯싶습니다!



일단 dc를 얻어온 후, Rectangle을 사용해 사각형을 출력한다.

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam){
   HDC hdc;
   PAINTSTRUCT ps;
   switch(iMessage){
   case WM_PAINT:
           hdc = BeginPaint(hWnd, &ps);
           Rectangle(hdc, 50, 50, 300, 300);
           EndPaint(hWnd, &ps);
           return 0;
   case WM_DESTROY:
           PostQuitMessage(0);
           return 0;
    }
    return (DefWindowProc(hWnd, iMessage, wParam, lParam);
}


그러면 위와 같이 출력될 텐데, GDI오브젝트를 선택하지도, 만들지도 않았기 때문에 사각형 내부가 흰색으로 칠해져 있을 것이다.


이 상태에서 브러쉬를 변경하여 채워지는 면을 흰색이 아닌 다른 색으로 바꾸어 보도록 하자.


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

	switch (iMessage) {
	case WM_PAINT:
		hdc = BeginPaint(hWnd, &ps);
		MyBrush = (HBRUSH)GetStockObject(GRAY_BRUSH);
		OldBrush = (HBRUSH)SelectObject(hdc, MyBrush);
		Rectangle(hdc, 50, 50, 300, 300);
		SelectObject(hdc, OldBrush);
		EndPaint(hWnd, &ps);
		return 0;
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	}
	return (DefWindowProc(hWnd, iMessage, wParam, lParam));
}


코드를 수정하면



이렇게 사각형의 내부가 회색으로 채워지게 된다.


코드를 보도록 하자.



브러쉬 핸들을 저장할 변수 두 개를 선언하는데, MyBrush는 그리기에 사용할 브러쉬 핸들이고, OldBrush는 이전에 사용한 브러쉬 핸들을 저장하는 역할을 한다.

HBRUSH MyBrush,OldBrush;



이제 브러쉬를 변경해보도록 하자. 일단 그러기 위해서는 아래와 같은 함수를 사용해야 한다.

HGDIOBJ GetStockObject(int fnObject);



GetStockObject 함수로 회색 브러쉬 (GRAY_BRUSH) 핸들을 얻되, MyBrush 변수에 대입하기 위해 (HBRUSH)형으로 캐스팅 해준다.

MyBrush = (HBRUSH)GetStockObject(GRAY_BRUSH);



그리고 구한 브러쉬를 사용하기 위해 GDI오브젝트를 DC에 선택하는데, 이 때는 다음 함수를 사용한다.

HGDIOBJ SelectObject(HDC hdc, HGDIOBJ hgdiobj);


첫 번째 인수로 DC의 핸들을 주고 두 번째 인수로 GDI오브젝트의 핸들을 주면 DC에 해당 오브젝트를 선택한다. 이후부터 GDI는 그래픽을 출력할 때 선택된 오브젝트를 사용한다.



여기서 끝일것 같지만 아직 한가지를 더 해야한다. 여기서 멈춘다면 어떻게 될 것같은가?



그렇다. 현재 DC에 선택된 브러쉬핸들은 MyBrush이기 때문에, 원이나 사각형을 출력하는 코드를 추가한다면 그 도형들의 내부는 회색으로 칠해져 나올 것이다.


동적할당을 하면 메모리를 해제시켜야 하고, 핸들을 발급받으면 언젠가는 반납해야 한다. 그러므로 우리는 GDI오브젝트의 핸들을 이전에 사용한 브러쉬 핸들로 바꿔줄 필요가 있다.


그리고 이 중요한 역할을 해줄 변수가 바로 OldBrush다.


SelectObject는 이전의 선택되었던 같은 종류의 오브젝트의 핸들을 리턴한다. 새로운 오브젝트가 들어가면 원래 들어가 있던 오브젝트가 밀려 나온다고 생각하면 된다.


아래의 구문에서 우리는 이전에 선택된 같은 종류의 오브젝트의 핸들을 HBRUSH로 캐스팅하여 OldBrush 변수에 대입하였다.

OldBrush = (HBRUSH)SelectObject(hdc, MyBrush);



다시 한번 핸들과 이전의 선택된 GDI오브젝트를 전달해주면, 정상적으로 복구된다.

SelectObject(hdc, OldBrush);




'API' 카테고리의 다른 글

Old의 의미  (0) 2018.01.22
브러쉬 만들기  (0) 2018.01.22
나만의 펜을 만들어 보자!  (0) 2018.01.20
GDI?  (0) 2018.01.14
LoadString  (0) 2018.01.14