2014년 11월 18일 화요일



목차 : 구조, 메시지, GDI, BMP, DIB



MFC?
c++기반의 API 클래스 라이브러리, 윈도우 어플리케이션의 뼈대를 제공하며, 이를 AFX(Application Frameworks)라 한다.

MFC 구조
OS - SDK API - MFC - Application(응용 프로그램)



MFC는 객체지향적으로 오브젝트 단위로 분할 설계되어 있다.
 - 프레임 윈도우와 뷰 : 위치조절, 크기조절, 윈도우 프레임 관련 작업
 - 뷰와 도큐먼트 : 화면출력 부분과 데이터 관리 부분을 분담하여 개발 및 유지보수에 도움


MFC 각각의  클래스 들은 뼈대를 이루는 클래스로부터 하나하나 상속받아 사용된다.


프로그램이 실행되면 CWinApp 클래스는 인스턴스가 생성되며, 3가지 맴버 함수가 차례로 호출된다. InitInstance() -> Run() -> ExitInstance() 



CWinApp 클래스를 상속받아 사용하므로, 부모의 함수를 재정의 하여 원하는 기능을 추가하여 사용이 가능해진다. MFC에서 제공되는 클래스는 별다른 기능은 없지만 각각의 상황마다 호출되는 함수들을 미리 만들어 두었으므로 원하는 순간 호출되는 함수를 재정의하여 사용하면 된다.



MFC 메시지 구동 방식

- 메시지 맵 : MFC에는 가상 함수 테이블이 존재하며, CWnd 메시지 함수 핸들러는 약 200개가 된다.즉, 메모리 사용량의 해결이 어렵다. 그러므로 메시지 맵을 사용(함수 포인터 배열)


GDI(Graphics Device Interface) 윈도우즈 내부에 설정되어 있는 그래픽 디바이스와 연결

디바이스 콘텍스트(Device Context) OS로부터 화면 사용권한을 부여 받는 것.

GDI Object : DC출력 권한을 얻고, 출력하기 위한 재료.
ex) CPen, CBrush, CFont, CBitmap, CPalette, CRgn

디바이스 콘텍스트 관련 클래스
 - CDC 클래스 : GDI Obj를 통해 그래픽 관련 옵션을 저장하며, 멤버 변수에 DC가 있으며, DC를 도와주는 변수와 함수들도 포함되어 있다.
GetDC(), ReleaseDC()를 통해 DC 할당과 해제

CClientDC는 GetDC와 ReleaseDC를 사용할 필요가 없다. 생성자와 소멸자 내부에서 자동으로 호출

레스터 오퍼레이션 : 기존 그림과 합성되어 그려질 것인가?



비트맵 : 작은 점들의 2차원 배열로 수많은 점들이 모여서 보여지는 이미지. 전혀 압축이 되지 않아 사용이 편리하지만 용량에 단점이 있다.


벡터 그래픽은 비트맵 방식과 반대로 선, 면, 호 , 원 등 그래픽 구성요소에 대한 하나하나 객체 정보를 가지고 있다.

DDB(Device Dependent Bitmap) 비트맵 이미지에 대한 구조를 자체적으로 가지고 있지 않고 장치에 의해서 결정 된다.

DIB(Device Independent Bitmap) 장치 독립적 비트맵 비트맵 자체에 대한 색상, 팔레트 및 이미지 출력에 대한 모든 정보를 포함하고 있다.


화면 출력

BitBlt(BitBlockTransfer) 임의의 DC에서 다른 DC로 비트맵 블록 전송
pDC->BitBlt( 0,0,160,100,&MemDC,0,0,SRCCOPY );

StretchBlt는 BitBlt과 같지만 확대 또는 축소해서 전송
pDC->StretchBlt( 0,0,100,100,&MemDC,50,50,0,0, SRCCOPY);


비트맵 정보 얻기
CGdiObject::GetObject( int nCount, LPVOID lpObject );


BMP파일 구조
BitmapFileHeader(14byte) 파일에 대한 정보를 가지고 있다.
BitmapInfo(40byte+팔레트) 사이즈가 변경될 수 있는 부분
DataBlock 데이터에 대한 부분으로 이미지 데이터가 존재, 4byte단위로 저장
 - 8bit이하는 DataBlock에 팔레트 인덱스 번호가 저장되며, 16bit 이상의 칼라이미지일 경우 실제 이미지가 저장.
 - 4byte정렬이 끝난 파일에 실제 저장 길이 구하는 계산식
    (Width * PixelByte) + 3 & ~3


DIB출력 MFC가 아닌 API함수로 구성
DIB출력이기 때문에 DDB와 다르게 이미지 데이터에 대한 포인터, 비트맵 인포 구조체의 포인터를 넣어줘야 한다.
SetDIBitsToDevice() 이미지를 DC에 출력.
StretchDIBits() 확대 축소 기능이 포함된 출력.


DIB클래스는 범용적인 사용이 가능하므로 API기반 클래스로 만들어 사용하면 유용하다.

참고) gamecodi 이주행(master@gamecodi.com)님 글

0 개의 댓글:

댓글 쓰기