GDI + 프로 그래 밍 기초 (1) GDI + Vs GDI

소스 코드 다운로드 1. GDI GDI 는 응용 프로그램 과 서로 다른 하드웨어 사이 의 중간 층 에 위치 하 는데 이런 구 조 는 프로그래머 가 서로 다른 하드웨어 를 직접 처리 하 는 작업 에서 해방 되 고 하드웨어 간 의 차 이 를 GDI 에 맡 겼 다.GDI 는 응용 프로그램 을 서로 다른 출력 장치 특성 과 격 리 시 켜 윈도 프로그램 이 윈도 가 지원 하 는 모든 그래 픽 출력 장치 에서 장애 없 이 실행 할 수 있 도록 한다.예 를 들 어, 우 리 는 프로그램 을 바 꾸 지 않 는 전제 에서 Epson 점 프린터 에서 일 할 수 있 는 프로그램 도 레이저 프린터 에서 일 할 수 있 도록 할 수 있다.그것 은 windows 시스템 의 그래 픽 출력 을 하드웨어 명령 으로 바 꾸 어 하드웨어 장치 에 보 냈 다.GDI 는 시스템 에 파일 형식 으로 저 장 됩 니 다. 시스템 이 그래 픽 을 출력 해 야 할 때 메모리 에 불 러 옵 니 다. 하드웨어 명령 으로 변환 할 때 GDI 명령 이 아 닌 경우 하드웨어 드라이버 를 불 러 올 수도 있 습 니 다. 드라이버 는 GDI 를 보조 하여 그래 픽 명령 을 하드웨어 명령 으로 변환 할 수도 있 습 니 다. 2. 장치 환경 Windows 시스템 은 응용 프로그램 에 장치 독립 성 을 제공 하 는 도구 입 니 다. 이것 은 windows 시스템 이 출력 장 치 를 처리 하기 위해 사용 하 는 내부 데이터 구조 입 니 다. 장치 환경 은 windos 프로그램, 드라이버 와 출력 장치 (예 를 들 어 프린터, 플로터) 간 의 유대 이 고 GDI 는 C + + 류 입 니 다.이 는 드라이버 의 협조 하에 데 이 터 를 하드웨어 에 묘사 하고 응용 프로그램 과 하드웨어 사이 에 위치 하 며 데 이 터 를 한 쪽 에서 다른 쪽 으로 전달 합 니 다.Visual Studio. NET 에서 Micro $oft 는 GDI 의 많은 문 제 를 해결 하고 사용 하기 쉬 워 졌 습 니 다. GDI 의. net 버 전 은 GDI + 라 고 합 니 다. 3. GDI + GDI + 는 GDI 의 다음 버 전 으로 개선 되 었 고 사용 하기 쉽 습 니 다.GDI 의 장점 중 하 나 는 데이터 가 장치 에 어떻게 렌 더 링 되 는 지 알 필요 가 없다 는 것 이다. GDI + 는 이 장점 을 잘 실현 했다. 즉, GDI 는 중 저층 API 이 고 장 치 를 알 아야 할 수도 있 고 GDI + 는 고 층 API 이 므 로 장 치 를 알 필요 가 없다 는 것 이다.예 를 들 어 컨트롤 의 전경 과 배경 색 을 설정 하려 면 BackColor 와 ForeColor 속성 만 설정 하 십시오. 4. 프로 그래 밍 모델 의 변화 "GDI uses a stateful model, whereas GDI + uses a stateless" - GDI 는 상태 가 있 고 GDI + 는 무 상태 입 니 다.1. 장치 환경 이나 핸들 을 사용 하지 않 습 니 다. GDI 그래 픽 을 사용 할 때 장치 환경 (DC) 을 지정 해 야 합 니 다. 창 이나 장치 가 장치 환경 류 의 핸들 포인터 와 연결 되 어 있 고 모든 그래 픽 작업 이 이 핸들 과 관련 이 있 습 니 다.GDI + 는 이 장치 환경 이나 핸들 을 사용 하지 않 고 Graphics 대상 을 사용 합 니 다.장치 환경 과 유사 합 니 다. Graphics 대상 도 화면의 한 창 을 연결 시 키 고 그림 그리 기 작업 에 필요 한 속성 을 포함 합 니 다.그러나 이 Graphics 대상 만 장치 환경 핸들 과 연결 되 어 있 고 나머지 는 Pen, Brush, Image, Font 등 대상 만 장치 환경 을 사용 하지 않 습 니 다. 2. Pen, Brush, Font, Image 등 대상 은 도형 대상 이 독립 된 화필 대상 으로 그리 기 방법 을 제공 하 는 도형 대상 과 분리 하여 유지 할 수 있 으 며 Graphics 그래 픽 방법 은 Pen 대상 을 자신의 매개 변수 로 하여 GDI 에서 SelectObject 를 사용 하여 번 거 로 운 전환 을 피 할 수 있 습 니 다. 이와 유사 한 것 은 Brush, Path, Image 와 Font 등 이 있 습 니 다. 3. '현재 위치' GDI 그림 그리 기 동작 (예 를 들 어 선 그리 기) 에는 '현재 위치' 라 고 불 리 는 특수 한 위치 가 항상 존재 합 니 다.매번 선 을 그 릴 때마다 현재 위 치 를 시작 점 으로 하고 선 을 그 리 는 작업 이 끝 난 후에 직선 의 끝 점 위 치 는 현재 위치 가 되 었 다.현재 위 치 를 설정 하 는 이 유 는 선 을 그 리 는 작업 의 효율 을 높이 기 위해 서 입 니 다. 어떤 상황 에서 항상 한 직선 이 다른 직선 과 연결 되 고 머리 와 꼬리 가 연결 되 기 때 문 입 니 다.현재 위치의 자동 업데이트 가 있 으 면 선 을 그 릴 때마다 두 점 의 좌 표를 제시 하 는 것 을 피 할 수 있 습 니 다.필요 성 이 있 음 에 도 불구 하고 하나의 직선 을 단독으로 그 리 는 경우 가 많 기 때문에 GDI + 는 '현재 위치' 를 취소 하여 '현재 위치' 를 정할 수 없 을 때 발생 하 는 그림 의 오 류 를 피하 고 대신 DrawLine 에서 직선 시작 점 의 좌 표를 직접 지정 합 니 다.   4. GDI 를 그립 니 다. GDI 는 항상 모양 의 윤곽 을 그립 니 다. 예 를 들 어 Rectangle 과 같은 그래 픽 함 수 를 사용 합 니 다.윤곽 그리 기 에는 붓 이 필요 하고, 영역 을 채 우려 면 브러시 가 필요 하 다.즉, 우리 가 그 려 진 모양 을 채 울 필요 가 있 든 없 든 간 에 우 리 는 브러시 를 지정 해 야 한다. 그렇지 않 으 면 GDI 는 기본 브러시 로 채 워 야 한다.이러한 방식 은 확실히 우리 에 게 많은 불편 을 가 져 다 주 었 습 니 다. 현재 GDI + 는 모양 윤곽 그리 기와 채 우기 동작 을 분리 하여 다른 방법 을 사용 하고 있 습 니 다. 예 를 들 어 Draw Rectangle 과 FillRectangle 은 각각 사각형 을 그립 니 다.   5. 구역 의 조작 GDI 는 CreateRectRgn, CreateEllpticRgn, CreateRoundRectRgn, CreatePolygonRgn 과 CreatePolygonRgn 등 여러 구역 의 생 성 함 수 를 제공 합 니 다.물론 이 함수 들 은 우리 에 게 많은 편 의 를 가 져 다 주 었 다.그러나 GDI + 에 서 는 영역 을 매트릭스 변환 작업 에 쉽게 도입 하기 위해 GDI + 일반 영역 생 성 방법 을 간소화 하고 더 복잡 한 영역 생 성 을 Path 에 맡 깁 니 다.Path 대상 은 설비 환경 과 분 리 된 것 이기 때문에 Region 구조 함수 에서 직접 지정 할 수 있 습 니 다. 5. GDI + 새로운 특색 GDI + 는 GDI 에 비해 다음 과 같은 새로운 기능 을 추가 합 니 다. 1. 그 라 데 이 션 브러시 는 기 존의 GDI 에서 색상 그 라 데 이 션 영역 을 실현 하 는 방법 은 서로 다른 색상 의 선 을 사용 하여 재단 영역 을 채 우 는 것 입 니 다.현재 GDI + 는 GDI 기능 을 확대 하여 선형 그 라 데 이 션 과 경로 그 라 데 이 션 브러시 를 제공 하여 도형, 경로 와 구역 을 채 우 고 심지어 직선, 곡선 등 을 그 릴 수 있 습 니 다.이곳 의 경 로 는 각종 그래 픽 함수 가 발생 하 는 궤적 을 이유 로 볼 수 있다.   2. 각 곡선 이 곡선 에 있어 가장 실제 적 인 의 미 를 가 진 것 은 바로 각 곡선 이다.견본 곡선 은 생산 실천 의 기초 위 에서 발생 하고 발전 한 것 이다.모델 라인 간 의 설계 자 는 모델 라인 을 그 릴 때 먼저 주어진 데이터 에 따라 모델 값 점 을 정확하게 '점' 으로 도판 에 놓는다.그 다음 에 '견본' 이 라 고 불 리 는 도구 (탄성 이 풍부 한 유기 유리 막대 나 나무 막대) 를 사용 하여 압 철 로 이런 수치 점 을 통과 하도록 강요 한 다음 에 이런 압 철 을 적당 하 게 조정 하여 견본 의 형 태 를 변화 시 켜 적당 한 모양 을 얻 을 때 까지 견본 에 따라 필요 한 곡선 을 그 렸 다.만약 우리 가 견본 을 탄성 가 는 들보 로 본다 면, 압 철 은 이 들보 의 어떤 점 에 작용 하 는 집 중력 으로 볼 수 있다.GDI + 의 Graphics: DrawCurve 함수 에 집 중력 크기 를 조절 하 는 인자 가 있 습 니 다.각 라인 외 에 GDI + 는 기 존 GDI 의 Bezier 곡선 도 지원 한다. 3. 독립 된 경로 대상 이 GDI 에서 경 로 는 하나의 장치 환경 (문맥) 에 속 합 니 다. 즉, 장치 환경 포인터 가 유효기간 을 초과 하면 경로 도 삭 제 됩 니 다.한편, GDI + 는 Graphics 대상 을 사용 하여 그림 그리 기 작업 을 하고 경 로 를 Graphics 대상 에서 분리 하여 Graphics Path 류 를 제공 합 니 다.경로 대상 이 Graphics 대상 작업 의 영향 을 받 을 까 봐 걱정 하지 않 아 도 같은 경로 대상 으로 여러 번 경 로 를 그 릴 수 있다 는 것 이다.4. 행렬 과 행렬 의 변환 은 도형 처리 과정 에서 복잡 한 새로운 도형 을 만 들 기 위해 기하학 적 정 보 를 변환 해 야 한다. 행렬 은 이런 도형 기하학 적 변환 에 가장 자주 사용 되 는 방법 이다.사람들 이 도형 변환 에 대한 수 요 를 만족 시 키 기 위해 GDI + 는 강력 한 기능 을 가 진 Matrix 류 를 제공 하여 행렬 의 회전, 오 절, 이동, 비례 등 변환 작업 을 실현 하고 GDI + 는 Graphics 도형 과 지역 (Region) 의 행렬 변환 도 지원 합 니 다.5. 알파 채널 합성 연산 은 이미지 처리 에서 알파 가 픽 셀 이나 이미지 의 투명 도 를 평가 하 는 데 사 용 됩 니 다.압축 되 지 않 은 32 비트 RGB 이미지 에서 각 픽 셀 은 네 부분 으로 구성 되 어 있 습 니 다. 하나의 알파 채널 과 세 개의 색상 분량 (R, G, B) 입 니 다.알파 값 이 0 일 때 이 픽 셀 은 완전히 투명 하지만 알파 값 이 255 일 때 는 완전히 불투명 하 다.알파 혼 색 은 원본 픽 셀 과 배경 픽 셀 의 색상 을 혼합 하 는 것 으로, 최종 적 으로 표시 되 는 색상 은 RGB 색상 분량 과 알파 값 에 달 려 있다.그들 사이 의 관 계 는 아래 의 공식 으로 표시 할 수 있다. 색상 표시 = 원본 픽 셀 색상 X 알파 / 255 + 배경 색상 X (255 - 알파) / 255 GDI + 의 Color 클래스 는 ARGB 색상 데이터 형식 을 정의 해 알파 값 조정 을 통 해 선, 이미지 등 과 배경 색 이 혼 합 된 실제 효 과 를 변경 할 수 있다.6. 다 중 이미지 형식의 지원 GDI + 는 다양한 이미지 의 열기, 저장 기능 을 제공 합 니 다.GDI + 를 통 해 BMP 파일 을 JPG 나 다른 형식의 그림 파일 로 직접 저장 할 수 있 습 니 다.GDI + 는 위 와 같은 새로운 기능 외 에 도 재 착색, 색상 수정, 변형 제거, 메타 데이터 및 Graphics 용기 등의 기능 을 지원 한다. 6. VC. net 에서 GDI + 를 사용 하 는 방법 Visual C + +. NET 에서 GDI + 를 사용 할 때 보통 다음 절 차 를 따 릅 니 다. (1) 응용 프로그램 에 GDI + 를 포함 하 는 파일 gdiplus. h 와 추 가 된 라 이브 러 리 gdiplus. lib 를 추가 합 니 다.일반적으로 gdiplus. h 는 프로그램 에 추 가 된 stdafx. h 파일 을 포함 하고 gdiplus. lib 는 두 가지 로 추가 할 수 있 습 니 다. 첫 번 째 는 stdafx. h 파일 에 다음 문 구 를 직접 추가 하 는 것 입 니 다.
#pragma comment( lib, "gdiplus.lib" ) 

