Chapter 5. 그래픽처리 Widws Prgrammig, 2009 Fall
GDI 와 DC GDI (Graphics Device Iterface) 응용프로그램이하드웨어를제어할수있도록윈도우 OS 가제공하는모든기능 윈도우가출력장치에대한정보를스스로판단하고분석하여, 실제로사용할드라이버를불러옴 이를이용할경우, 하드웨어독립적인프로그래밍을할수있음 Widws Device Driver Prgram S/W Device H/W Ceter fr E-Busiess Techlgy Cpyright Ó2009 by CEBT IDS Lab. Semiar - 2
GDI 와 DC DC (Device Ctext) 출력장치에무엇인가를출력하고자할경우, 윈도우로부터얻은출력장치를사용할수있는권한 그래픽에필요한모든옵션을한곳에모아둔구조체 i.e. 선을그릴때옵션, 문자를출력할때옵션, 도형을칠할때옵션등 GDI vs DC 미술시간에필요한도화지에해당하는것이 DC 클라이언트영역혹은윈도우영역의 DC 를얻음 도화지에실제그림을그릴수있는연필, 펜등이 GDI 펜, 브러시등 GDI 객체를정의 Ceter fr E-Busiess Techlgy Cpyright Ó2009 by CEBT IDS Lab. Semiar - 3
DC를얻는방법 ODraw() 함수나 OPait() 함수를이용 ODarw() 함수에서인자로넘어온 CDC 클래스 OPait() 함수에서 CPaitDC 클래스를받아사용 ODraw() : view class, OPait() : ther classes 윈도우가변하여도화면출력이변하지않음 vid CPractice4_1View:ODraw(CDC* pdc) { } vid CPractice4_1View::OPait() { CPaitDC dc(this); } Ceter fr E-Busiess Techlgy Cpyright Ó2009 by CEBT IDS Lab. Semiar - 4
DC를얻는방법 GetDC() 함수를이용 GetDC() 함수를이용하여 CDC 클래스의인스턴스를포인터형태로넘겨받아이용 작업종료후, 반드시 ReleaseDC() 를호출하여시스템에 DC 반환 윈도우가변하면, 출력내용이사라짐 화면의변화가생기면, WM_PAINT 가호출되고, ODraw() 혹은 OPait() 가호출되어화면이갱신되므로 CDC *pdc = GetDC() ; // DC 얻음 ReleaseDC(pDC); // DC 반환 Ceter fr E-Busiess Techlgy Cpyright Ó2009 by CEBT IDS Lab. Semiar - 5
DC를얻는방법 CClietDC 클래스를이용 CDC 클래스의파생클래스인 CClietDC 를이용 생성자함수에서 GetDC() 를호출하고소멸자함수에서 ReleaseDC() 호출 객체생성시, 초기값으로작업할영역에속한윈도우의 this 포인터를넘김 GetDC() 를이용하므로, 윈도우가변하면출력이사라짐 CClietDC dc(this); Ceter fr E-Busiess Techlgy Cpyright Ó2009 by CEBT IDS Lab. Semiar - 6
DC를얻는방법 CWidwDC 클래스를이용 이전의방법은클라이언트영역을얻는방법이지만, CWidwDC 는윈도우영역에대한 DC 를얻음 ( 윈도우영역에그래픽출력 ) GetWidwDC() 함수를이용하여, WidwDC 클래스의인스턴스를포인터로넘겨받아이용 작업종료후, 반드시 ReleaseDC() 함수를호출하여시스템에반환 CWidwDC *pdc = GetWidwDC();. ReleaseDC(pDC); Ceter fr E-Busiess Techlgy Cpyright Ó2009 by CEBT IDS Lab. Semiar - 7
GDI 객체 GDI 객체는화면에그림을그리거나문자를출력할때사용 윈도우프로그램은문자역시하나의그림으로취급 펜, 브러시, 폰트, 비트맴등을핸들링하는핸들 GDI 객체의핸들은가지고있는클래스를 GDI 객체클래스 GDI 객체 GDI 객체클래스 기본값 사용용도 펜 CPe 검정색, 실선, 1 픽셀크기 점, 선, 테두리 브러시 CBrush 무늬없는흰색내부채우기 폰트 CFt 시스템폰트문자의폰트 비트맵 CBitmap 무비트맵출력 영역 CRg 무 영역만들기, 변경하기 팔레트 CPallete 무팔레트조작 Ceter fr E-Busiess Techlgy Cpyright Ó2009 by CEBT IDS Lab. Semiar - 8
GDI 객체사용법 1. GDI 객체생성 CPe pe, *ldpe; pe.createpe(ps_solid, 1, RBG(0,0,0)); pe ldpe 3. DC 를사용하여그래픽출력 pdc->ellipse(0,0,10,10); 2. GDI 객체등록 ldpe = pdc->selectobject(&pe); 4. 이전 GDI 객체로되돌림 pdc->selectobject(ldpe); CPallete pe Pe Brush 5. GDI 객체삭제 pe.deleteobject(); CRg Bitmap Ft Device Ctext Ceter fr E-Busiess Techlgy Cpyright Ó2009 by CEBT IDS Lab. Semiar - 9
CPe BOOL CreatePe( it PeStyle, it Width, COLORREF crclr ); http://msd.micrsft.cm/e-us/library/aa273771(vs.60).aspx PeStyle: 펜스타일 Width: 펜의굵기 crclr: 펜의색상 PeStyle 내용모양 PS_SOLID PS_DASH PS_DOT PS_DASHDOT PS_DASHDOTDOT PS_NULL 실선파선점선일점쇄선이점쇄선선을그리지않음 Ceter fr E-Busiess Techlgy Cpyright Ó2009 by CEBT IDS Lab. Semiar - 10
CBrush 영역의내부를채움 색, 패턴등을설정브러시생성 BOOL CreateSlidBrush( COLORREF crclr ); http://msd.micrsft.cm/e-us/library/aa268652(vs.60).aspx brush.createslidbrush(rgb(0, 0, 0)); // 검정색브러시를생성 BOOL CreateHatchBrush( it Idex, COLORREF crclr ); Style http://msd.micrsft.cm/e-us/library/aa268650(vs.60).aspx brush.createhatchbrush(hs_cross, RGB(0,0,0)); 십자가형태의빗금을가진브러시생성 HS_CROSS HS_BDIAGONAL HS_DIAGCROSS HS_FDIAGONAL HS_HORIZONTAL HS_VERTICAL 등록, 사용, 삭제는펜과동일 Cpe à CBrush Ceter fr E-Busiess Techlgy Cpyright Ó2009 by CEBT IDS Lab. Semiar - 11
펜과브러시를이용한그래픽함수 CPe pe, *ldpe; pe.createpe(ps_solid, 2, RGB(0, 0, 0)); ldpe = pdc->selectobject(&pe); // 선그리기 pdc->mvet(120, 100); pdc->liet(180, 200); CBrush brush, *ldbrush; brush.createslidbrush(rgb(0xff,0xff,0x00)); ldbrush = pdc->selectobject(&brush); // 사각형그리기 pdc->rectagle(300, 10, 450, 80); pdc->selectobject(ldbrush); brush.deleteobject(); brush.createslidbrush(rgb(0xff,0x00,0x00)); ldbrush = pdc->selectobject(&brush); // 닫히지않은다각형그리기 CPit ptdata[3]; ptdata[0].x = 300; ptdata[0].y = 500; ptdata[1].x = 400; ptdata[1].y = 300; ptdata[2].x = 300; ptdata[2].y = 300; pdc->plylie(ptdata, 3); // 닫힌다각형그리기 // 닫히지않은다각형그리기 ptdata[0].x = 10; ptdata[0].y = 10; ptdata[1].x = 80; ptdata[1].y = 100; ptdata[2].x = 100; ptdata[2].y = 10; pdc->plyg(ptdata, 3); // 타원그리기 pdc->ellipse(200, 250, 300, 300); pdc->selectobject(ldbrush); brush.deleteobject(); pdc->selectobject(ldpe); pe.deleteobject(); Ceter fr E-Busiess Techlgy Cpyright Ó2009 by CEBT IDS Lab. Semiar - 12
래스터오퍼레이션 (Raster Operati) 새로그려야할그림과기존에화면에그려져있는그림을합성하는것을말함 래스터오퍼레이션은펜과브러시에적용되며, SetROP2() 로설정 it SetROP2( it DrawMde ); http://msd.micrsft.cm/e-us/library/aa278978(vs.60).aspx R2_COPYPEN 배경의화면을무시하고새로그려지는그림이출력 R2_XORPEN 배경의화면을유지하면서, 움직이는그림을그릴때사용 R2_XORPEN 으로한번그려주면그림이그려지고같은방법으로다시한번그리면원래의바탕색이복원 Aimati Ceter fr E-Busiess Techlgy Cpyright Ó2009 by CEBT IDS Lab. Semiar - 13
래스터오퍼레이션 (Raster Operati) RGB () 함수는윈도우에서색상을표현각각 0~255 의값을갖음 빨강 : RGB(255, 0, 0), 파랑 (0, 0, 255), 흰색 :RGB(255, 255, 255) 이들을이진수로표현하면빨강 : RGB(11111111, 0, 0) 임 바탕색이흰색일경우, R2_XORPEN 으로파란색을그림 R G B 바탕색 11111111 11111111 11111111 새로그리는색 00000000 00000000 11111111 출력되는색 ( 노랑 ) 11111111 11111111 00000000 다시파란색으로그림 R G B 바탕색 11111111 11111111 00000000 새로그리는색 00000000 00000000 11111111 출력되는색 ( 노랑 ) 11111111 11111111 11111111 Ceter fr E-Busiess Techlgy Cpyright Ó2009 by CEBT IDS Lab. Semiar - 14
CBitmap 1. 화면 DC 와메모리 DC 생성 비트맵을로드할메모리 DC 비트맵이출력될화면 DC //pdc; CDC memdc; memdc pdc 2. 화면 DC 와호환성갖는메모리 DC 생성 memdc.createcmpatibledc(pdc); bitmap 3. 비트맵로딩 CBitmap bitmap, *ldbitmap; bitmap.ladbitmap(idb_bitmap1); 4. 메모리 DC 에비트맵설정 ldbitmap = memdc.selectobject(&bitmap); 5. 비트맵블록전송 6. DC 복원 pdc->bitblt(0, 0, 450, 85, &memdc, 0, 0, SRCCOPY); memdc.selectobject(ldbitmap); Ceter fr E-Busiess Techlgy Cpyright Ó2009 by CEBT IDS Lab. Semiar - 15
CBitmap virtual BOOL CreateCmpatibleDC( CDC* pdc ); http://msd.micrsft.cm/e-us/library/aa293677(vs.60).aspx BOOL LadBitmap( UINT IDResurce ); http://msd.micrsft.cm/e-us/library/aa268633(vs.60).aspx BOOL BitBlt( it x, it y, it Width, it Height, CDC* psrcdc, it xsrc, it ysrc, DWORD dwrp ); http://msd.micrsft.cm/e-us/library/aa293654(vs.60).aspx Ceter fr E-Busiess Techlgy Cpyright Ó2009 by CEBT IDS Lab. Semiar - 16
CFt memset(&lf, 0, sizef(logfont)); CClietDC dc(this); lf.lfheight = -MulDiv(12, dc.getdevicecaps(logpixelsy), 72); strcpy(lf.lffacename, "Times New Rma"); CFtDialg dlg(&lf); if( dlg.dmdal() == IDOK ) { dlg.getcurretft(&lf); Ivalidate(); } BOOL TextOut( it x, it y, cst CStrig& str ); http://msd.micrsft.cm/e-us/library/aa279021(vs.60).aspx CSize TabbedTextOut( it x, it y, cst CStrig& str, it TabPsitis, LPINT lptabstppsitis, it TabOrigi ); http://msd.micrsft.cm/e-us/library/aa279019(vs.60).aspx BOOL ExtTextOut( it x, it y, UINT Optis, LPCRECT lprect, cst CStrig& str, LPINT lpdxwidths ); http://msd.micrsft.cm/e-us/library/aa293769(vs.60).aspx it DrawText( cst CStrig& str, LPRECT lprect, UINT Frmat ); http://msd.micrsft.cm/e-us/library/aa293740(vs.60).aspx Ceter fr E-Busiess Techlgy Cpyright Ó2009 by CEBT IDS Lab. Semiar - 17
CFt CFt ft, *ldft; ft.createft(20, 20, // 폰트의너비와높이 0, 0, // 기울어진각도 FW_DONTCARE, // 폰트의굵기 FALSE, FALSE, // 폰트의기울임꼴과밑줄 FALSE, DEFAULT_CHARESET, // 폰트의취소선과문자셋 OUT_DEFAULT_PRECIS, // 출력정확도 CLIPDEFAULT_PRECIS, // 클리핑정확도 DEFAULT_QUALITY, DEFAULT_PITCH, // 출력의질과자간 굴림체 ); // 폰트이름 virtual COLORREF SetTextClr( COLORREF crclr ); http://msd.micrsft.cm/e-us/library/aa278990(vs.60).aspx virtual COLORREF SetBkClr( COLORREF crclr ); http://msd.micrsft.cm/e-us/library/aa278949(vs.60).aspx it SetBkMde( it BkMde ); http://msd.micrsft.cm/e-us/library/aa278952(vs.60).aspx UINT SetTextAlig( UINT Flags ); http://msd.micrsft.cm/e-us/library/aa278983(vs.60).aspx Ceter fr E-Busiess Techlgy Cpyright Ó2009 by CEBT IDS Lab. Semiar - 18
실습 마우스를클릭하고드래그함으로써선을그릴수있는프로그램을구현 ( 래스터오퍼레이션 ) OLButtDw, OMuseMve 마우스를누른상태에서마우스커서를움직이면선이마우스커서를따라다이며움직이며, 마우스를놓으면선이고정됨 완료되면, 책에있는실습 5-1 을수행 Ceter fr E-Busiess Techlgy Cpyright Ó2009 by CEBT IDS Lab. Semiar - 19