본문 바로가기

API

색, 브러시, 투명 오브젝트


색상


윈도우즈에서는 색상값을 표현하기 위해 COLORREF라는 데이터형을 사용

typedef DWORD COLORREF;


COLORREF형은 부호없는 32비트 크기의 정수형이며 8비트씩 빨간색 초록색 파란색의 농도를 나타내며 상위 8비트는 사용되지 않는다.

1바이트의 크기를 가지므로 0~255까지의 농도를 표현할 수 있다.

사용안함

B

G

R

RGB값 -> RGB(R,G,B)



펜은 선을 그을 때 사용되는 GDI 오브젝트이다. 윈도우즈가 제공하는 스톡펜은 흰색, 검정색, 투명색 세 가지다.

HPEN CreatePen(int fnPenStyle, int nWidth, COLORREF cr Color);


fnPenStyle

그려질 선의 모양을 지정한다. 선의 모양은 굵기가 1일 때만 효과가 있으며 굵기가 2이상이면 무조건 실선으로 그려진다.(즉, 굵은점선은 그릴 수 없다.)


nWidth

선의 폭을 지정한다.


crColor

선의 색상을 지정한다. 예) RGB(0,0,255) -> 파란색


LRESULT OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)

{

        HDC hdc;

        PAINTSTRUCT ps;

        HPEN MyPen, OldPen;


        hdc = BeginPaint(hWnd, &ps);

        MyPen = CreatePen(PS_SOLID, 1, RGB(0,0,255));   
    
//현재핸들 = GetStockObject(선모양,선굵기,색상);

        OldPen = (HPEN)SelectObject(hdc, MyPen);        
    
//이전의 pen핸들값 = SeleteObject(hdc,현재핸들);

        Rectangle(hdc,50,50,300,200);

        SelectObject(hdc, OldPen);

        DeleteObject(MyPen);  //GDI오브젝트도 메모리를 사용하기 때문에 사용후 삭제

        EndPaint(hWnd, &ps);

        return 0;

}

 


GDI오브젝트는 사용한 후 반드시 삭제해야 한다. 메모리를 할당한 후 반드시 해제해야
하는 것과 마찬가지로 GDI오브젝트도 메모리를 사용하기 때문이다.

단, 이때 주의 할 것은 DC에 현재 선택되어 있는 GDI 오브젝트는 삭제할 수 없다는
점인데 이는 현재 사용되고 있는 객체를 함부로 삭제하도록 내버려 둘 수 는 없기
때문에 생긴 일종의 안전 규정이다. 그래서 삭제하기 전에 DC에 선택된 객체를 선택
해제해야 하는데 가장 간단한 방법은 같은 종류의 다른 GDI오브젝트를 선택하는 것이다.

이런 이유로 OldPen이라는 핸들을 선언하고 이핸들에 MyPen이 선택되기 전의 펜
핸들을 저장해 두고 MyPen을 삭제하기 전에 OldPen을 다시 선택하는 것이다.


SeleteObject(hdc,OldPen);

DeleteObject(MyPen);



브러시


브러시는 채워지는 면을 채색하는 용도로 사용되는데 말 그대로 붓을 의미한다.


브러시를 만드는 함수

HBRUSH CreateSoildBrush(COLORREF crColor); //단색의 브러시

HBRUSH CreateHatchBrush(int fnStyle, COLORREF clrref);     //색상과 무늬 브러시


LRESULT OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)

{

        HDC hdc;

        PAINTSTRUCT ps;

        HBRUSH MyBrush, OldBrush;

        HPEN MyPen, OldPen;


        hdc = BeginPaint(hWnd, &ps);

        MyBrush = CreateHatchBrush(HS_BDIAGONAL, RGB(255,0,255));   
    
//현재핸들 = GetStockObject(모양,색상);

        OldBrush = (HBRUSH)SelectObject(hdc, MyBrush);          
   
//이전의 Brush핸들값 = SeleteObject(hdc,현재핸들);

        MyPen = CreatePen(PS_SOLID, 1, RGB(0,0,255));    
   
//현재핸들 = GetStockObject(선모양,선굵기,색상);

        OldPen = (HPEN)SelectObject(hdc, MyPen);        
    
//이전의 pen핸들값 = SeleteObject(hdc,현재핸들);


        Rectangle(hdc,50,50,300,200);


        SelectObject(hdc, OldBrush);

        SelectObject(hdc, OldPen);

        DeleteObject(MyPen);  //GDI오브젝트도 메모리를 사용하기 때문에 사용후 삭제

        DeleteObject(MyBrush); //위와 마찬가지

        EndPaint(hWnd, &ps);

        return 0;

}

 


 
 

투명 오브젝트


LRESULT OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)

{

        HDC hdc;

        PAINTSTRUCT ps;

        int i;

        HBRUSH MyBrush, OldBrush;

        HPEN MyPen, OldPen;


        hdc = BeginPaint(hWnd, &ps);

        for(i=0; i<250; i+=5)

        {

                MoveToEx(hdc,0,i,NULL);

                LineTo(hdc,600,i);

        }


        //빨간 펜 초록 브러시

        MyBrush = CreateSolidBrush(RGB(0,255,0));

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

        MyPen = CreatePen(PS_SOLID, 1, RGB(255,0,0));

        OldPen = (HPEN)SelectObject(hdc, MyPen);

        Ellipse(hdc,20,20,150,150);


        //빨간 펜 널 브러시

        SelectObject(hdc,GetStockObject(NULL_BRUSH));

        Ellipse(hdc,220,20,350,150);


        //널 펜 초록 브러시

        SelectObject(hdc, MyBrush);

        SelectObject(hdc,GetStockObject(NULL_PEN));

        Ellipse(hdc,420,20,550,150);

        

        DeleteObject(SelectObject(hdc,OldBrush));

        // DeleteObject(SelectObject(hdc,OldPen));
 //DC내 NULL_PEN있기 때문에 쓰지 않아도 됨

        EndPaint(hWnd, &ps);

        return 0;

}

 
 


스톡 오브젝트 도표를 보면 브러시와 펜은 NULL_BRUSH(=HOLLOW_BRUSH)와
NULL_PEN이라는 것이 있는데 이 오브젝트는 그리기를 하지 않는 오브젝트라는 뜻이다.

Rectangle이나 Ellipse처럼 테두리도 그리고 도형의 내부도 채색하는 함수들은 펜과 브러시를 동시에 사용하는데 이중 하나를 그리고 싶지 않을 때는 투명 오브젝트를 선택해 놓고 그리기를 하면 된다.

 

 

 

'API' 카테고리의 다른 글

컨트롤(버튼)  (0) 2011.09.19
폰트  (0) 2011.09.16
비트맵  (0) 2011.09.15
TextOut 예제  (0) 2011.08.23
First 예제  (0) 2011.08.22