반응형


http://blog.daum.net/aonezip/12


VS2010 VC++ 살펴보기 01 : CMFCXXXX 시리즈 컨트롤

 

 

 일단 VS2010의 IDE의 외형은 매우 세련된 느낌을 준다. 선택된 문서도 황금색(개인적으로 난 황금색을 무척 좋아한다.)으로 표현해주고, 전체적인 IDE 디자인 자체가 VS2008에 비해서 크게 변하진 않았지만, 미묘하게 훨씬 세련된 느낌을 주는 IDE이다. 조금 사용한 느낌으로는 회사 프로젝트를 2010으로 변환해서 작업하고 싶은 충돌을 들게 만든다. ㅡ.ㅡ;;; 미묘하게 멋지다.

 

 

 IDE의 새로운 기능들은 이런저런 테스트하면서 하나 하나 알아가야 겠다. 일단 하나를 소개 시켜준다면, 현 프로젝트에서 열린 문서를 따로 떼서 하나의 윈도우로 볼수 있다. 이 기능을 소스 화면 분활 기능을 대처 해줄 뿐만 아니라, 아주 유용하게 사용할 수 있다. 이제 더 이상 자주 보는 문서를 alt+W+W으로 찾을 필요가 없어졌고, Ctrl + Tab으로 볼 필요가 없어졌다. 자주 보는 헤더 파일은 항상 창을 따로 떼서 볼 수 있게 되었다.

 

 

[이렇게 자신이 원하는 소스 파일을 따로 떼서 볼수 있습니다. 굿!뚜!]

 

 

 일단은 VS2010에서 VC++의 MFC에서 변화된 부분에 대해서 테스트 해보려고 한다. 물론 실무에서 바로 사용해야하는 추가된 컨트롤들을 살펴볼 예정이다. 그 외에 세부적인 사항에 대해서 좀더 알아보고. 이후에 C++0x에 대해서 알아봐야 할 것 같다. 일단, 새로 추가된 컨트롤들이 어떤 기능을 갖고 어느정도 사용가능 할지 함 알아볼 생각이다. MFC로 게임 Tool를 만들 때 도움이 많이 되는 것들이 추가되었으면 하는 바램인데.. 어떨지 모르겠다.

 

 일단 MFC로 Dialog베이스로 생성하면 기존의 HTML로 만들어지는 Dialog가 그디어 디폴트에서 빠져 있음을 확인할수 있다. 2008에서는 항상 기본으로 되어 있어서 잠시 깜박하면 HTML형으로 생성되서 짜증났는 데… 나만 그런게 아니였나 보다. 정말 급할 때 잘못 생성하면 정말 짜증난다.

 

 

 

VC++ 에피소드 6 - 클래스 위자드의 귀환 (XXXX) SF, 모험, 액션

 

 그래.. 그디어 VC++의 클래스 위자드가 돌아왔다. 도대체 왜 이런 녀석을 .Net이 나오면서 빠져버렸는지.. 당췌 이해가 되지 않지만, 여하튼 다시 2010에서 우리의 품으로 돌아왔다. 일단 겉 모습 및 형태는 기존과 동일하다. 약간 더 이뻐진 것 같기도 하지만, 이제 더 이상 메시지나 이벤트 처리를 위해서 Property창을 볼 필요가 없어졌다. 물론 기존에 지원했던 property로 이벤트나 메시지를 추가하는 interface는 그대로 존재한다. .Net부터 이용했던 프로그래머라면 아마도 이쪽이 더 편리할지도 모르겠다. 2가지Interface를 모두 지원하는 것은 탁월한 선택이 아닌가 싶다.

 

 

 

 [클래스 위자드] 그디어 돌아왔다. 6.0사용자라면 이제 .Net로 MFC를 만들어 되지 않을까?

 

 그런 이 녀석의 단축키가 변했다. 내 기억이 맞다면 물론 오래전 일이지만 단축키는 분명 Ctrl+W였을 텐데.. 이번에 기본 단축키는Shift+Ctrl+X라는 기가막히게 누르기 힘든 단축키로 되어있다. 대체 이렇게 기본 단축키를 할당한 이유가 뭔지 정말 궁금하다. 이보다 더 중요한게 뭔데.. 이렇게 단축키가 변화된것일까? 어이 없게도, 마우스 더블클릭이나 Ctrl+마우크 클릭과 같은 문자 Select기능이다. ㅡ_ㅡ’

 

여하튼 이 클래스 위자드의 귀환을 내 Wnamp에서 Maroon5 – Harder to Breathe로 축해주고 있다.

 

 

 

