윈도우프로그래밍및실습 003. 출력 DB & MINING LAB. Korea University 2 nd updated 2012. 08. 18 Last updated 2015. 08. 26 이종욱 eastwest9@korea.ac.kr 1
Purpose of this chapter How to show some information on your screen 2
3 장. Device Context(DC). 윈도우는세가지동적연결라이브러리 (Dynamic Linked Library) 로구성 KERNEL : 메모리를관리하고프로그램을실행 USER : 유저인터페이스와윈도우를관리 GDI : 화면처리와그래픽을담당. Graphic Device Interface Device Context(DC) 출력에필요한모든정보를가지는데이터구조체 GDI 모듈에의해관리 폰트, 선색상과굵기, 채움무늬와색상, 그리기등. 왜필요한가?! 화면출력 ( 모든그림, 글자 ) 은 GDI를통해야한다. 그런데, 개별적으로 GDI를이용하려면수많은설정을직접해야한다. 이러한문제점을 DC를이용하여보다효율적으로화면출력을다를수있다. 3
Device Context(DC) 필요성 (1/2) 화면에선을긋기위해필요한것은? 시작 끝위치정보, 선색상, 굴기, 모양, 선을그리는모드, 좌표값해석하는방법등의추가정보. LineTo(StratX, StartY, EndX, EndY, Color, Width, Shape, mode, ) 선을긋기위해그때마다수많은인수를입력?! LineTo(hDC, X, Y) : DC 핸들과, 끝점위치만인수로 (50, 50) 에서 (150,100) 좌표로선그리기 4
Device Context(DC) 필요성 (2/2) 윈도우는여러개의프로그램이동시에실행되는멀티태스킹시스템이 기때문에그리기함수에의해실제출력되는모양은주변환경에따라 달라진다. 2 가지영역이겹쳐졌을때어떻게그려야하는가?! Device Context 를통해서처리 (OS 가알아서처리하도록!) 윈도우끼리출력결과가서로를방해하지않도록완충역할 5
3-1a. 문자열출력 : TextOut 코드작성 (1/2) // 생략 6
3-1a. 문자열출력 : TextOut 코드작성 (1/2) //hdc 변수선언 // hdc 에현재윈도우정보넘겨주고, GetDC 함수가해당화면정보제어 7
3-1a. 문자열출력 : TextOut 출력 마우스왼쪽버튼클릭 - 크기조정 - 창을아래로 어떤변화? 문제점? 추가 ) 다른마우스창으로 Beautiful Korea 영역을가려본다 기존에는변화가있었음 8
3-1b. 문자열출력 : TextOut2 코드작성 (1/2) // 생략 // 생략 9
3-1b. 문자열출력 : TextOut2 코드작성 (2/2) // WM_PAINT 에서 // BeginPaint( ) 이용 10
3-1b. 문자열출력 : TextOut2 출력 - 크기조정 - 창을아래로 - 다른창으로가리기 질문! TextOut 과 TextOut2 코드의차이는? 11
Device Context 얻는법 1: GetDC( ) 먼저, hdc 선언 GetDC 함수를사용하여 DC를얻고사용후 RelleaseDC 함수로 DC 사용해제 HDC GetDC(HWND hwnd); int ReleaseDC(HWND hwnd, HDC hdc); GetDC는 hwnd가가리키는윈도우에적당한 DC를만들어핸들을리턴한다. ReleaseDC 함수사용이유? DC 를위해할당된메모리공간해제 HDC hdc; hdc = GetDC(hWnd); // 각종출력문에서 hdc를사용 ReleaseDC(hWnd, hdc); 12
Device Context 얻는법 2: BeginPaint( ) 먼저 HDC hdc; 선언 DC 핸들을 BeginPaint 함수로부터얻고, EndPaint 로해제. WM_PAINT 메시지루틴내에서만사용가능. HDC BeginPaint(HWND hwnd, LPPAINTSTRUCT lppaint); BOOL Endpaint(HWND hwnd, CONST PAINTSTRUCT *lppaint); Typedef struct tagpaintstruct { HDC hdc; PAINTSTURCT ps; case WM_PAINT: hdc = BeginPaint(hWnd, &ps); // 각종출력문에서 hdc를사용 HDC hdc; // 사용자사용 BOOL ferase; // 사용자사용 RECT rcpaint; // 사용자사용 BOOL frestore; // 윈도우즈내부 BOOL flncupdate; // 윈도우즈내부 BYTE RGBRESERVED[16]; // 윈도우즈내부 EndPaint(hWnd, &ps); }PAINTSTRUCT; 13
3-2. TextOut( ) 이해 : 문자열출력 BOOL TextOut( HDC hdc, int nxstart, int nystart, LPCTSTR lpstring, int cbstring ); 1. Device Context 핸들 3. 출력될문자열 y 위치 5. 출력될문자열길이 2. 출력될문자열 x 위치 4. 출력될문자열 코드작성예 // 문자열출력하는것이번거로움 다음과같이변경, 미리문자열포인터를만들어둔다. // 문자열을가리키는문자열포인터를이용한다 _tcslen( ) TCHAR 문자열의길이를구하는함수 14
3-2. TextOut( ) 이해 : 문자열정렬 (1/4) UINT SetTextAlign( HDC hdc, UINT fmode ); 1. Device Context 핸들 2. 문자열정렬플래그설정, 디폴트는 TA_TOP TA_LEFT ( 좌상단 ) 값 TA_TOP TA_BOTTOM TA_CENTER TA_LEFT TA_RIGHT TA_UPDATECP TA_NOUPDATECP 설명지정한좌표가상단지정한좌표가하단지정한좌표가수평중앙좌표지정한좌표가수평왼쪽지정한좌표가수평오른쪽지정한좌표가 CP(Current Position) 를사용하며문자열출력후에 CP를변경 CP를사용하지않고지정한좌표를사용하며, CP를변경하지않는다 TextOut(hDC, 100, 100, _T("Beautiful Korea"), 15 ); // 문자열정렬디폴트사용 이좌표가 (100, 100) Beautiful Korea TA_TOP TA_BOTTOM TA_LEFT TA_CENTER TA_RIGHT Beautiful Korea Current Position : 텍스트모드에서다음문자가출력될위치를커서가표시하듯이 그래픽모드에서는다음그래픽이출력될위치를 CP 라고한다. ( 다만깜빡이진않는다 ) 15
3-2. TextOut( ) 이해 : 문자열정렬 (2/4) TextOut3 프로젝트생성 16
3-2. TextOut : 문자열정렬 (4/4) TA_UPDATECP 플래그를사용하면출력위치를지정하는인수를무시하고, 항상 CP 의위치에문자열을출력, 출력후에 CP 를문자열의다음위치로옮긴다. SetTextAlign(hdc, TA_UPDATECP); 를첫번째 TextOut 뒤에위치시키면어떻게출력되는가? CP 와내가지정한좌표위치와관계가있는가? 17
3-2. DrawText: 긴문자열출력 (1/3) int DrawText( HDC hdc, LPCTSTR lpstring, int ncount, LPRECT lprect, UINT uformat ); 1. Device Context 핸들 // 윈도우즈에서사각영역정의에사용하는 RECT 구조체 typedef struct _RECT { LONG left; LONG top; LONG right; LONG bottom; } RECT; 2. 출력될문자포인터 3. 출력될문자열길이 -1 이면널종류문자열로간주 값 설명 DT_LEFT 수평왼쪽정렬한다. DT_RIGHT 수평오른쪽정렬한다. DT_CENTER 수평중앙정렬한다. DT_BOTTOM 사각영역의바닥에문자열을출력한다. DT_VCENTER 사각영역의수직중앙에문자열을출력한다. DT_WORDBREAK 사각영역의오른쪽끝에서자동개행되도록한다. DT_SINGLELINE 한줄로출력한다. DT_NOCLIP 4. 출력될사각영역 RECT 구조체포인터 5. 사각영역의경계를벗어나도문자열을자르지않고그대로출력한다. 18
3-2. DrawText: 긴문자열출력 (2/3) 주의 : 2010 이상버전에서수행하면에러발생. Visual 6 은아스키코드기준인데 2010 은유니코드환경이기때문이다. 19
DrawText 프로젝트생성 3-2. DrawText: 긴문자열출력 (3/3) _tcslen( ) TCHAR 문자열의길이를구하는함수 20
GraphOut 프로젝트생성 3-3. 그래픽출력 COLORREF SetPixel(hdc, nxpos, nypos, clrref) // 픽셀하나 DWORD MoveToEx(hdc, x, y, lppoint) // 선그리기위해이동 BOOL LineTo(hdc, xend, yend) // MoveToEx x,y위치부터 xend,yend까지선그리기 BOOL Rectangle(hdc, nleftrect, ntoprect, nrightrect, nbottomrect) BOOL Ellipse(hdc, nleftrect, ntoprect, nrightrect, nbottomrect) MoveToEx(hdc, A, B, NULL); LineTo(hdc, C, D); 21
3-3. 메시지박스 MessagBox 프로젝트생성 int MessageBox(HWND hwnd, LPCTSTR lptext, LPCTSTR lpcaption, UINT utype); 1. 메시지박스 Owner 윈도우 2. 메시지박스에출력할문자열 3. 메시지박스타이틀에출력할문자열 4. 어떤종류의버튼이나타날것인가 설명 MB_ABORTRETRYIGNORE Abort, Retry, Ignore 세개의버튼이나타난다. MB_OK OK버튼하나만나타난다. MB_OKCANCEL OK, Cancel 두개의버튼이나타난다. MB_RETRYCANCEL Retry, Cancel 두개의버튼이나타난다. MB_YESNO Yes, No 두개의버튼이나타난다. MB_YESNOCANCEL Yes, No, Cancel 세개의버튼이나타난다. 22