다른 방법 은 '항목 - > 속성' 메뉴 명령 을 선택 하고 팝 업 대화 상자 에서 왼쪽 '링크 기 - > 입력' 옵션 을 선택 하고 오른쪽 '추가 의존 항목' 상자 에 gdiplus. lib 를 입력 하 는 것 입 니 다. (2) 응용 프로그램 프로젝트 의 응용 클래스 에 다음 코드 와 같은 구성원 변 수 를 추가 합 니 다.
ULONG_PTR m_gdiplusToken;

그 중, ULONGPTR 은 DWORD 데이터 형식 입 니 다. 이 구성원 변 수 는 GDI + 가 초기 화 된 후 프로그램 에서 GDI + 표 지 를 저장 하 는 데 사 용 됩 니 다. 프로그램 이 종 료 된 후에 이 표 지 를 참조 하여 GDiplus:: GDiplusShutdown 을 호출 하여 GDI + 를 닫 을 수 있 습 니 다.(3) 응용 프로그램 클래스 에 ExitInstance 를 추가 하고 GDI + 를 닫 기 위해 다음 코드 를 추가 합 니 다.
int CGDIPlusApp::ExitInstance()
{
 Gdiplus::GdiplusShutdown(m_gdiplusToken);
 return CWinApp::ExitInstance();
}		
(4), 응용 클래스 의 InitInstance 함수 에 GDI + 의 초기 화 코드 를 추가 합 니 다.
BOOL CGDIPlusApp::InitInstance()
{
 CWinApp::InitInstance();
 Gdiplus::GdiplusStartupInput gdiplusStartupInput;
 Gdiplus::GdiplusStartup(&m_gdiplusToken, &gdiplusStartupInput, NULL);
 ...
}		
(5) 그림 을 그 릴 창 이나 보기 클래스 에 GDI + 의 그리 기 코드 를 추가 합 니 다.
void CGDIPlusView::onDraw(CDC *pDC)
{
	Graphics graphics( pDC->m_hDC );

	GraphicsPath path; //       
	path.AddEllipse(50, 50, 200, 100);

	//           
	PathGradientBrush pthGrBrush(&path);

	//            
	pthGrBrush.SetCenterColor(Color(255, 0, 0, 255));

	//             , alpha  0
	Color colors[] = {Color(0, 0, 0, 255)};
	INT count = 1;
	pthGrBrush.SetSurroundColors(colors, &count);

	graphics.FillRectangle(&pthGrBrush, 50, 50, 200, 100);

	LinearGradientBrush linGrBrush(
		Point(300, 50),
		Point(500, 150),
		Color(255, 255, 0, 0), //   
		Color(255, 0, 0, 255)); //   

	graphics.FillRectangle(&linGrBrush, 300, 50, 200, 100);
}		
주석: 본 작 가 는 C + + / MFC, GDI / GDI +, 영문 문서 번역, 문서 번역, 소형 시스템 개발, 기술적 난제 돌파 등 을 잘 알 고 있 습 니 다. 이메일:[email protected]전화: 13679278016

좋은 웹페이지 즐겨찾기