2014년 12월 8일 월요일


Tree Control은 하나하나의 노드가 계층구조로 이루어진 컨트롤

주요 속성 
Has buttons 하위 노드가 있는 노드에 사각형 모양의 버튼을 그려준다.
Has lines 각 노드를 연결하는 라인을 그려준다.
Lines at root 루트 노드에도 라인을 그려준다.
Edit labels 레이블을 편집할 수 있도록 한다.
Disable drag drop 드래그 앤 드롭을 살 수 없도록 한다.
Show selection always 포커스를 잃었을 때도 선택된 항목을 표시 해준다.


주요 함수
InsertItem 새로운 항목을 추가한다. //TVINSERTSTRUCT 구조체도 사용 가능
DeleteItem 지정된 항목을 삭제한다.
Expand 지정된 노드를 확장 시킨다.
SelectItem 지정된 항목을 선택한다.
GetCount 총 노드 수를 얻는다.
SetImageList 각 노드의 이미지 아이콘을 지정한다.
GetItemData 노드의 데이터(Param)을 얻는다.
SetItemData 노드의 데이터(Param)을 지정한다.
SetItemText 각 노드의 텍스트를 설정한다.
GetItemText 각 노드의 텍스트를 얻는다.

트리 컨트롤 이벤트
TVN_DELETEITEM 노드가 삭제될 때
TVN_ITEMEXPANDING 노드가 확장되기 직전
TVN_ITEMEXPANDED 노드가 확장된 직후
TVN_KEYDOWN 키보드가 눌렸을 때
TVN_SELCHANGED 선택된 항목이 바뀐 후


Dialog 기반 어플리케이션
도큐먼트, 뷰 구조와 프레임 윈도우를 가진 대화상자 기반 프로그램
 - 윈도우의 크기가 변경될 필요가 없다.
 - 비교적 구조가 단순하여 하나의 윈도우에서 모든 작업을 처리할 수 있다.


CFormView(폼뷰) CView의 파생클래스
컨트롤 사용은 일반 다이알로그와 유사하지만 Style은 꼭 Child로 되어있어야 한다.

CScrollView(스크롤뷰) 일반뷰에 스크롤 바가 붙어있는 형태

CTreeView(트리뷰) 다이알로그 대신 뷰에 트리가 붙어있다.

CWnd::ModifyStyle(DWORD dwRemove, DWORD dwAdd, UINT nFlags =0);
ModifyStyle는 CWnd 클래스의 함수로써 모든 윈도우 스타일을 추가, 삭제할 때 사용된다.


Status Bar(상태 바) 프로그램의 하단에 정보 표시 줄로, 현재의 상태나 기타 원하는 정보를 출력 해줄 수 있다.


뷰 전환 : 클라이언트 영역에 보이는 View 클래스를 다른 View 클래스로 변경하는 기술(두 개의 View윈도우를 미리 생성한 후 사이즈와 비활성화 활성화를 반복해주는 것)


분할 윈도우(Splitter Window) 하나의 프레임 위도우를 두 개 이상의 윈도우로 나누어 주는 기능. 분할 윈도우를 사용할 경우 분할 윈도우는 프레임 윈도우와 뷰 윈도우 사이에 끼어 들어가게 된다. ( 프레임윈도우 - 분할 윈도우 - 뷰 )
 - 동적 분할 윈도우(Dynamic Split Window) 프로그램 실행 중 나누거나 합칠 수 있다.
 - 정적 분할 윈도우(Static Split Window) 분할된 상태로 실행되며 실행 중 합칠 수 없다.




동적 분할 윈도우 : 스크롤 바 끝 부분에 분할 바가 있으며, 이를 사용해 윈도우를 분할 하거나 합칠 수 있다.


여러 개의 뷰를 동시에 업데이트 하기 위해선 UpdateAllViews()를 사용해야 한다.
GetDocument()->UpdateAllViews(NULL);




정적 분할 윈도우 : 실행 중에 윈도우의 수를 변경할 수 없어며, 각각의 창에는 전혀 다른 뷰를 사용할 수 있게 된다. 동적 분할 윈도우는 최대 4개의 분할이 가능했지만 정적 분할 윈도우는 하나의 CSplitterWnd에 256개까지 가능하다.




멀티 도큐먼트 프로그램(MDI) 하나의 메인 프레임에 차일드 프레임 + 도큐먼트 + 뷰 등 여러 개가 생성될 수 있게 된다. 메인 프레임 윈도우 안에 자식 프레임 윈도우 여러개가 생성된다.

자식 프레임 윈도우 추가 
Insert > Class > CMDIChildWnd를 상속

SDI의 경유 Doc Template에 메인 프레임, 도큐먼트, 뷰가 포함되어 있어 CSingleDocTemplate::OpenDocumentFile()로 생성하지만,
MDI의 경우 도큐먼트 템플릿에 CMainFrame이 입력되지 않아 직접 생성해 줘야 한다.
CMainFram *pMainFrame = new CMainFrame;
if( !pMainFrame->LoadFrame(IDR_MAINFRAME))
   return FALSE;
m_pMainWnd = pMainFrame;

도큐먼트 인스턴스가 생성되는 시점
CWinApp 인스턴스 생성 및 InitInstance() 실행 > Doc Template 등록 > ProcessShellCommand() > ID_FILE_NEW 메시지 호출 > CWinApp::OnFileNew() > OpenDocumentFile()

SDI의 경우 기본적으로 메인 프레임 윈도우가 하나이며, 해당 프레임이 템플릿에 등록되어 즉시 생성하지 않으면 오류가 난다.
MDI의 경우 프로그램 시작 시 자동으로 차일드 윈도우가 생성되어 있거나 Doc Template 선택창이 뜨게 되는 것을 원치 않을 수 도 있다. 이때 ProcessShellCommand()함수 아래 템플릿 생성 제한


CWinApp::GetFirstDocTemplatePosition() 등록된 도큐먼트 템플릿 목록에서 가장 첫 부분의 POSITION값을 얻어준다.
CWinApp::GetNextDocTemplate(POSITION &Pos) 입력된 POSITION 위치의 CDocTemplate 포인터를 얻고 Pos값 증가
CDocTemplate::OpenDocumentFile(char* BOOL) 현재 도큐먼트 템플릿에 등록된 프레임, 도큐먼트, 뷰 클래스를 생성

0 개의 댓글:

댓글 쓰기