새로 추가된 MFC Control

 

 이번에 추가된 컨트롤 앞에는 MFC라고 붙는다. 추가된 컨트롤은 VS2008이후에 총 11종으로 아래 그림과 같다.

 

 

 

 이름에서도 알수 있듯이, 컨트롤 이름으로 대략적인 컨트롤의 능력을 알수 있다. 그리고 컨트롤과 Class도 기억하기 쉽게 되어있다. MFC Link Control의 Class명은 CMFCLinkCtrl이다. 마지막 Control만 약어로 쓰면 된다. 이번에 추가된 컨트롤들은 Tool를 만들 때 꽤나 유용하게 사용될 녀석들이 많다. 물론 이 컨트롤로 상용 Application을 만들거라면 비추겠지만, 개발에서 사용될 Tool를 만든다면 꽤나 든든한 녀석들이 될 것이다.

 

CMFCLinkCtrl, CMFCShellTreeCtrl, CMFCShellListCtrl, CMFCPropertyGridCtrl를 이단 살펴봤는 데.. 상당히 쓸만한 녀석들이다.

 

 

 

 

CMFCLinkCtrl

 

 간단하게 인터넷 링크를 걸수 있다. 링크를 클릭하면 해당 Shell에 연결된 프로그램이 자동으로 실행되거나, 기본 브라우져로 해당 주소로 이동한다.

 

 

 

l  인터넷 주소를 쓰면 익스플러우가 실행되면 해당 사이트로 이동한다.

l  C:\\와 같이 폴더명을 쓰면 해당 폴더가 열린다.

l  C:\test.txt 와 같이 파일명을 주면 해당 파일에 연결된 프로그램이 자동으로 실행된다.

 

사용법은 무척이나 간당하다. 해당 Ctrl의 Property에서 설정값을 셋팅할 수 있으며 코드로는 아래와같이 변환해서 사용하면 된다.해당 기능은 Tool에서 Tool과 관련된 기획 문서의 Document를 연결해 놓고 언제든지 툴과 함께 볼수 있도록 하는 기능으로 사용하면 유용할 것 같다. 간편하면서 쉽게 추가 할 수 있다. 

 

1
2
3
4
5
6
7
8
void CMy2010ControlTestDlg::OnBnClickedButton1()
{
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
    m_cTestLinkCtrl.SetURL(L"c:\\");
    m_cTestLinkCtrl.SetTooltip(L"C Drive");
    m_cTestLinkCtrl.SetWindowTextW(L"C 드라이브로 이동");
    m_cTestLinkCtrl.SizeToContent();
}

 

 

CMFCLinkCtrl::SetURL

 Displays a specified URL as the button text.

 

CMFCLinkCtrl::SetURLPrefix

 Sets the implicit protocol (for example, "http:") of the URL.

 

CMFCLinkCtrl::SizeToContent

 Resizes the button to contain the button text or bitmap.

 

http://msdn.microsoft.com/ko-kr/library/bb983604.aspx

 

 

 

CMFCShellTreeCtrl

 

 나 같은 인간에게 있어서 정말 필요한 컨트롤이라고 해야겠다. 간단한 쉘 기능이 들어간 Tool를 만들어야 할 때 정말 유용하다. CMFCShellListCtrl과 함께 사용하면 간단한 윈도우 쉘을 만들 수 있다. 기본적인 쉘 기능들이 대부분 들어가 있으며, 사용법도 간단하다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void CMy2010ControlTestDlg::OnBnClickedButton2()
{
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
    CString szSelectDir;
 
    m_cTestShellTreeCtrl.GetItemPath(szSelectDir, m_cTestShellTreeCtrl.GetSelectedItem());
 
    MessageBox(szSelectDir, L"경로");
}
 
void CMy2010ControlTestDlg::OnTvnSelchangedMfcshelltree1(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMTREEVIEW pNMTreeView = reinterpret_cast<lpnmtreeview>(pNMHDR);
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
 
    CString szStr;
    szStr = m_cTestShellTreeCtrl.GetItemText(m_cTestShellTreeCtrl.GetSelectedItem());
    szStr += L"\n";
 
    OutputDebugString(szStr);
 
    *pResult = 0;
}
</lpnmtreeview>

 

CMFCShellTreeCtrl::EnableShellContextMenu

 Enables or disables the shortcut menu.

 

CMFCShellTreeCtrl::GetFlags

 Returns a combination of flags that are passed to IShellFolder::EnumObjects.

 

CMFCShellTreeCtrl::GetItemPath

 Retrieves the path to an item.

 

CMFCShellTreeCtrl::GetRelatedList

 Returns a pointer to the CMFCShellListCtrl Class object that is used together with this CMFCShellTreeCtrl object to create an Explorer-like window.

 

CMFCShellTreeCtrl::OnChildNotify

 This member function is called by this window's parent window when it receives a notification message that applies to this window.(Overrides CWnd::OnChildNotify.)

 

