< È®Àå Æ®¸® ºä >
WTL¿¡¼ °í¿ë ÄÁÆ®·ÑÀÇ Æ®¸® ºä ÄÁÆ®·ÑÀ» ĸ½¶ÈÇϱâ À§Çؼ CTreeViewCtrlT Ŭ·¡½º¸¦ ÁغñÇØ ÀÖ½À´Ï´Ù¸¸ CTreeViewCtrlExT À̶ó°í Çϴ Ŭ·¡½ºµµ ÁغñÇØ ÀÖ½À´Ï´Ù. ÀÌ Å¬·¡½º´Â CTreeViewCtrlT Ŭ·¡½º¿Í °°Àº ÅÛÇø´ Ŭ·¡½ºÀÔ´Ï´Ù. CTreeViewCtrlExT Ŭ·¡½º´Â CTreeViewCtrlT Ŭ·¡½ºÀÇ »ó¼Ó Ŭ·¡½º À̸ç CTreeViewCtrlExT Ŭ·¡½ºÀÇ ÅÛÇø´ Àμö´Â base classÀÎ CTreeViewCtrlT Ŭ·¡½º¿¡ °Ç³× ¹Þ½À´Ï´Ù. atlctrls.hÇì´õ¿¡¼´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ°í ÀÖ½À´Ï´Ù.
|
// atlctrls.h template <class TBase> class CTreeViewCtrlExT : public CTreeViewCtrlT< TBase > { ... ... typedef CTreeViewCtrlExT<ATL::CWindow> CTreeViewCtrlEx; |
CTreeViewCtrlExT Ŭ·¡½º´Â CTreeItemT À̶ó°í ÇÏ´Â ÅÛÇø´ Ŭ·¡½º¸¦ »ç¿ëÇÕ´Ï´Ù. CTreeItemT Ŭ·¡½º´Â Æ®¸® ¾ÆÀÌÅÛ ÇÚµéHTREEITEMÀ» ĸ½¶ÈÇÕ´Ï´Ù. ±×¸®°í CTreeItemT Ŭ·¡½º´Â CTreeViewCtrlExT Ŭ·¡½º¿¡ÀÇ Æ÷ÀÎÅ͸¦ ¸â¹ö º¯¼ö·Î¼ °¡Áý´Ï´Ù. CTreeItemT Ŭ·¡½ºÀÇ ÅÛÇø´ Àμö´Â ÀÌ ¸â¹ö º¯¼öÀÎ CTreeViewCtrlExT Ŭ·¡½º¿¡ °Ç³× ¹Þ½À´Ï´Ù. atlctrls.h Çì´õ¿¡¼´Â ´ÙÀ½°ú °°ÀÌ ¼±¾ðµÇ°í ÀÖ½À´Ï´Ù.
|
// atlctrls.h template <class TBase> class CTreeItemT { public: HTREEITEM m_hTreeItem; CTreeViewCtrlExT<TBase>* m_pTreeView; ... ... typedef CTreeItemT<ATL::CWindow> CTreeItem; |
¡¡CTreeViewCtrlEx Ŭ·¡½º´Â CTreeViewCtrlŬ·¡½º¿Í µ¿µîÀÇ ±â´ÉÀ» °®Ãß°í ÀÖ½À´Ï´Ù. ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº CTreeViewCtrlEx Ŭ·¡½º¸¦ »ç¿ëÇÏ´Â ¿¹ ÀÔ´Ï´Ù. Àüȸ Æ®¸® ºä ÄÁÆ®·ÑÀ» »ç¿ëÇÑ ÇÁ·Î±×·¥ÀÇ CTreeViewCtrlÀ» CTreeViewCtrlEx·Î º¯°æÇØ °íÃÄ ¾¹´Ï´Ù.

