C++/summary

4장 이어서......

gandus 2010. 12. 8. 11:40
텍스트 함수




drawtext는 사각 영역 안에서 출력한다.
dc안에 기본값으로 폰트 10, 검은색 등을 정의되어있다.
setTextColor 등으로 바꾸거나 할 수 있다...


// 기본은 바탕색에, 검정색인데 dc안의 속성을 바꿀수 있다.
 // 이런 정보들을 가지고있다.




매핑모드





기본은 픽셀 단위 mm_text 이다.

수학적으로 할때는 내려가면 +니깐 맞지 않아서, 포맺을 바꿔야 한다

그래서 수학적으로 모델링 한것이 나머지 것들이다.

픽셀단위는 화면 해상도에 따라 크기가 달라지는 문제도 가능.

모드 - 단위  => 다 다르다.
MM단위는 해상도 상관없이 출력이 일정하다.



// 사용자가 정의를 할 수 있다. 
// 단위는 퍼센트이다.

MM_ISOTROPIC

MM_ANISOTROPIC




좌표 변환



윈도우 출력은 스크린 좌표,  무엇을 출력할때는 클라이언트 좌표
무슨 좌표인지 알아야한다.



// 논리 좌표이다. (출력할때 사용하는 것)
 dc.Ellipse(0, 0, 300, 300);
 dc.Rectangle(50, 50, 250, 250);

운영체제가 이걸 받아서 물리좌표로 장치좌표로 변환한다.

                                                         ▷
장치(픽셀-무조건)          DPtoLP()           논리좌표
                                 LPtoDP()
                   ◁

스크린 좌표

 

ClientToScreen()  ▲

     ▽    ScreenToClient()



클라이언트




속성함수.



dc안에 속성값으로 존재한다.
초기값 외로 바꿀때 함수를 이용해서 변형한다.
그리기 모드 -  기본은 나중에 출력된것으로 덮어씀.

기본값이 무엇인지 시험에....


그리기 모드





GDI 객체

- gdi에서 출력할때 사용하는 도구, 단일값이 아니라 여러개 값이 모여있다.





(CDC::SelectObject() 함수 사용).

bursh - 도형안에 색깔 pen - 윤곽선 이런식.....


사용 방법


펜 생성방법 - > 윤곽선을 그리는데 사용이 되어진다.

 

// 방법 1

CPen pen(PS_SOLID, 2, RGB(255, 0, 0)); // 폭이 2인 빨간색 펜


//
방법 2

CPen pen;

pen.CreatePen(PS_SOLID, 2, RGB (255, 0, 0)); // 폭이 2인 빨간색 펜

 


만든것을 반영해야 하는데 반영하는 법은?

예제 1

CPaintDC dc(this);

CPen pen(PS_SOLID, 1, RGB(0, 0, 255));


// 기존 팬을 반환해준다, 나중에 혹시 복구하기 위해서.
CPen *pOldPen = dc.SelectObject(&pen);


dc.Rectangle(100, 100, 200, 200);

dc.SelectObject(pOldPen);

 

 

예제2

CPaintDC dc(this);

CPen pen(PS_SOLID, 1, RGB(0, 0, 255));

dc.SelectObject(&pen);

dc.Rectangle(100, 100, 200, 200);




 

브러쉬.


기본은 시스템폰트이다.

solid가 가장 쉽다.  바탕색만 지정하면 가능하다.

해치는 교차선을 나타낸다.





폰트

생성자

CFont font;

font.CreateFont(...);

또는 font.CreateFontIndirect(...);

또는 font.CreatePointFont(...);

또는 font.CreatePointFontIndirect(...);


사용 예

CPaintDC dc(this);

CFont font;


// 400은 40pt 정도
font.CreatePointFont(400, "Arial");


dc.SelectObject(&font);

dc.TextOut(10, 10, CString("Hello"));

 

 

 

비트맵

 

// mfc 클래스

int CBitmap::GetBitmap(BITMAP* pBitMap);


// 대문자는 구조체이다.
// 비트맵 이미지에 대한 구조체이다.
typedef struct tagBITMAP {

    int bmType;

    int bmWidth; // 비트맵의 폭(픽셀)

    int bmHeight; // 비트맵의 높이(픽셀)

    int bmWidthBytes;

    BYTE bmPlanes;

    BYTE bmBitsPixel;

    LPVOID bmBits;

} BITMAP;

 

 

사용법.

 

CBitmap bitmap;

// 이미지 가져옴
bitmap.LoadBitmap(IDB_BITMAP1);


BITMAP bmpinfo; // 구조체.


// 비트맵에 대한 크기를
bitmap.GetBitmap(&bmpinfo);

TRACE("가로 = %d, 세로 = %d\n",

           bmpinfo.bmWidth, bmpinfo.bmHeight);

 

 

 

 

n  비트맵 출력 절차


// 화면dc와 맞추어 준다.
CDC::CreateCompatibleDC() 함수를 이용하여 메모리 디바이스 컨텍스트를 만든다.
CDC::SelectObject() 함수를 이용하여 비트맵을 메모리 디바이스 컨텍스트에 선택한다.
// 화면 dc에 출력을 하는것이다.
CDC::BitBlt()CDC::StretchBlt() 함수를 이용하여 화면에 출력한다.

 

 

 

 

//  nwidth, nheight  이미지 크기를 알아야한다. 구조체를 통해서

 

 

BOOL CDC::BitBlt(int x, int y, int nWidth, int nHeight,

                          CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop); 

 

 

 

 

 

        CBitmap bitmap;

        bitmap.LoadBitmap(IDB_BITMAP1);   // 비트맵을불러옴.

 

        // 이미지정보를가져오기위해서구조체등록

        BITMAP bmpinfo;

        // 정보를가져온다. - 이미지크기.

        bitmap.GetBitmap(&bmpinfo);

 

 

 

        // 메모리dc를등록하고

        CDC dcmem;

        // 연결을시켜준다.

        dcmem.CreateCompatibleDC(&dc);

        // 먼저메모리dc에넣어준다.

        dcmem.SelectObject(&bitmap);

 

        /* 속도문제때문에이렇게한다. */

 

 

        // bmpinfo.bmWidth/2 이렇게하면그림이짤린다.

        dc.BitBlt(10, 10, bmpinfo.bmWidth, bmpinfo.bmHeight/2,

               &dcmem, 0, 0, SRCCOPY);



 


        // 이미지크기를조정할대Stret를쓴다.

        // bmWidth*4, bmpinfo.bmHeight*6 는이미지크기크게.

        // &dcmem, 0, 0, bmpinfo.bmWidth, bmpinfo.bmHeight 원본에대한정보를

        dc.StretchBlt(100, 100, bmpinfo.bmWidth*4, bmpinfo.bmHeight*6,

               &dcmem, 0, 0, bmpinfo.bmWidth, bmpinfo.bmHeight, SRCCOPY);