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, 10, 10 + i * 20, p_style_string[i], strlen(p_style_string[i]));
// 저장한 pen의 속성값과 다른 인자들들 이용하여 파란색 pen 객체를 생성.
h_pen = CreatePen(pen_style[i], 1, RGB(0, 0, 255));
// DC에 생성한 pen 객체를 연결.
SelectObject(h_dc, h_pen);
// 일정 간격으로 선을 그림. 200--400.
MoveToEx(h_dc, 200, 15 + i * 20, NULL);
LineTo(h_dc, 400, 15 + 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(0, 0, 255));
// 생성한 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, 10, 10, 100, 100);
// 기존에 사용하던 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, 10, 10 + i * 30, p_style_string[i], strlen(p_style_string[i]));
// 저장한 brush의 속성값으로 파란색 brush 객체를 생성.
h_brush = CreateHatchBrush(brush_style[i], RGB(0, 0, 255));
// DC에 생성한 brush 객체를 연결.
SelectObject(h_dc, h_brush);
// 사각형 그리기.
Rectangle(h_dc, 200, 5 + i * 30, 400, 30 + 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(0, 0, 255)); // 파란색
Rectangle(h_dc, 20, 20, 80, 80);
SetDCBrushColor(h_dc, RGB(255, 0, 0)); // 붉은색
Rectangle(h_dc, 100, 20, 160, 80);
::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(0, 0, 255)); // 파란색
Rectangle(h_dc, 20, 20, 80, 80);
SetDCPenColor(h_dc, RGB(255, 0, 0)); // 붉은색
Rectangle(h_dc, 100, 20, 160, 80);
::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 |