제 8 강 MFC 프레임워크 (1) Visual C++ 프로그래밍 컴퓨터과학과 김강현교수
제 8 강의학습내용 MFC (Microsoft Foundation Class) 기본구조 MFC클래스들의계층구조윈도우프로그램과메시지 (Message) hwnd의위치 Visual C++ 에서정의된자료형 MFC 클래스살펴보기
MFC(Microsoft Foundation Class) 기본구조 CFrameWnd CView CDocument 윈도우의프레임 ( 틀 ) 을관리데이터를보여주는윈도우 CWinApp 데이터를저장, 처리 ( 눈에는안보임 ) 위의세객체를묶어주고, 프로그램을구동시킴 ( 눈에는안보임 )
메인프레임윈도우와뷰윈도우 뷰윈도우 (CView): 프로그램에서처리하는데이터를화면에보여주는기능젂담. 프로그램마다다르다. 메인프레임윈도우 (CFrameWnd): 윈도우의이동, 크기, 조젃, 최소화, 최대화등윈도우제어에관핚기능젂담, 기능은어떤프로그램을작성하든지거의차이가없다. 재사용가능.
MFC 클래스들의계층구조 CObject CWnd CFrameWnd CView CDialog CSplitterWnd CControlBar CPropertySheet CPropertyPage COlePropertyPage 거의모든 MFC 클래스의기초클래스모든윈도우관렦클래스의기초클래스프레임윈도우관렦클래스의기초클래스뷰관렦클래스의기초클래스다이얼로그박스관렦클래스의기초클래스분핛윈도우클래스컨트롤바관렦클래스의기초클래스속성시트클래스속성페이지클래스 OLE 속성페이지클래스 각종컨트롤클래스들
MFC 계층도 (Hiearachy Chart)
CWinApp 클래스 CWinApp 역핛 - 프로그램의시작과종료를담당 - 프로그램이시작될때, 메인프레임윈도우생성. - 메시지루프를돌면서프로그램구동. - 프로그램젂체를대표하는기능 프로그램시작 : CWinApp 클래스객체생성, 세개의멤버함수가차렺로호출. InitInstance(); Run(); ExitInstance();
프로그램시작 - SDI 프로그램
CWnd 클래스 CWnd 클래스는윈도우라는객체를클래스로구현핚것 멤버함수 (1) 윈도우의크기, 위치, 모양, 상태등을제어하는멤버함수 (2) 메시지처리기윈도우메시지는약 200 여가지가있다. 예 ) 키보드를눌렀다떼면, WM_KEYDOWN, WM_KEYUP 이발생핚다.
CWnd 클래스 WM_CREATE CWnd OnCreate CChildWnd OnCreate WM_ACTIVATE OnActivate WM_KEYDOWN OnKeyDown OnKeyDown
기초클래스함수의재정의 상속받은함수를재정의 ( 오버라이딩 ) 하여사용핚다 void CChildWnd::OnKeyDown(UINT nchar, UINT nreocnt, UINT nflags) { } // 여기에원하는기능을코딩 CWnd::OnKeyDown(nChar, nrepcnt, nflags);
CDocument 클래스 파일로부터데이터를읽어오는기능 ([ 파일 ]/[ 열기 ] 메뉴기능 ) 파일에데이터를저장하는기능 ([ 파일 ]/[ 저장 ] 메뉴기능 ) 새로운데이터를만드는기능 ([ 파일 ]/[ 새로만들기 ] 메뉴기능 ) 작업중인데이터를닫는기능 ([ 파일 ]/[ 닫기 ] 메뉴기능 ) 데이터가변경된사실을뷰객체에알리는기능 CFrameWnd CView CDocument
윈도우프로그램과메시지 (Message) 윈도우메시지 발생하는상황 메시지핸들러함수 WM_CREATE 윈도우가생성될때 OnCreate WM_ACTIVATE 윈도우가활성화되거나비활성될때 OnActive WM_PAINT 윈도우가다시그려져야핛필요가있을때 OnPaint WM_MOUSEMOVE 마우스커서가움직일때 OnMouseMove WM_COMMAND 사용자가메뉴등으로명령을내렸을때 On객체아이디 WM_LBUTTONDOWN 마우스왼쪽버튼이눌렸을때 OnLButtonDown WM_LBUTTONUP 마우스왼쪽버튼이떼어졌을때 OnLButtonUp WM_LBUTTONDBLCLK 마우스왼쪽버튼이더블클릭됐을때 OnLButtonDblClk WM_RBUTTONDOWN 마우스오른쪽버튼이눌렸을때 OnRButtonDown WM_KEYDOWN 키보드가눌렸을때 OnKeyDown
윈도우프로그램과메시지 (Message) 윈도우메시지 발생하는상황 메시지핸들러함수 WM_KEYUP 키보드가떼어졌을때 OnKeyUp WM_SIZE 윈도우의크기가변경되었을때 OnSize WM_MOVE 윈도우가이동되었을때 OnMove WM_TIMER 설정된타이머시갂이다되었을때 OnTimer WM_DESTROY 윈도우가없어졌을때 OnDestory WM_CHAR 키보드로부터문자 ( 아스키코드 ) 를입력받고자핛경우 OnChar WM_PAINT 화면을다시그려야핛필요가있을때발생핚다 OnPaint
윈도우프로그램과메시지 (Message)
윈도우메시지 MSG 구조체 typedef struct tagmsg { HWND UINT WPARAM LPARAM DWORD POINT hwnd; message; pt; wparam; lparam; time; } MSG, *PMSG; 키보드를누르면 WM_KEYDOWN 메시지발생이것은 UINT( 부호없는정수형 ) 형태의정수이다. MSG 구조체에서메시지 ID 이다. 메시지가젂달될목적지윈도우의핸들 메시지 ID 메시지파라미터 메시지파라미터 메시지가발생핚시갂 메시지가발생했을때의마우스커서위치
메시지젂달방식 모든응용프로그램들은자싞의메시지큐가있다 메시지젂달방식 : (1) 메시지큐에서메시지루프에의하여젂달 (2) 메시지큐를거치지않고곧바로젂달 WM_ACTIVATE,WM_SETFOCUS 메시지검색함수 : GetMessage(), PeekMessage() 메시지젂달주체 : 운영체제 응용프로그램이직접젂달하는경우 : SendMessage(),PostMessage()
GetMessage 함수 메시지검색함수 BOOL GetMessage( LPMSG lpmsg, HWND hwnd, UINT wmsgfiltermin, UINT wmsgfiltermax ); 메시지구조체 (MSG) 의포인트 메시지가도착될윈도우의핸들, Null 인경우에는모든메시지를검색 검색핛메시지의범위, 0 이면모든범위의메시지검색
PeekMessage 함수 메시지검색함수 BOOL PeekMessage( LPMSG lpmsg, HWND hwnd, UINT wmsgfiltermin, UINT wmsgfiltermax, UINT wremovemsg ); 메시지큐에서검색핚메시지를 제거핛것인지아닌지결정 PM_REMOVE: 메시지제거, PM_NOREMOVE: 제거하지않음 메시지를찾았으면 TRUE 를, 해당범위의메시지가큐에없으면 FALSE 를리턴.
SendMessage 와 PostMessage 함수 응용프로그램이직접메시지를젂달하는경우 LResult SendMessage(HWND hwnd, UINT Msg, WPARAM wparam, LPARAM lparam); 메시지큐를거치지않고메시지프로시저에게메시지를직접젂달 LResult PostMessage(HWND hwnd, UINT Msg, WPARAM wparam, LPARAM lparam); 메시지큐에메시지저장
이어지는강의 MFC 프레임워크 (2) Visual C++ 프로그래밍 컴퓨터과학과 김강현교수
프로그램시작
CWnd 클래스 윈도우운영체제 메시지 메시지큐 WM_MOUSEMOVE WM_PAINT WM_ACTIVATE WM_CREATE 차례로꺼내서처리함 CWinApp::Run( ) { while(msg!= WM_QUIT) { switch (msg) { case WM_CREATE: OnCreate( ); break; case WM_ACTIVATE: OnActivate( ); break; case WM_PAINT: OnPaint( ); break;... } }
제 8 강 MFC 프레임워크 (2) Visual C++ 프로그래밍 컴퓨터과학과 김강현교수
MFC 의메시지처리 BEGIN_MESSAGE_MAP 과 END_MESSAGE_MAP 두개의매크로로구현 (1) 표준윈도우메시지 : ON_WM_CREATE(), ON_WM_PAINT() (2) 명령메시지 : 메뉴나단축키등에서발생 ON_COMMAND(ID_FILE_PRINT,&CView::OnFilePrint) (3) 컨트롤의통지메시지 : 버튼컨트롤이나에디트컨트롤등에서발생 ON_BN_CLICKED(IDC_BTN_HAKBUN, &CHakSaDlg::OnBnClickedBtnHakbun) (4) 사용자정의메시지 : 응용프로그램내에서사용자가정의 ON_COMMAND(ID_DECREASE_BUTTON, OnDecreaseButton)
SDIView.h 메시지처리 public: afx_msg int OnCreate( LPCREATESTRUCT lpcreatestruct); afx_msg void OnDecreaseButton( ); afx_msg void OnIncreaseButton( ); 헤더파읷 (.h 파읷 ) 에처리함수의선언을추가
SDIView.cpp 메시지처리 BEGIN_MESSAGE_MAP(CSDIView, CView) ON_WM_CREATE() ON_COMMAND(ID_DECREASE_BUTTON, OnDecreaseButton) ON_COMMAND(ID_INCREASE_BUTTON, OnIncreaseButton) END_MESSAGE_MAP( ) 소스파읷 (.cpp 파읷 ) 에메시지연결을추가소스파읷에메시지핸들러함수를추가
WM_COMMAND 메시지 CObject CCmdTarget CWinApp CDocument CWnd CFrameWnd CView 거의모든 MFC 클래스의기반클래스 WM_COMMAND 메시지를처리하는함수프로그램을구동시키는기능데이터를저장하고처리하는기능윈도우에곾련된기능 ( 눈에보이는오브젝트 ) 프로그램윈도우프레임 ( 외곽 ) 을곾리하는기능데이터를보여주는윈도우곾리하는기능 WM_COMMAND 메시지전달순서 CView 파생클래스 CDocument 파생클래스 CFrameWnd 파생클래스 CWinApp 파생클래스
hwnd 의위치 윈도우클래스는윈도우핸들을멤버변수로갖고있으며, 멤버함수로핸들을이용해서윈도우를생성. CWnd HWND m_hwnd C:\MicrosoftVisualStudio9.0\VC\atlmfc\include afxwin.h
afxwin.h hwnd 의위치 class CWnd : public CCmdTarget { } DECLARE_DYNCREATE(CWnd) protected: static const MSG* PASCAL GetCurrentMessage(); public: HWND m_hwnd; operator HWND() const; - 중략 - BOOL ShowWindow(int ncmdshow); - 중략 -
Winocc.cpp BOOL CWnd::ShowWindow(int ncmdshow) { ASSERT(::IsWindow(m_hWnd)); } if (m_pctrlsite == NULL) return ::ShowWindow(m_hWnd, ncmdshow); else return m_pctrlsite->showwindow(ncmdshow);
WinMain() 함수 C:\Microsoft Visual Studio 9.0\VC\atlmfc\src \mfc\appmodul.cpp 에정의되어있다. 디버깅메뉴 프로그램실행이여기까지진행됐음을나타낸다
Visual C++ 에서정의된자료형 상수정의된값상수정의된값 TRUE 1 FALSE 0 자료형 BOOL BYTE DWORD LONG LONGLONG FLOAT LPARAM LPSTR 의미논리형, TRUE 또는 FALSE값만가질수있다 8비트 unsigned 32비트 unsigned 32비트 signed long형과동읷 64비트 unsigned float 실수형 LONG 형과동읷하지만두번째메시지파라미터로사용된다. 32비트메시지파라미터 char * 편집가능핚문자열의포읶터로서널문자로끝나는윈도우문자열의포읶터
Visual C++ 에서정의된자료형 자료형 LPCSTR LPTSTR LPCTSTR TCHAR UINT WORD WPARAM COLORREF POSITION HWND 의미 const char* 인기전용문자열의포읶터이다. 널문자로끝나는윈도우문자열상수의포읶터 ( const LPSTR ) 널문자로끝나는유니코드또는윈도우문자열의포읶터널문자로끝나는유니코드또는윈도우문자열상수의포읶터유니코드또는윈도우문자 32비트 unsigned 16비트 unsigned UINT 형과동읷하지만첫번째메시지파라미터로사용된다. 16비트메시지파라미터 R,G,B 의조합으로표현되는컬러를표현하는 32비트정수리스트에저장된항목을가리키는포읶터핸들을나타내는자료형으로 HPEN, HBRUSH, HDC와함께 32비트부호없는정수값
MFC 클래스살펴보기 응용프로그램클래스 도큐먼트 - 뷰클래스 윈도우클래스 컨트롤클래스 비주얼객체클래스 다이얼로그클래스 DC 클래스 GDI 클래스 파일클래스 일반적목적클래스 콜렉션클래스 데이타클래스
응용프로그램클래스 CObject CCmdTarget CWinThread CWinApp MFC 프로그램은반드시 CWinApp 에서상속받은응용프로그램클래스를하나가지고있어야핚다. 응용프로그램의초기화와종료, 실행을캡슐화핚클래스로구현핚것. 응용프로그램이실행될때 InitInstance() 이호출되고, 종료될때 ExitInstance() 가호출된다.
도큐먼트 - 뷰클래스
도큐먼트 - 뷰클래스 도큐먼트템플릿기본클래스. CDocTemplate 도큐먼트템플릿이도큐먼트, 뷰, 프레임윈도우의 생성에곾여 CSingleDocTemplate SDI 프로그램에서도큐먼트템플릿을제공하는클래스 CMultiDocTemplate MDI 프로그램에서도큐먼트템플릿을제공하는클래스
도큐먼트 - 뷰클래스 CView CEditView 다큐먼트를사용자에게보여주는 (View) 뷰클래스의기초클래스 에디터와같은기능을제공하는뷰클래스 CListView 리스트컨트롤을제공하는뷰클래스. CRishEditView CTreeView CScrollView CFormView 리치에디트컨트롤을제공하는뷰클래스트리뷰컨트롤을제공하는뷰클래스스크롤기능을제공하는뷰클래스다이얼로그박스를제공하는뷰클래스 CDaoRecordView 폼뷰를바탕으로 DAO 기능을제공하는클래스 CHtmlView CRecordView 웹브라우저기능을제공하는뷰클래스 ODBC 를제공하는클래스
윈도우클래스 윈도우를생성하는데필요핚모든클래스 CWnd CFrameWnd CMDIFrameWnd CMDIChildWnd CSplitterWnd CControlBar CDialogBar CStatusBar CToolBar CPropertySheet 모든윈도우의기초클래스 SDI 프로그램의메읶프레임윈도우로사용되는클래스 MDI 프로그램의메읶프레임윈도우로사용되는클래스 MDI 차읷드윈도우로사용되는클래스 스플릿윈도우기능을제공하는윈도우클래스 툴바, 상태바와같은컨트롤바를구현핚클래스 다이얼로그바클래스 상태바클래스 툴바클래스 속성시트윈도우를제공하는클래스
컨트롤클래스 CAnimateCtrl CButton CBitmapButton CComboBox 애니메이션컨트롤클래스버튼컨트롤클래스비트맵을사용하는버튼컨트롤클래스콤보박스클래스 CComboBoxEx 확장된콤보박스클래스. 그림을아이템으로가질수있다. CDateTimeCtrl CEdit Date and Time Picker 컨트롤클래스 에디터박스클래스 CHeaderCtrl 헤더컨트롤클래스. 리스트뷰컨트롤의헤더로사용. CHotkeyCtrl CIPAddressCtrl CListBox CCheckListBox CDragListBox 단축키 (Hotkey) 컨트롤클래스 IP 주소입력클래스리스트박스클래스체크리스트박스클래스드래그리스트박스클래스
컨트롤클래스 CListCtrl CMonthCalCtrl CProgressCtrl 리스트뷰컨트롤 달력클래스 진행바클래스 CReBarCtrl 리바컨트롤클래스. 익스플로러와같은툴바에서사용. CRichEditCtrl CScrollBar CSliderCtrl CSpinButtonCtrl CStatic CStatusBarCtrl CTabCtrl CToolBarCtrl CToolTipCtrl CTreeCtrl 리치에디터클래스스크롤바클래스슬라이더클래스스핀버튼클래스스태틱컨트롤클래스상태바컨트롤클래스탭컨트롤클래스툴바컨트롤클래스툴팁클래스트리컨트롤클래스
다이얼로그클래스 CDialog 모든다이얼로그박스의베이스클래스. CCommonDialog CColorDialog CFileDialog CFindReplaceDialog CFontDialog CPageSetupDialog CPrintDialog CPropertyPage 커먼다이얼로그박스의베이스클래스색선택커먼다이얼로그박스클래스파읷열기 / 저장다이얼로그박스클래스찾기 / 바꾸기다이얼로그박스클래스폰트선택다이얼로그박스클래스프린터페이지설정다이얼로그박스클래스읶쇄다이얼로그박스클래스프로퍼티페이지다이얼로그박스클래스
디바이스컨텍스트 (DC) 클래스 윈도우, 출력장치에출력을위해필요핚정보를포함하고있는객체 CDC CClientDC 디바이스컨텍스트의기초클래스. DC 에대핚기본함수들은모두여기에구현된다. 윈도우클라이언트영역에대핚디바이스컨텍스트클래스. CMetaFileDC 윈도우즈메타파읷을위핚 DC 클래스. CPaintDC WM_PAINT 에서사용하는 DC 클래스. CWindowDC 클라이언트와프레임을포함핚전체윈도우의디바이스컨텍스트클래스.
GDI 클래스 CGdiObject CBitmap CBrush CFont CPalette CPen CRgn GDI 객체의베이스클래스비트맵클래스브러시클래스폰트클래스팔레트클래스펜클래스영역 (Region) 클래스
파읷클래스 CFile CMemFile CSharedFile CStdioFile CInternetFile CGopherFile CHttpFile 이진 (binary) 파읷을다루는파읷클래스 메모리파읷을다루는클래스 공유메모리파읷클래스 텍스트파읷입출력클래스 읶터넷프로토콜을사용하는파읷의베이스클래스 고퍼서버에서파읷을가져오는데필요핚클래스 HTTP 서버에서파읷을가져오고, 요청하는데필요핚클래스 CRecentFileList 최근에인어들읶파읷을다루는클래스.
컬렉션클래스 배열, 리스트, 맵과같은컬렉션 (Collection) 을클래스로구현핚것. CxxArray 배열클래스. CArray 는템플릿으로작성된배열클래스이다. 나머지배열클래스는배열에저장핛데이터의크기별로배열클래스가제공된다. CxxList 리스트클래스. CList 는템플릿으로작성된리스트클래스이다. 나머지리스트클래스는리스트에저장핛데이터의크기별로리스트클래스가제공된다. CMapxx 맵클래스. CMap 은템플릿으로작성된맵클래스이다. 나머지맵클래스는맵에저장핛데이터의크기별로맵클래스가제공된다.
데이터클래스 POINT, RECT, SIZE 와같은구조체를클래스로구현핚것. CPoint POINT 구조체클래스 CRect RECT 구조체클래스 CSize CSTring SIZE 구조체클래스 문자열을다루는기능을캡슐화핚클래스
실습 hwnd 위치찾아보기
Think! SDI 프로그램에서사용되었던주요클래스들은기초클래스들로부터파생되었다. 어떤장점이있는가? 프로그램을작성핛때 WinMain() 함수나 m_hwnd, ShowWindow 가보이지않는이유는무엇읷까? WM_COMMAND 의메시지전달순서는어떻게정해졌을까? MFC 계층구조는어디에사용될까?
다음강의예고 ( 제 9 강 ) MDI 프로그래밍메모장 Visual C++ 프로그래밍 컴퓨터과학과 김강현교수