API-그래픽(GDI Object)
- 프로그래밍/WindowsAPI
- 2011. 5. 13. 10:38
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 교체이유
이 글을 공유하기