CMFCShellTreeCtrl::OnGetItemIcon

 

 

CMFCShellTreeCtrl::OnGetItemText

 

 

CMFCShellTreeCtrl::Refresh

 Refreshes and repaints the current CMFCShellTreeCtrl object.

 

CMFCShellTreeCtrl::SelectPath

 Selects the appropriate tree control item based on a supplied PIDL or string path.

 

CMFCShellTreeCtrl::SetFlags

 Sets flags to filter the tree context (similar to the flags used by IShellFolder::EnumObjects).

 

CMFCShellTreeCtrl::SetRelatedList

 Sets a relation between the current CMFCShellTreeCtrl object and a CMFCShellListCtrl object.

 

http://msdn.microsoft.com/ko-kr/library/bb982944.aspx

 

 

CMFCShellListCtrl

 

 기본적인 쉘 기능들을 모두 갖고 있는 컨트롤이다. 상위로 올라가는 기본 기능이 없기 때문에 윈도우 폴더창처럼 상위로 가는 버튼을 따로 만들어 주던가, 팝업 메뉴로 뒤로 가기 기능등을 만들어주면 꽤나 괜찮게 사용할 수 있다. 해당 기능은 MSDN에 맴버함수 설명으로 쉽게 찾아 사용 할 수 있다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
void CMy2010ControlTestDlg::OnTvnSelchangedMfcshelltree1(NMHDR *pNMHDR, LRESULT *pResult)
{
    LPNMTREEVIEW pNMTreeView = reinterpret_cast<lpnmtreeview>(pNMHDR);
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
 
    CString szStr;
    szStr = m_cTestShellTreeCtrl.GetItemText(m_cTestShellTreeCtrl.GetSelectedItem());
    szStr += L"\n";
 
    OutputDebugString(szStr);
 
    CString szPath;
    m_cTestShellTreeCtrl.GetItemPath(szPath, m_cTestShellTreeCtrl.GetSelectedItem());
 
    m_cTestShellListCtrl.DisplayFolder(szPath);
 
    *pResult = 0;
}
 
//상위 폴더로 이동하도록 해보자. CMFCShellTreeCtrl도 상위로 이동하게 만들자.
void CMy2010ControlTestDlg::OnBnClickedButton3()
{
    CString szPath;
 
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
    m_cTestShellListCtrl.DisplayParentFolder();
    m_cTestShellListCtrl.GetCurrentFolder(szPath);
    m_cTestShellTreeCtrl.SelectPath(szPath);
 
}
</lpnmtreeview>

 

CMFCShellListCtrl::DisplayFolder

 Displays a list of items that are contained in a provided folder.

 

CMFCShellListCtrl::DisplayParentFolder

 Displays a list of items that are contained in the folder that is the parent of the currently displayed folder.

 

CMFCShellListCtrl::EnableShellContextMenu

 Enables or disables the shortcut menu.

 

CMFCShellListCtrl::GetCurrentFolder

 Retrieves the path of the current folder.

 

CMFCShellListCtrl::GetCurrentFolderName

 Retrieves the name of the current folder.

 

CMFCShellListCtrl::GetCurrentItemIdList

 Returns the PIDL of the current list control item.

 

CMFCShellListCtrl::GetCurrentShellFolder

 Returns a pointer to the current Shell folder.

 

CMFCShellListCtrl::GetItemPath

 Returns the textual path of an item.

 

CMFCShellListCtrl::GetItemTypes

 Returns Shell item types that are displayed by the list control.

 

CMFCShellListCtrl::IsDesktop

 Checks if the currently selected folder is the desktop folder.

 

CMFCShellListCtrl::OnCompareItems

 The framework calls this method when it compares two items.(Overrides CMFCListCtrl::OnCompareItems.)

 

CMFCShellListCtrl::OnFormatFileDate

 Called when the framework retrieves the file date displayed by the list control.

 

CMFCShellListCtrl::OnFormatFileSize

 Called when the framework converts the file size of a list control.

 

CMFCShellListCtrl::OnGetItemIcon

 Called when the framework retrieves the icon of a list control item.

 

CMFCShellListCtrl::OnGetItemText

 Called when the framework converts the text of a list control item.

 

CMFCShellListCtrl::OnSetColumns

 Called by the framework when it sets the names of the columns.

 

CMFCShellListCtrl::Refresh

 Refreshes and repaints the list control.

 

CMFCShellListCtrl::SetItemTypes

 Sets the type of items displayed by the list control.

 

http://msdn.microsoft.com/ko-kr/library/bb983966.aspx

 

 

