250 likes | 663 Views
MFC 프로그래밍 기본. 강성관. CString 클래스 (1/3). 특성 가변 길이 문자열을 지원한다 . 프로그램 실행 도중 문자열 길이를 자유롭게 바꿀 수 있다 . 최대 길이는 (INT_MAX - 1) 이다 . const char* 나 LPCTSTR 대신 CString 객체를 직접 사용할 수 있다 . 이때는 CString 객체에 대해 (LPCTSTR) 연산자를 명시적으로 적용하는 것이 좋다 . CString str = " 안녕하세요 .";
E N D
MFC 프로그래밍 기본 강성관
CString 클래스 (1/3) • 특성 • 가변 길이 문자열을 지원한다. • 프로그램 실행 도중 문자열 길이를 자유롭게 바꿀 수 있다. 최대 길이는 (INT_MAX - 1)이다. • const char*나 LPCTSTR 대신 CString 객체를 직접 사용할 수 있다. • 이때는 CString 객체에 대해 (LPCTSTR) 연산자를 명시적으로 적용하는 것이 좋다. CString str = "안녕하세요."; cout << (LPCTSTR)str << endl; // 실행 결과? cout << str << endl; // 실행 결과?
CString 클래스 (2/3) • 객체 생성 및 초기화 CString str1; str1 = "안녕하세요."; CString str2("오늘은"); CString str3(str2); CString str4 = str1 + " " + str2 + " 즐거운 날입니다."; cout << (LPCTSTR)str1 << endl; cout << (LPCTSTR)str2 << endl; cout << (LPCTSTR)str3 << endl; cout << (LPCTSTR)str4 << endl; str4 += " 하하하"; cout << (LPCTSTR)str4 << endl;
CString 클래스 (3/3) • CString::Format( ) • CString::LoadString( ) CString str; str.Format("x=%d, y=%d", 100, 200); MessageBox(NULL, (LPCTSTR)str, "CString 연습", MB_OK); CString str; str.LoadString(IDS_HELLO); MessageBox(NULL, (LPCTSTR)str, "CString 연습", MB_OK);
CPoint, CRect 클래스 • 클래스 정의 • 업캐스팅 void SomeFunc(RECT* rect) { ... } RECT r1; CRect r2; SomeFunc(&r1); // OK! SomeFunc(&r2); // OK! (Upcasting)
CPoint 클래스 • 생성자 • 예 CPoint::CPoint (int x, int y); CPoint pt1(10, 20); POINT pt = {30, 40}; CPoint pt2(pt); pt1.Offset(40, 30); pt2.Offset(20, 10); if(pt1 == pt2) cout << "두 점의 좌표가 같습니다." << endl; else cout << "두 점의 좌표가 다릅니다." << endl;
CRect 클래스 (1/2) • 생성자 • 사각형의 폭과 높이 • 좌표의 포함 여부 판단 CRect::CRect (int l, int t, int r, int b); int CRect::Width (); int CRect::Height (); BOOL CRect::PtInRect (POINT point);
CRect 클래스 (2/2) • 예 CRect rect1; rect1.SetRect(0, 0, 200, 100); CRect rect2(0, 0, 200, 100); if(rect1 == rect2) cout << "두 사각형의 좌표가 같습니다." << endl; else cout << "두 사각형의 좌표가 다릅니다." << endl; RECT rect = {100, 100, 300, 200}; CRect rect3(rect); cout << rect3.Width() << " " << rect3.Height() << endl; CPoint pt(200, 150); if(rect3.PtInRect(pt)) cout << "점이 사각형 내부에 있습니다." << endl; else cout << "점이 사각형 외부에 있습니다." << endl;
MainFrame 객체 GetActiveView() GetActiveDocument() GetFirstViewPosition() GetNextView() View 객체 Document객체 GetDocument() 객체들 사이에서 상호참조를 위한 함수들
CArchive 클래스 • 각종 외부문서 데이터를 읽고 저장하는 기능을 지원하기 위한 클래스 • 이 클래스를 이용하여 데이터를 파일에 저장하거나 파일로부터 데이터를 읽어들 일 수 있다. • 문서 파일을 디스크가 아닌 메모리나 네트워크와의 연결을 통해 저장하 거나 전송하기 위한 처리에서도 이 클래스를 사용 디스크 저장 CFile 클래스 메모리 저장 Cdocument 클래스 Serialize 함수 CMemFile 클래스 네트워크 연결 CSocketFile 클래스 Carchive 클래스를 통한 데이터의 입출력
GDI(Graphic Device Interface) • 윈도우 시스템은 디바이스 드라이버를 이용하여 하드웨어에 독립적인프로그래밍이 가능 • 장치 의존적인 하드웨어 구동은 디바이스 드라이버 프로그램이 담당 • 윈도우 운영체제는 디바이스 드라이버를 구동하는 식 • Application program은 하드웨어 종류에 상관없이 동일한 명령을 사용하여그래픽 출력을 처리할 수 있고 하드웨어에 독립적이 될 수 있는 전반적인윈도우가 제공하는 그래픽 환경 • DC(Device Context) • 그래픽에 필요한 모든 옵션을 한곳에 모아놓은 구조체 • 선그리기, 글꼴처리, 비트맵과 팔레트 옵션, 영역 처리등의 그래픽을 처리하는 모든 옵션들을 DC에 모아놓고 제어할 수 있도록 함. • CDC(Class of Device Context) • MFC에서 제공하는 DC클래스 = = MFC에서 DC를 클래스로 구현 • 그래픽에 필요한 모든 기능은 CDC에 있으므로 화면에 뭔가를 출력하려고하는 경우에 CDC 클래스의 instance를 얻어와서 이용해야 함. • DC는 시스템 자원이므로 얻어와서 사용후 반드시 반납해야 함. • CDC *pDC = GetDC(); //instance를 얻어옴 • pDC->TextOut(100,100, “문자출력예”) ;(100,100)위치에 문자를 출력함 • ReleaseDC(pDC); //얻어온 instance를 시스템에 반환.
그래픽 디바이스 인터페이스 (GDI: Graphic Device Interface) • 그래픽 기능과 관련해서 윈도우 운영체제가 어플리케이션 프로그램에 제공하는 모든 기능 • 디바이스 컨텍스트 (DC: Device Context) • 그래픽에 필요한 모든 옵션을 한곳에 모아둔 구조체 • GDI 오브젝트 (GDI Object) • 독립적으로 저장되는 각 범주의 그래픽 옵션 12
GDI 객체 사용 및 해지 과정 • GDI 객체를 생성 • 생성된 GDI 객체를 DC에 선택하여 넣기 • 이때, DC에 있던 이전의 객체를 저장해야함 • DC를 쓰고 난 다음에 DC를 원래 상태로 복구하기 위해 사용됨 • DC를 사용하여 그림 그리기를 함 • DC에 단계 2)에서 얻은 원래 GDI 객체를 선택하여 넣기. • DC를 원래 상태로 복구하는 과정
GDI 객체와 MFC 클래스 SRCCOPY
이미지 파일의 구조 헤드없음 영상의 헤드 (Head) BMP,JPG,GIF등의 헤드가 있는 영상 파일들 RAW파일(헤드가 없음) • 헤드 내에는 영상의 크기, 컬러의 수, 팔레트 등의 다양한 정보가 들어있다. • RAW파일은 헤드정보가 없으며 파일을 읽기 위해서는 영상의 크기를 미리 알고 있어야 한다.
RAW 및 BMP 파일 형식의 비교 헤드없음 BMP 파일의 헤드 RAW파일(헤드가 없음) RAW 포맷 BMP 포맷
BITMAPINFOHEADER • The BITMAPINFOHEADER structure contains information about the • dimensions and color format of a device-independent bitmap (DIB). • typedef struct tagBITMAPINFOHEADER • { • // bmih • DWORD biSize; LONG biWidth; LONG biHeight; • WORD biPlanes; WORD biBitCount; DWORD biCompression; • DWORD biSizeImage; LONG biXPelsPerMeter; LONG biYPelsPerMeter; • DWORD biClrUsed; DWORD biClrImportant; • } BITMAPINFOHEADER; • Members • biSize • Specifies the number of bytes required by the structure. • biWidth • Specifies the width of the bitmap, in pixels. • biHeight • Specifies the height of the bitmap, in pixels. • biSizeImage • Specifies the size, in bytes, of the image. • This may be set to zero for BI_RGB bitmaps.
biBitCount • Specifies the number of bits per pixel. • The biBitCount member of the BITMAPINFOHEADER • structure determines the number of bits that define each • pixel and the maximum number of colors in the bitmap.
화면 DC와 메모리 DC 만들기 • 비트맵을 출력하려면 DC가 두개 필요 • 비트맾이 출력될 화면 윈도우의 DC • 메모리에 만들어진 DC
RGBQUAD • The RGBQUAD structure describes a color consisting of relative • intensities of red, green, and blue. • typedef struct tagRGBQUAD • { • // rgbq BYTE rgbBlue; • BYTE rgbGreen; • BYTE rgbRed; • BYTE rgbReserved; • } • 멤버변수 : • rgbBlue • Specifies the intensity of blue in the color. • rgbGreen • Specifies the intensity of green in the color. • rgbRed • Specifies the intensity of red in the color. • rgbReserved • Reserved; must be zero.
Invalidate([FALSE | TRUE])함수 • 강제로 WM_PAINT 메시지를 발생시켜 OnDraw()함수가 호출되게 함. • 파라미터 FALSE 이면 • background 영역은 안지워지고 업데이트 되는 부분만다시 그려짐 • 파라미터 TRUE 이면 • background 영역이모두 지워지고 업데이트 되는 부분도 다시 그려짐 • PreCreateWindow() 함수 • 윈도우가 생성되기 직전에 호출 • 앞으로 생성될 윈도우에 대한 정보가 매개변수로 넘어오 고 , 이 매개변수를 그대로 이용하여 윈도우가 생성됨 • 프레임(메인) 윈도우가 생성될 때, 윈도우의 속성을 바꾸어 줄 수 있다.
Serialize() 함수 • 클래스 데이터의 내용을 파일에 저장하거나 읽어옴. • 거의 모든 MFC 클래스가 Serialize()함수를 사용할 수 있음. • 자신의 멤버변수를 디스크에 저장하거나 , 디스크에 저장되어 있는내용을 읽어오도록 함. • 프로젝트를 SDI나 MDI로 생성할 경우 • Document클래스 생성 • 파일|열기 메뉴를 선택해 주면 자동으로 Serialize() 함수호출 • 프로젝트를 DialogBased 로 생성할 경우 • 대화상자에는 파일|열기 기능이 없으므로 파일 열기 대화상자를출력하고, CArchive 객체를 생성한 후에 Serialize() 함수호출 • 대화상자에서 [열기] 버튼 클릭에 대한 이벤트를 처리하는 함수 void CDlgPrnDlg::OnFileOpen() { char szFilter[] = "Text Files(*.TXT)|*.TXT|All Files(*.*)|*.*||"; CFileDialog fileDlg(TRUE, "txt", NULL, OFN_HIDEREADONLY, szFilter); if(IDOK == fileDlg.DoModal()) { CFile file(fileDlg.GetFileName(), CFile::modeRead); // 파일 읽기를 위한 CArchive 오브젝트 생성 CArchive ar(&file, CArchive::load); // Serialize 함수 호출 Serialize(ar); } }
OnDraw() 함수, OnPaint() 함수 • 윈도우에서 화면을 복원(다시 그려주는)해주는 함수 • WM_PAINT 메시지가 발생할 때마다 호출되는 함수 CWnd afx _msg void OnPaint() 상속 //CView.cpp 에서 afx_msg void OnPaint() { OnDraw() ; } //CView.h에서 virtual void OnDraw() ; CView void OnDraw() { }
화면을 업데이트 하는 방법 • Document 클래스에서 화면을 업데이트 • UpdateAllViews(NULL) 함수 호출 • NULL if all views are to be updated • View 클래스에서 화면을 업데이트 • Invalidate(TRUE|FALSE) 함수 호출 • 두 함수 모두 WM_PAINT 메시지를 발생시킴으로써 OnDraw()함수가호출되게 함.
CWnd*GetDlgItem(intnID)const; • Retrieves a pointer to the specified control or child window in a dialog box or other window. • intGetCurSel()const; • return value • The zero-based index of the currently selected item. • 기능 • Retrieves the zero-based index of the currently selected item, if any, in a single-selection list box. • GetCurSel should not be called for a multiple-selection list box. • CButton::GetCheck • intGetCheck()const; • return value • 버튼이 체크되지 않았으면 0, 체크되었으면 1 • 기능 • Retrieves the check state of a radio button or check box.