프로그래밍/라이브러리
[MFC] 기본 클래스에서 다른 클래스 참조 (예)
2008.02.06
일단 메인 프레임 클래스의 인스턴스(?)를 가져온다. CMainFrame* pFrame = static_cast(GetParentFrame()); 이 메인 프레임의 인스턴스에서 View 클래스의 인스턴스(역시 ?)를 가져온다. CXxxx7ViewView* pView = static_cast(pFrame->GetActiveView()); 이제 사용 pView->멤버변수 / pView->멤버함수()
프로그래밍/라이브러리
[MFC] 기본 클래스끼리 상호 참조
2008.02.06
CWinApp* AfxGetApp(); CWinAPp 파생 클래스의 인스턴스 포인터를 반환 CWnd* AfxGetMainWnd(); 메인 프레임 클래스의 인스턴스 포인터를 반환 CDocument* CView::GetDOcument(); 뷰에서 프레임 윈도우/도큐먼트 참자 CFrameWnd* CWnd::GetParentFrame(); 뷰 클래스에서 그 뷰를 둘러싸고 있는 프레임 윈도를 참조할 때 사용 SDI에서는 AfxGetMainWnd()와 GetParentFrame()의 리턴값이 같으나 MDI에서 AfxGetMainWnd()는 메인 프레임 윈도우의 포인터를 반환, GetParentFrame()는 자식 프레임 윈도우의 포인터를 반환 CFrameWnd :: GetActiveView() GetActiveDo..
프로그래밍/라이브러리
[MFC] class 구조와 몇가지...
2008.02.06
CView : 데이타의 화면 표시 담당 Invalidate()로 화면 갱신 -> 내부적으로 WM_PAINT를 발생시킴 CDocument : 데이타 처리 담당 CWinApp : 전체 프로그램의 제어 담당 CMainFrame : 윈도 전체 프레임의 제어 담당 CWnd : WM_ 으로 시작하는 메세지 처리 담당 CCmdTarget : WM_COMMAND 메세지 담당 (메뉴가 눌리거나 하는 경우 발생하는 메세지로 특별히 Event라고 불리운다.) 화면이 다시 그려져야 하는 경우 WM_PAINT 메세지가 발생한다. 이에 따라 OnPaint()/OnDraw() 함수가 호출되는데 CView 클래스에서 파생된 클래스는 OnDraw() 에서 처리하는 것이 바람직하다. OnPaint() 내부적으로 OnDraw() 함수를 ..
프로그래밍/라이브러리
[MFC] 타이틀바와 외곽선이 없는 윈도우 만들기
2008.02.06
LONG style; style = GetWindowLong( m_hWnd, GWL_STYLE ); style &= ~WS_CAPTION; style &= ~WS_SYSMENU; SetWindowLong( m_hWnd, GWL_STYLE, style ); CMainFrame 클래스의 OnCreate() 메서드에서 위 코드를 실행하면 WS_CAPTION(타이틀바와 보더), WS_SYSMENU(닫기/최소화/최대화 버튼) 등이 없는 윈도우를 만들 수 있다. 역시 CMainFrame 클래스의 PreCreateWindow() 메서드에서 cs.style = 0; cs.hMenu = NULL 을 넣어주면 메뉴까지 없는 윈도우가 생성된다.
프로그래밍/라이브러리
[MFC] CDC/CClientDC
2008.02.06
CDC : 실행된 윈도우에 대한 모든 소유권을 갖으며 사용후 반드시 ReleaseDC를 해야한다. CClientDC : CDC의 subset 개념이며 ReleaseDC가 필요없다. CDC dc; CPen pen; pen.SelectObject( &dc ); pen이 dc 안에서만 동작하도록 설정/ 사용전 old object를 가지고 있다가 사용후 old를 반환 dc를 clientdc로 사용할 때 global로 clientdc를 잡은 경우 object의 주체를 알 수 없고 local로 잡을 경우 scope rule의 문제가 생긴다. CClientDc dc( this ); DCD MemDC; MemDC.CreateCompatibleDC( &dc ); DC(여기서는 MemDC)를 ClientDC 처럼 사용. ..