CMFCPropertyGridCtrl

 

 VS2008의 기본바에 있던 Property를 다로 Ctrl로 이용할 수 있게되었다. 리본바에서 프로퍼티창만 따로 사용할 일이 많았는 데, 이제 기본 컨트롤로 지원하기 때문에 손쉽게 사용할 수 있다. 간단한 정보는 이제 프로퍼티 컨트롤을 이용해서 Tool로 정보를 표시할 수 있다. 얼마나 유용한 컨트롤인가.. 이번에 추가된 컨트롤 중에서 Tool개발에 가장 많이 사용하게 될 녀석이 될것이다.

 

 

 

기본적인 사용법은 리본바에서 동일하다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 프로퍼티 초기화
void CMy2010ControlTestDlg::InitProperty(void)
{
    CMFCPropertyGridProperty* pGroup1 = new CMFCPropertyGridProperty(_T("Character"));
    COleVariant var3DLook((short)VARIANT_FALSE, VT_BOOL);
 
    pGroup1->AddSubItem(new CMFCPropertyGridProperty(_T("Name"), var3DLook,
        _T("캐릭터의 이름이다")));
 
    CMFCPropertyGridProperty* pProp = new CMFCPropertyGridProperty(_T("Skill"),
        _T("Dialog Frame"), _T("어떤 스킬을 기본 스킬로 할 것인가?"));
    pProp->AddOption(_T("None"));
    pProp->AddOption(_T("Skill01"));
    pProp->AddOption(_T("Skill02"));
    pProp->AddOption(_T("Skill03"));
    pProp->AllowEdit(FALSE);
 
    pGroup1->AddSubItem(pProp);
    pGroup1->AddSubItem(new CMFCPropertyGridProperty(_T("Note"), (COleVariant) _T("글을 적습니다."), _T("아무거나 도움이 될만한걸 적어")));
 
    m_cTestPropertyGridCtrl.AddProperty(pGroup1);
 
    INT32 iWidth;
    iWidth = m_cTestPropertyGridCtrl.GetLeftColumnWidth();
 
    m_cTestPropertyGridCtrl.SetGroupNameFullWidth(FALSE, TRUE);
 
}

 

 

http://msdn.microsoft.com/ko-kr/library/bb983759.aspx

 

 

VS2010은 무겁다.

 

 일단 오늘은 여기까지.. 나머지 컨트롤도 천천히 사용해고 추후 Tool은 2010으로 제작해서 사용해보는 것도 괜찮을 것 같다. 물론 몇가지 문제점이 해결되면 말이다.

 

 일단 VS2010 컴파일러가 너무 무겁다. 무거운 정도가 아니라 회사 컴퓨터(i7)는 모르겠지만, 우리집 컴퓨터(Intel® Core™2 Duo CPUE8400, 2G Ram)는 허리가 휘어지려고 하는 것 같다. 일단 프로젝트 생성도 느리지만, 이미 생성된 프로젝트를 열려고 할 때도 상당한 로딩 시간을 필요로 한다. 여러가지로 무거운 것 같아서 프로젝트 용량을 보니.. 기겁할 노릇이다. ㅡㅡ;;

 

Control테스트를 위해서 만든 샘플을 컴파일후 용량을 확인해보니.. 다음과 같았다.

 

               [간단한 샘플 프로그램 컴파일 후 하드 사용량]

 

 그림을 보면 알겠지만, 샘플 프로그램의 총 용량이 무려 364M나 한다. ㅡㅡ;; VS2008이 60M정도 하는 걸 보면 대략 6배 정도 늘어난 것을 확인할 수 있다. 물론 많은 정보를 모아서 보다 편리한 IDE를 지원해주기 위한 용도겠지만.. 그렇다고 해도.. 너무 큰 용량이 아닌가 싶다. 아무리 시대가 테라 단위로 가는 하드라고 해도.. 이건 좀 아닌 것 같다.

 

 그래 좋다. 용량크고, 그리고 솔루션 로딩이 느릴수 있다. 하지만 문제는 컴파일 속도도 무지하게 느리다는 것이다. 아마도 최신 컴퓨터를 기준으로 만들어진 2010이겠지만 이정도 하드웨어 사항에서도 버벅거리는 건.. 상당히 무거운 컴파일러가 아닌가 싶다. 무척이나 큰 프로젝트고 컴파일만 몇십분 하기라도 하면.. 어떨지 무지 궁금하다. 오히려 더 빠를 수도 있겠지만.. (처음 초기화만 느리고 컴파일 자체가 빠르다면..) 회사에서 라이선스를 구입하면 한번 기존 프로젝트를 변환해서 정밀하게 테스트 해볼 필요가 있을 듯 싶다. 물론 인크리드 빌드 같은 프로그램을 이용하면 빠르겠지만… 결론적으로 매우 무겁다.

 

  

 2010ControlTest.exe 

 2010ControlTest.zip

 

반응형

+ Recent posts