본문 바로가기
::public/윈도우즈 응용 프로그래밍

GDI(Graphics Device Interface)

by 해맑은욱 2019. 9. 23.

Windows 운영체제가 그래픽 장치에 대해 프로그램이 독립성을 유지할 수 있도록 만든 기술.

 

*GDI Object

-Bitmap: '비트 패턴'을 추상화 시킴.

-Pen: 선 그리기에 사용되는 속성.

-Brush: 도형의 내부 영역을 채우기 위해 사용되는 속성.

 

*DC(Device Context)

;그리기에 사용되는 GDI Object의 핸들 값을 저장하고 있는 객체.

 출력에 대한 필요한 모든 정보를 가지는 데이터.

 

Graphic object

Bitmap

바이트 단위의 크기; 픽셀 단위의 치수; 컬러 형식; 압축 계획; 등등.

Brush

스타일, 색상, 패턴 및 원점

Palette

색상 및 크기 (또는 색상 수)

Font

서체 이름, 너비, 높이, 무게, 문자 세트 등

Path

모양

Pen

스타일, 너비 및 색상

Region

위치와 치수.

Graphic mode

Background

비트 맵 및 텍스트 작업을 위해 배경색을 기존 창 또는 화면 색상과 혼합하는 방법을 정의

Drawing

펜, 브러시, 비트 맵 및 텍스트 작업을 위해 전경색을 기존 창 또는 화면 색상과 혼합하는 방법을 정의

Mapping

논리 (또는 월드) 공간에서 창, 화면 또는 프린터 용지로 그래픽 출력이 매핑되는 방법을 정의

Polygon-fill

브러시 패턴을 사용하여 복잡한 영역의 내부를 채우는 방법을 정의

Stretching

비트 맵을 압축 (또는 축소) 할 때 비트 맵 색상이 기존 창 또는 화면 색상과 혼합되는 방식을 정의

 

// h_wnd에 해당하는 윈도우가 사용하는 DC정보 얻기.
HDC h_dc = ::GetDC(h_wnd);
 
// DC에 연결된 비트맵 핸들 값 얻기.
HGDIOBJ h_bitmap = ::GetCurrentObject(h_dc, OBJ_BITMAP);
// 비트맵 핸들을 이용하여 비트맵 정보 얻기.
BITMAP bmp_info;
::GetObject(h_bitmap, sizeof(BITMAP), &bmp_info);
 
// 팔래트의 수 얻기.
HGDIOBJ h_palette = ::GetCurrentObject(h_dc, OBJ_PAL);
WORD pal_count;
::GetObject(h_palette, sizeof(WORD), &pal_count);
 
// 펜 객체의 속성 정보 얻기.
HGDIOBJ h_pen = ::GetCurrentObject(h_dc, OBJ_PEN);
LOGPEN pen_info;
::GetObject(h_pen, sizeof(LOGPEN), &pen_info);
 
// 브러시 객체의 속성 정보 얻기.
HGDIOBJ h_brush = ::GetCurrentObject(h_dc, OBJ_BRUSH);
LOGBRUSH brush_info;
::GetObject(h_brush, sizeof(LOGBRUSH), &brush_info);
 
// 폰트 객체의 속성 정보 얻기.
HGDIOBJ h_font = ::GetCurrentObject(h_dc, OBJ_FONT);
LOGFONT font_info;
::GetObject(h_font, sizeof(LOGFONT), &font_info);
 
// GetDC 함수를 사용해서 얻은 DC는 반드시
// ReleaseDC 함수를 사용해서 반환해야함.
::ReleaseDC(h_wnd, h_dc);
cs

 

*SelectObject

;DC에 저장된 GDI Object의 핸들 값을 변경할 때 사용.

 교체 가능한 GDI Object는 Bitmap, Pen, Brush, Font, Region.

 Bitmap의 경우에는 DC가 메모리(Memory) DC인 경우에만 가능.

 

*GetStockObject

;운영체제는 사용빈도가 높고 내용이 바뀌지 않는 자원들을 미리 만들어서 가기고 있음.

Stock Resource 또는 Stock Object라고 칭함. 이것들의 핸들 값을 얻을때 사용.

ex) BLACK_BRUSH, DKGRAY_BRUSH, WHITE_BRUSH.. 브러쉬 객체 핸들

    BLACK_PEN, WHITE_PEN.. 펜 객체 핸들 

 

*CreatePen

// CreatePen 예제. 선의 종류별로 출력하기.
PAINTSTRUCT ps;
// 필요한 영역만 그림을 그릴 수 있는 DC의 핸들 값 얻기.
HDC h_dc = BeginPaint(hWnd, &ps);
 
