관리 메뉴

드럼치는 프로그래머

[API/MFC] 그래픽 - DC ( Device Context ) 본문

★─Programing/☆─API | MFC

[API/MFC] 그래픽 - DC ( Device Context )

드럼치는한동이 2008. 5. 15. 23:32
그래픽 - DC

[GDI 오브젝트]

 

GDI(Graphic Device Interface)란 그래픽에 출력에 사용되는 도구를 말하며 펜. 브러시. 비트맵. 폰트 모두 GDI 오브젝트이다.

 

펜         HPEN               선을 그을때 사용한다.

브러시     HBRUSH          면을 채울때 사용한다.

폰트       HFONT             문자 출력에 사용되는 글꼴.

비트맵     HBITMAP          비트맵 이미지

팔레트     HPALETTE        팔레트

영역       HRGN              영역

 

 

[스톡 오브젝트]

 

StockObject 는 윈도우가 기본적으로 제공해주는 GDI 오브젝트를 말한다.

 

HDGIOJ GetStockObject( int fnObject ) ;

 

* fnObject

 

BLACK_BRUSH         검정색 브러시

GRAY_BRUSH           회색 브러시

NULL_BRUSH            투명 브러시

WHITE_BRUSH          흰색 브러시

DKGRAY_BRUSH       짙은 회색 브러시

LTGRAY_BRUSH        옅은 회색 브러시

DC_BRUSH              색상 브러시. SetDCBrushColor 함수로 설정

BLACK_PEN             검정색 펜

WHITE_PEN              흰색 펜

NULL_PEN                투명 펜

DC_PEN                  색상 펜. SetDCPenColor 함수로 설정

ANSI_VAR_FONT        가변폭 폰트

DEFAULT_PALETTE    시스템 팔레트

 

 

LRESULT CALLBACK WndProc( HWND hWnd, UINT message,
                                        WPARAM wParam, LPARAM lParam )
{
     HDC hdc;
     PAINTSTRUCT ps;
     HBRUSH MyBrush, OldBrush;
     RECT rt = { 100, 100, 200, 200};

 

     switch( message )
     {
     case WM_PAINT:
          hdc = BeginPaint(hWnd, &ps);
          MyBrush = (HBRUSH)GetStockObject(GRAY_BRUSH);
          OldBrush = (HBRUSH)SelectObject(hdc, MyBrush);          
// OldBrush 에 MyBrsuh 값을 저장한다.
          Rectangle(hdc, rt.left, rt.top, rt.right, rt.bottom);
          SelectObject(hdc, OldBrush);                                    
// 핸들의 복구를 위해 별도의 변수에 저장을 한다.
          EndPaint(hWnd, &ps);
          return 0;

     .......................

     }

     return 0 ;

}

 

* 실행모습

 

사용자 삽입 이미지

 

 

 

 

 

 

 

 

 

 

 

 

 

펜이나 다른것에서도 위에서한것과 같은 방식이 적용이 된다.  다른변수에 저장을 한뒤 SelectObject를 하게 된다.

 

 

[색상]

 

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

typedef DWORD COLORREF ;

 

RGB를 이용하게 되는데..  RGB(255, 255, 255) 는 흰색이고. RGB(0, 0, 0) 은 검은색이다.

 

R = Red           RGB(255, 0, 0)

G = Green        RGB(0, 255, 0)

B = Blue          RGB(0, 0, 255)

 

 

* 색상변수의 색을 분리해내는 함수

 

COLORREF 변수로 값을 넘겼을 경우에 가끔시 이 3개의 색을 빼내게 되는 경우가 있다.

 

void SetColor(COLORREF color ) ;           // SetColor 라는 함수가 있다고 하자...

위에 있는 SetColor 의 함수를 어디선가 SetColor(RGB(255, 0, 0)) ;  으로 호출을 했다..  SetColor 에서 이 값을 빼낼려면...

 

void SetColor(COLORREF color )

