블로그 이미지
하루, 글. 그림. 영상매체. 표현을 도와주는 기기들. 도전 중. 동화다아아
    동화다아아

    카테고리

    분류 전체보기 (176)
    잡담 (1)
    IT 기기-리뷰&뉴스 (7)
    리뷰 - 도서 (1)
    리뷰 - 영상 (0)
    리뷰 - 그림/음악 (1)
    내장형 하드웨어 (163)
    Total
    Today
    Yesterday
    - 색상
     → 도스에서는 WHITE, YELLOW, RED 등의 매크로 상수로 색상을 표현했고 이 매크로들의 실제값은 0~15까지의 정수였었다.
     → 도스에서는 16만 색상을 사용할 수 있었으므로 각 색상마다 이름을 줄 수 있었지만 최대 천육백만가지 색상을 표현할 수 있는 윈도우즈 환경에서는 이런 간단한 방법을 쓸 수 없었다.
     → 윈도우즈 환경에서는 색상값을 표현하기 위해 COLORREF라는 데이터 형으로 사용하는 데 이는 다음과 같이 표현되어 있다.

    typedef DWORD COLORREF

     → COLORREF 형은 부호없는 32비트 크기의 정수형이며 8비트 빨간색, 초록색, 파란색의 농도를 나타내며 상위 8비트는 사용되지 않는다. 
     → 각 색상 요소는 1바이트 크기를 가지므로 0~255 까지의 농도를 표현할 수 있으며 이 색상 요소의 혼합에 의해 색상 하나가 만들어 진다.
    
       B

     → COLORREF형은 32비트 정수일 뿐이므로 16진수로 직접 표현할 수도 있다. 예를 들어 0은 검정색이 되며 0xff는 빨간색, 0xff0000은 파란색이 된다. 하지만 통상적으로 색상값을 만들 때는 RGB 매크로 함수를 사용하며 다음과 같이 정의되어 있다.

    #define TGB(r,g,b)((COLORREF)(((BYTE)(r|((WORD)((BYTE)(g))<<8|((DWORD)(BYTE)(b))<<16)))

     → 세 개의 인수를 가지는데 각각 빨간색, 초록색, 파란색의 농도이며 이 세값을 조립하여 하나의 32비트 색상값을 만들어내는 간단한 연산을 한다.

    - 펜
     → 펜은 선을 그을 때 사용되는 GDI 오브젝트이다. 펜을 변경하면 그려지는 선의 모양을 마음대로 변경할 수 있다.
     → 윈도우즈가 제공하는 스톡 펜은 흰색, 검정색, 투명색 세가지 뿐이며, 다른색의 펜을 사용하고자 할때는 다음의 함수를 사용하여 직접 만들어야 한다.

    HPEN CreatePen(int fnPenStyle, int nWidth, COLORREF crColor);
     → fnPenStyle
     → 그려질 선의 모양을 지정한ㄷ. 단, 선의 모양은 굵기가 1일때만 효과가 있으며 굵기가 2이상이면 무조건 실선으로 그려진다.
     → nWidth
     → 선의 폭을 지정한다. 디폴트 선의 굴기는 1, 단 이 값이 0일 경우는 맵핑모드에 상관없이 무조건 1픽셀 두께의 선이 만들어 진다.
     → crColor
     → 선의 색상을 지정한다. COLORREF 형이므로 RGB 매크로 함수를 사용하면 된다.

    - 예제
     

    LRESULT OnPaint(HWND hWnd, WPARAM wParam, LPARAM lParam)
    {
     HDC hdc;
     PAINTSTRUCT ps;
     HPEN MyPen, OldPen;
     
     hdc 
    = BeginPaint(hWnd, &ps);

     MyPen 
    = CreatePen(PS_SOLID, 5, RGB(2550255));
     OldPen 
    = (HPEN)SelectObject(hdc, MyPen);
     Rectangle(hdc, 
    5050300200);

     SelectObject(hdc, OldPen); 
    // DC에 적용된 MyPen 적용 해제를 위해서
     DeleteObject(MyPen); // DeleteObject(selectObject(hdc, OldPen));
     
     EndPaint(hWnd, 
    &ps);
     
    return 0;
    }


     → CreatePen 함수를 호출하여 굴기 5의 분홍색 실선 펜을 만든 후 이펜의 핸들을 MyPen에 대입하였다.
     → 그리고 SelectObject로 이 펜을 DC에 선택한 후 사각형을 그렸으므로 사각형의 테두리는 굵은 분홍색으로 그려질 것이다.
     → GDI 오브젝트는 사용한 후 반드시 삭제해야 한다. 왜냐하면 GDI 오브젝트도 메모리를 사용하기 때문

    - 브러시
     → 브러시는 채워지는 면을 채색하는 용도로 사용되는데 말 그대로 붓을 의미한다.
     → 사각형의 안쪽이나 원의 내부 또는 다각형의 내부를 채색할 때 현재 DC에 선택된 브러시가 사용된다.
     → 스톡 브러시에는 회색, 흰색, 검정색 등의 단색 브러시가 있으므로 이 브러시들은 별도로 만들지 않아도 사용할 수 있다.
     → 브러시를 만드는 함수는 다음과 같다

    HBRUSH CreateSolidBrush(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(2550255));
     OldBrush 
    = (HBRUSH)SelectObject(hdc, MyBrush);
     MyPen 
    = CreatePen(PS_SOLID, 5, RGB(2550255));
     OldPen 
    = (HPEN)SelectObject(hdc, MyPen);

     Rectangle(hdc, 
    5050300200);

     SelectObject(hdc, OldBrush);
     SelectObject(hdc, OldPen); 
    // DC에 적용된 MyPen 적용 해제를 위해서
     DeleteObject(MyBrush);
     DeleteObject(MyPen); 
    // DeleteObject(selectObject(hdc, OldPen));
     
     EndPaint(hWnd, 
    &ps);
     
    return 0;
    }


     → 분홍색의 굵은 MyPen과 분홍색의 줄무늬를 가지는 MyBrush를 각각 만들고 DC에 선택한 후 사각형을 그렸다.



    - 투명 오브젝트
     → 스톡 오브젝트 도표를 보면 브러시와 펜은 투명색의 NULL_BRUSH(=HOLLOW_BRUSH)와 NULL_PEN이라는 것이 있는데 이 오브젝트는 그리기를 하지 않는 오브젝트라는 뜻이다.
     → Rectangle이나 Ellipse 처럼 테두리도 그리고 도형의 내부도 채색하는 함수들은 펜과 브러시를 동시에 사용하는데 이 중 하나를 그리고 싶지 않을 때는 투명 오브젝트를 선택해 놓고 그리기를 하면 된다.

    - 예제
     

    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=i+5)
     {
      MoveToEx(hdc, 
    0, i, NULL);
      LineTo(hdc, 
    600, i);
     }
     
    // 빨간 펜 초록 브러시
     MyBrush = CreateSolidBrush(RGB(02550));
     OldBrush 
    = (HBRUSH)SelectObject(hdc, MyBrush);
     MyPen 
    = CreatePen(PS_SOLID, 5, RGB(25500));
     OldPen 
    = (HPEN)SelectObject(hdc, MyPen);
     Ellipse(hdc, 
    2020150150);

     
    // 빨간 펜 널 브러시
     SelectObject(hdc, GetStockObject(NULL_BRUSH));
     Ellipse(hdc, 
    22020350150);

     
    // 널 펜 초록 브러시
     SelectObject(hdc, MyBrush);
     SelectObject(hdc, GetStockObject(NULL_PEN));
     Ellipse(hdc, 
    42020550150);

     DeleteObject(SelectObject(hdc, OldBrush));
    // DeleteObject(SelectObject(hdc, OldPen));
     EndPaint(hWnd, &ps);
       
     EndPaint(hWnd, 
    &ps);
     
    return 0;

    }

    → 가로로 수평선을 그어 두었는데 이는 투명 효과를 분명히 확인하기 위함이다.
    → 빨간색 펜과 초록색 브러시를 만들고 이 두 오브젝트를 DC에 모두 선택한 상태에서 Ellipese로 타원을 그려보고 널 브러시와 널 펜을 각각 선택한후 추가로 타원을 그렸다.


    '내장형 하드웨어 > WINAPI' 카테고리의 다른 글

    WINAPI - RopMode2 실습  (0) 2011.09.09
    WINAPI - 그리기 모드  (0) 2011.09.09
    WINAPI - 그래픽(GDI 오브젝트)  (0) 2011.09.07
    WINAPI - WM_COMMAND  (0) 2011.09.06
    WINAPI - 리소스(메뉴 생성 첫번째)  (0) 2011.09.05
    Posted by 동화다아아
    , |

    최근에 달린 댓글

    최근에 받은 트랙백

    글 보관함