HPEN h_pen;
const char* p_style_string[6= { "PS_SOLID""PS_DASH""PS_DOT""PS_DASHDOT""PS_DASHDOTDOT""PS_NULL" };
int pen_style[6= { PS_SOLID, PS_DASH, PS_DOT, PS_DASHDOT, PS_DASHDOTDOT, PS_NULL };
// 점선의 경우 표시되지 않는 부분을 표현하기 위해 투명하게 함.
SetBkMode(h_dc, TRANSPARENT);
// 현재 DC에 설정된 pen 핸들 값을 얻음.
HGDIOBJ h_old_pen = GetCurrentObject(h_dc, OBJ_PEN);
 
for (int i = 0; i < 6; i++)
{
    TextOutA(h_dc, 1010 + i * 20, p_style_string[i], strlen(p_style_string[i]));
    // 저장한 pen의 속성값과 다른 인자들들 이용하여 파란색 pen 객체를 생성.
    h_pen = CreatePen(pen_style[i], 1, RGB(00255));
    // DC에 생성한 pen 객체를 연결.
    SelectObject(h_dc, h_pen);
 
    // 일정 간격으로 선을 그림. 200--400.
    MoveToEx(h_dc, 20015 + i * 20NULL);
    LineTo(h_dc, 40015 + i * 20);
 
    // 사용이 끝난 pen 객체 제거.
    DeleteObject(h_pen);
}
 
// 기존에 사용하던 pen 객체로 복구.
SelectObject(h_dc, h_old_pen);
 
// DC 반환하기.
EndPaint(hWnd, &ps);
cs

*CreateSolidBrush

// CreateSolidBrush예제. 테두리 없음.
 
// 윈도우에 그리기 위해 DC 핸들 값 얻기.
HDC h_dc = GetDC(hWnd);
 
// 파란색으로 채워지는 brush 객체 생성.
HBRUSH h_blue_brush = CreateSolidBrush(RGB(00255));
// 생성한 brush 객체를 DC에 연결하고 기존 brush 객체는 h_old_brush에 저장.
HGDIOBJ h_old_brush = SelectObject(h_dc, h_blue_brush);
 
// 선을 표시하지 않는 속성의 pen 객체를 DC에 연결.
HGDIOBJ h_old_pen = SelectObject(h_dc, GetStockObject(NULL_PEN));
 
// 사각형 그리기.
Rectangle(h_dc, 1010100100);
 
// 기존에 사용하던 pen 객체 복구.
SelectObject(h_dc, h_old_pen);
 
// 기존에 사용하던 brush 객체 복구.
SelectObject(h_dc, h_old_brush);
// brush 객체 제거.
DeleteObject(h_blue_brush);
// DC 반환.
::ReleaseDC(hWnd, h_dc);
cs

*CreateHatchBrush

;도형을 점이 아닌 선으로 채우고 싶을때 사용.

// CreateHatchBrush 예제. 채워지는 선의 종류별로 출력하기.
 
PAINTSTRUCT ps;
// 필요한 영역만 그림을 그릴 수 있는 DC의 핸들 값 얻기.
HDC h_dc = BeginPaint(hWnd, &ps);
 
HBRUSH h_brush;
const char* p_style_string[6= { "HS_BDIAGONAL""HS_CROSS""HS_DIAGCROSS""HS_FDIAGONAL""HS_HORIZONTAL""HS_VERTICAL" };
int brush_style[6= { HS_BDIAGONAL, HS_CROSS, HS_DIAGCROSS, HS_FDIAGONAL, HS_HORIZONTAL, HS_VERTICAL };
// 점선의 경우 표시되지 않는 부분을 표현하기 위해 투명하게 함.
SetBkMode(h_dc, TRANSPARENT);
// 현재 DC에 설정된 pen 핸들 값을 얻음.
HGDIOBJ h_old_brush = GetCurrentObject(h_dc, OBJ_BRUSH);
 
for (int i = 0; i < 6; i++)
{
    // brush의 속성별 명칭을 화면에 출력.
    TextOutA(h_dc, 1010 + i * 30, p_style_string[i], strlen(p_style_string[i]));
    // 저장한 brush의 속성값으로 파란색 brush 객체를 생성.
    h_brush = CreateHatchBrush(brush_style[i], RGB(00255));
    // DC에 생성한 brush 객체를 연결.
    SelectObject(h_dc, h_brush);
 
    // 사각형 그리기.
    Rectangle(h_dc, 2005 + i * 3040030 + i * 30);
 
    // 사용이 끝난 brush 객체 제거.
    DeleteObject(h_brush);
}
 
// 기존에 사용하던 brush 객체로 복구.
SelectObject(h_dc, h_old_brush);
 
// DC 반환하기.
EndPaint(hWnd, &ps);
cs

*SetDCBrushColor

// SetDCBrushColor예제. 
// DC_BRUSH로 설정되어 있는 DC의 색상을 변경한다.
 
HDC h_dc = GetDC(hWnd);
// GetDC를 재설정 하지 않는 한 설정된 값으로 유지됨. 재설정 후엔 흰색.
SelectObject(h_dc, GetStockObject(DC_BRUSH));    
SetDCBrushColor(h_dc, RGB(00255));    // 파란색
Rectangle(h_dc, 20208080);        
SetDCBrushColor(h_dc, RGB(25500));    // 붉은색
Rectangle(h_dc, 1002016080);        
 
::ReleaseDC(hWnd, h_dc);
cs

*SetDCPenColor

// SetDCPenColor예제. 
// DC_BRUSH로 설정되어 있는 DC의 색상을 변경한다.
 
HDC h_dc = GetDC(hWnd);
// GetDC를 재설정 하지 않는 한 설정된 값으로 유지됨. 재설정 후엔 검은색.
SelectObject(h_dc, GetStockObject(DC_PEN));
SetDCPenColor(h_dc, RGB(00255));    // 파란색
Rectangle(h_dc, 20208080);
SetDCPenColor(h_dc, RGB(25500));    // 붉은색
Rectangle(h_dc, 1002016080);
 
::ReleaseDC(hWnd, h_dc);
cs

'::public > 윈도우즈 응용 프로그래밍' 카테고리의 다른 글

WinProc(윈드 프록)  (0) 2019.09.23
윈도우 좌표 구성  (0) 2019.09.23
CreateBitmap / CreateCompatibleBitmap  (0) 2019.09.23
Windows API  (0) 2019.09.23
기본 소스 코드 구성(생략본)  (0) 2019.09.23