{

     INT R, G, B ;

     R = GetRValue(color) ;                      // Red 색상값을 빼낸다.

     G = GetGValue(color) ;                     // Green 색상값을 빼낸다.

     B = GetBValue(color) ;                      // Blue 색상값을 빼닌다.

 

     ..........................

}

 

 

[펜]

 

HPEN CreatePen(

     int fnPenStyle,                                // 펜의 스타일

     int nWidth,                                     // 펜의 폭.

     COLORREF crColor                           // 펜의 색상       RGB...

) ;

 

* fnPenSyle

PS_SOLID                                     실선

PS_DASH                                     점선

PS_DOT                                       점선( 위에보다 간격이 적음 )

PS_DASHDOT, PS_DASHDOTDOT        실선과 점선이 합침. (앞에건 하나. 뒤에건 2개...)

 

 


LRESULT CALLBACK WndProc( HWND hWnd, UINT message,
       WPARAM wParam, LPARAM lParam )
{
     HDC hdc;
     PAINTSTRUCT ps;
     HPEN MyPen, OldPen;
     RECT rt = {100, 100, 200, 200};


     switch( message )
     {
     case WM_PAINT:
          hdc = BeginPaint(hWnd, &ps);
          MyPen = CreatePen(PS_DOT, 1, RGB(0,0,255));      
// 폭이 1 인  파란색 점선으로 셋팅...
         
OldPen = (HPEN)SelectObject(hdc, MyPen);
          Rectangle(hdc, rt.left, rt.top, rt.right, rt.bottom);
          SelectObject(hdc, OldPen);
          DeleteObject(MyPen);                                       
// GDI 오브젝트는 사용하게 되면 반드시 지워줘야 된다. 메모리를 사용하기 때문...
          EndPaint(hWnd, &ps);
          return 0;

     ...............

     }

     return 0 ;

}

 

* 실행모습

사용자 삽입 이미지

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

[브러시]

 

브러시의 경우 두가지의 방법이 있다. 단순히 색칠만 하는 브러쉬와 모양을 변경해주는 브러시가 있다.

 

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

HBRUSH CreateHatchBrush(int fnStyle, COLORREF clrref);         // 색 and 무늬

 

*fnStyle

HS_BDIAGONAL     좌하향 줄무늬

HS_CROSS           바둑판 모양

HS_DIAGCROSS     좌하향 및 우햐향 줄무늬

HS_FDIAGONAL     우하향 줄무늬

HS_HORIZONTAL   수평선

HS_VERTICAL       수직선

 

LRESULT CALLBACK WndProc( HWND hWnd, UINT message,
       WPARAM wParam, LPARAM lParam )
{
     HDC hdc;
     PAINTSTRUCT ps;
    HBRUSH MyBrush, OldBrush;
     RECT rt = {100, 100, 200, 200};


     switch( message )
     {
     case WM_PAINT:
          hdc = BeginPaint(hWnd, &ps);
          MyBrush =  CreateHatchBrush(HS_BDIAGONAL, RGB(255, 0, 0) );       
  // 좌하향 줄무늬 빨간색 브러시
          OldBrush = (HBRUSH)SelectObject(hdc, MyBrush);
          Rectangle(hdc, rt.left, rt.top, rt.right, rt.bottom);
         
SelectObject(hdc, OldBrush);
          DeleteObject(MyBrush);

          EndPaint(hWnd, &ps);
          return 0;

     ..........

     }

     return 0 ;

}

 

* 실행모습

 

사용자 삽입 이미지

 

 

 

 

 

 

 

 

 

 

 

[출처] 그래픽 - DC|작성자 까까

'★─Programing > ☆─API | MFC' 카테고리의 다른 글

[API/MFC] Win32 API 입문 강좌  (0) 2009.02.25
[API/MFC] GDI와 DC  (0) 2008.05.16
[API/MFC] Sndplaysound 함수  (0) 2008.05.15
[API/MFC] HINSTANCE & HWND의 차이  (0) 2008.05.15
[API/MFC] LPCTSTR, LPTSTR 의 차이점  (0) 2008.03.17
Comments