|
// stdafx.h #include <atlbase.h> #include <atlapp.h> extern CAppModule _Module; #include <atlwin.h> #include <atlcrack.h> #include <atlmisc.h> #include <atlctrls.h> // ÄÁÆ®·Ñ¿ë Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§ÇØ |
|
// maindlg.h class CMainDlg : public CDialogImpl<CMainDlg> { public: enum { IDD = IDD_MAINDLG }; enum {SHELL = 1, COMCTL, WINDIR, SYSDIR}; // Æ®¸® ¾ÆÀÌÅÛ ½Äº°ÀÚ CTreeViewCtrlEx
m_tree_sysinfo; // È®Àå Æ®¸®ºä CStatic
m_static_display; // Á¤º¸ Ç¥½Ã¿ë // ¸Þ¼¼Áö ¸Ê BEGIN_MSG_MAP_EX(CMainDlg)
MSG_WM_INITDIALOG(OnInitDialog) NOTIFY_HANDLER_EX(IDC_TREE_SYSINFO,
NM_CLICK, OnTreeClick)
COMMAND_ID_HANDLER_EX(IDOK, OnOK)
COMMAND_ID_HANDLER_EX(IDCANCEL, OnCancel) END_MSG_MAP() LRESULT OnInitDialog(HWND hWnd, LPARAM lParam){ // ½ºÅ©¸°ÀÇ Áß¾Ó¿¡ ¹èÄ¡ CenterWindow(); // Å« ¾ÆÀÌÄÜ ¼³Á¤
HICON hIcon = AtlLoadIconImage(IDR_MAINFRAME,
LR_DEFAULTCOLOR,
::GetSystemMetrics(SM_CXICON), ::GetSystemMetrics(SM_CYICON)); SetIcon(hIcon, TRUE); // ÀÛÀº ¾ÆÀÌÄÜ ¼³Á¤
HICON hIconSmall = AtlLoadIconImage(IDR_MAINFRAME,
LR_DEFAULTCOLOR,
::GetSystemMetrics(SM_CXSMICON), ::GetSystemMetrics(SM_CYSMICON)); SetIcon(hIconSmall, FALSE); // ÄÁÆ®·Ñ ¼³Á¤ m_tree_sysinfo = GetDlgItem(IDC_TREE_SYSINFO); m_static_display
= GetDlgItem(IDC_STATIC_DISPLAY); CTreeItem tiSysInfo =
m_tree_sysinfo.InsertItem(_T("½Ã½ºÅÛ
Á¤º¸"), TVI_ROOT, TVI_LAST); CTreeItem tiDllVer = tiSysInfo.AddTail(_T("DLL¹öÁ¯"), -1); CTreeItem tiItem; tiItem
= tiDllVer.AddTail(_T("shell32.dll"),
-1); tiItem.SetData(SHELL); tiItem = tiDllVer.AddTail(_T("comctl32.dll"),
-1); tiItem.SetData(COMCTL); CTreeItem tiSysDir = tiSysInfo.AddTail(_T("µð·ºÅ丮"), -1); tiItem = tiSysDir.AddTail(_T("Windows"),
-1); tiItem.SetData(WINDIR); tiItem = tiSysDir.AddTail(_T("½Ã½ºÅÛ"),
-1); tiItem.SetData(SYSDIR); return TRUE; } LRESULT OnTreeClick(LPNMHDR pnmh){ // Ŭ¸¯µÈ ¾ÆÀÌÅÛ ÇÚµé Ãëµæ
UINT uFlag; CPoint pt = ::GetMessagePos(); m_tree_sysinfo.ScreenToClient(&pt); CTreeItem tiItem = m_tree_sysinfo.HitTest(pt, &uFlag); if(tiItem.IsNull() || !(uFlag
& TVHT_ONITEM))
return 0; // ¾ÆÀÌÅÛ µ¥ÀÌÅÍ Ãëµæ
CString strInfo;
DWORD dwData = tiItem.GetData(); switch(dwData){ case SHELL: {
// shell32.dllÀÇ ¹öÁ¯ Ãëµæ
DWORD dwMajor, dwMinor;
AtlGetShellVersion(&dwMajor,
&dwMinor);
strInfo.Format(_T("Version %d.%02d"), dwMajor,
dwMinor);
break; } case COMCTL: {
// comctl32.dllÀÇ ¹öÁ¯ Ãëµæ
DWORD dwMajor, dwMinor;
AtlGetCommCtrlVersion(&dwMajor, &dwMinor);
strInfo.Format(_T("Version %d.%02d"), dwMajor,
dwMinor);
break; } case WINDIR: {
// WindowsÆú´õ ÆÐ½º Ãëµæ
TCHAR szPath[MAX_PATH];
GetWindowsDirectory(szPath,
MAX_PATH);
strInfo = szPath;
break; } case SYSDIR: {
// ½Ã½ºÅÛ Æú´õ ÆÐ½º Ãëµæ
TCHAR szPath[MAX_PATH];
GetSystemDirectory(szPath,
MAX_PATH);
strInfo = szPath;
break; } default:
break; } m_static_display.SetWindowText(strInfo); return 0; } void OnOK(UINT uNotifyCode, int nID, HWND hWndCtl){ EndDialog(nID); } void OnCancel(UINT uNotifyCode, int nID, HWND hWndCtl){ EndDialog(nID); } }; |
|
// Control.cpp #include "stdafx.h" #include "resource.h" #include "maindlg.h" CAppModule _Module; int WINAPI _tWinMain(HINSTANCE
hInstance, HINSTANCE, LPTSTR lpCmdLine,
int nCmdShow) { HRESULT hRes = ::CoInitialize(NULL); ATLASSERT(SUCCEEDED(hRes)); ::DefWindowProc(NULL,
0, 0, 0L); AtlInitCommonControls(ICC_COOL_CLASSES
| ICC_WIN95_CLASSES); hRes
= _Module.Init(NULL, hInstance); ATLASSERT(SUCCEEDED(hRes)); int nRet = 0; // BLOCK: ¾îÇø®ÄÉÀÌ¼Ç ½ÇÇà { CMainDlg dlgMain; nRet = dlgMain.DoModal(); } _Module.Term(); ::CoUninitialize(); return nRet; } |
¡¡¿ì¼± CMainDlg Ŭ·¡½ºÀÇ CTreeViewCtrlÀ» CTreeViewCtrlEx¿¡ ¿Å°Ü³õ½À´Ï´Ù.
¡¡´ÙÀ½¿¡ WM_INITDIALOG
¸Þ¼¼Áö Çڵ鷯·Î Æ®¸® ºä ÄÁÆ®·Ñ¿¡ ¾ÆÀÌÅÛÀ» »ðÀÔÇÕ´Ï´Ù¸¸ Àüȸ´Â InsertItem()ÀÇ ¸®ÅÏ °ªÀº Æ®¸® ¾ÆÀÌÅÛ ÇÚµéÀÎ °Í¿¡ ´ëÇØ À̹øÀºCTreeViewCtrlEx Ŭ·¡½º¸¦ »ç¿ëÇϰí ÀÖÀ¸¹Ç·Î ¸®ÅÏ °ªÀº CTreeItem Ŭ·¡½ºÀÇ ÀνºÅϽºÀÔ´Ï´Ù. ÀÌ ÀνºÅϽº ¾È¿¡´Â ÀÌ¹Ì Æ®¸® ¾ÆÀÌÅÛ ÇÚµé°ú m_tree_sysinfo ¿¡ÀÇ Æ÷ÀÎÅͰ¡ ¼³Á¤µÇ¾î ÀÖ½À´Ï´Ù. »ðÀÔÇÑ ¾ÆÀÌÅÛ ¾Æ·¡¿¡ ÇÑÃþ ´õ ¾ÆÀÌ ¾ÆÀÌÅÛÀ» Ãß°¡ÇÏ·Á¸é CTreeItemÀÇ ÀνºÅϽºÀÇ AddTail()À» È£ÃâÇÕ´Ï´Ù.
¡¡OnTreeClick()¿¡¼´Â HitTest()ÀÇ ¸®ÅÏ °ªÀ¸·ÎºÎÅÍ CTreeItem Ŭ·¡½ºÀÇ ÀνºÅϽº¸¦ ÃëµæÇÑ ÈÄ IsNull()¿¡ ÀÇÇØ Æ®¸® ¾ÆÀÌÅÛ ÇÚµéÀΰ¡ À¯È¿ÇÑÁö ¾î¶²Áö¸¦ ÆÇ´ÜÇØ¼ À¯È¿ÇÑ °æ¿ì´Â GetData()¿¡ ÀÇÇØ ±× ¾ÆÀÌÅÛÀ¸·ÎºÎÅÍ µ¥ÀÌÅ͸¦ ÃëµæÇϰí ÀÖ½À´Ï´Ù.
ÀÌ¿Í °°ÀÌ ,CTreeViewCtrlExŬ·¡½º¸¦ »ç¿ëÇϸé(ÀÚ) , ƯÁ¤ÀÇ Æ®¸® ¾ÆÀÌÅÛÀ» ±âÁ¡À¸·Î¼ Æ®¸®ºäÄÜÆ®·Î¸£¸¦ Á¶ÀÛÇÒ ¼ö ÀÖ½À´Ï´Ù.