API-그래픽(GDI Object)

GDI (Graphic Device Interface) 
=>화면, 프린터 등의 모든 출력 장치를 제어하는 윈도우즈 핵심 모듈중 하나이다.

즉, 출력을 위한 중앙 통제 센터 정도로 생각하자.

윈도우즈 프로그램에서의 모든 출력은 GDI 를 통해서 화면과 프린터로 나가게 되어 있다.


GDI 오브젝트 (GDI Object) 란?
=> 그래픽 출력에 사용되는 도구
를 말하며 
펜 , 브러시 , 비트맵 , 폰트 증증이 모두 GDI 오브젝트 이다.

( 사람이 그림그릴때 쓰는 연필, 붓 등을 생각하면 된다 )


GDI 오브젝트를 모아놓은 것이 DC 이며 GDI 는 현재 DC 에 선택되어 있는 GDI 오브젝트를 사용한다.

그래서 사용자는 그래픽을 그리기 전에 DC 에 적절한 오브젝트를 선택함으로써 원하는 모양과 속성으로 그래픽을 출력할 수 있다. 즉 , 원하는 색상과 모양의 오브젝트를 만들고 DC 에 선택해 놓으면 이후부터 선택된 오브젝트의 속성대로 출력된다.

 

GDI 오브젝트는 내부적으로 일종의 구조체이겠지만 ,그 선언문이 공개되어 있지 않으므로 우리가 이 구조체를 볼 수도 없고 , 볼 필요도 없다. DC 가 BeginPaint 나 GetDC 함수로 의해 처음 만들어졌을 때 ,디폴트로 선택된 GDI 오브젝트는 다음과 같다.

 

 GDI 오브젝트

 핸들 타입 

 설명 

 디폴트 

 펜  HPEN  선을 그을 때 사용   검정 가는 실선 
 브러시  HBRUSH  면을 채울 때 사용  흰색
 폰트  HFONT  문자 출력 글꼴  시스템 글꼴
 비트맵  HBITMAP  비트맵 이미지  선택 안됨
 팔레트  HPALETTE  팔레트  선택 안됨
 리전  HRGN  화면상의 영역  선택 안됨

 

보다시피 대체로 무난한 속성으로 설정되어 있다. 그래서 DC 에 별 다른 지정을 하지 않고 , 그냥 출력하면 디폴트 속성이 적용되어 위와 같은 속성이 적용된다.



1.스톡 오브젝트 ( Stock Object )란?

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

아주 빈번하게 사용되므로 운영체제가 부팅할 때부터 미리 만들어 놓는다.

우리가 일부러 만들지 않아도 언제든지 사용할 수 있으며 사용하고 난 후에 파괴할 필요도 없다.



2.스톡 오브젝트 얻기
다음 함수로 핸들을 얻어 사용하기만 하면 된다.
 

HGDIOBJ GetStockObject( int fnObject );
 

fnObject 인수에 사용하고자 하는 스톡 오브젝트를 지정하는데 , 사용 가능한 스톡 오브젝트는 다음과 같다.

주로 브러시와 펜이 스톡 오브젝트로 제공된다.( WHITE_BRUSH 도 스톡 오브젝트의 일종이다 )
 

 jnObject  설명 
 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_FIXED_FONT  고정폭 폰트
 ANSI_VAR_FONT  가변폭 폰트
 DEFAULT_PALETTE  시스템 팔레트


 주로 무채색의 브러시와 펜만 제공되며, 원색 브러시는 직접 만들어 써야 한다.


3.오브젝트 선택해서 사용하기

GDI 오브젝트를 DC 에 선택하는데 ,이 때는 다음 함수를 사용한다.
 

HGDIOBJ SelectObject( HDC hdc , HGDIOBJ hgdiobj );

 

첫 번째 인수로 DC 의 핸들을 주고 , 두 번째 인수로 GDI 오브젝트의 핸들을 주면DC 에 해당 오브젝트를 선택한다.

SelectObject 가 리턴하는 값은 이전에 선택되어 있던 같은 종류의 오브젝트 핸들이다.

이 핸들값은 복구를 위해 반드시 별도의 변수에 저장해 두어야 하는데 , 브러시의 경우 이전 브러시의 핸들을 OldBrush 변수에 대입해두는 식으로 쓴다.
ex) OldBrush =  (HBRUSH)SelectObject(~) 이런식으로 쓴다.

4.오브젝트 설정시 주의사항
DC에는 하나의 GDI오브젝트만을 설정할 수 있다.
중요한 내용이라 따로 첨부한다.
[프로그래밍/WindowsAPI] - API-SelectObject(),DeleteObject() 사용시 주의사항 

5.Old GDIObject 사용하는 이유
[프로그래밍/WindowsAPI] - API - DeleteObject / MyGDI & OldGDI 교체이유 



이 글을 공유하기

댓글

Designed by JB FACTORY