< Æ®¸® ºä >
ÀÌÇÏ¿¡ ³ªÅ¸³»´Â °ÍÀº Æ®¸®ºä ÄÁÆ®·ÑÀ» º£À̽º·Î ÇÑ ºä À©µµ¿ì¸¦ ÀÛ¼ºÇÏ´Â ¿¹ÀÔ´Ï´Ù. ºä À©µµ¿ì¿¡´Â ¾ÆÀÌÅÛÀ» Ãß°¡ÇÏ¿© ¾ÆÀÌÅÛÀ» ´õºí Ŭ¸¯ ÇÏ¸é ±× ¾ÆÀÌÅÛ¿¡ °üÇÑ Á¤º¸¸¦ ¸Þ½ÃÁö ¹Ú½º¿¡ Ç¥½ÃÇÕ´Ï´Ù.

|
// stdafx.h #include <atlbase.h> #include <atlapp.h> extern CAppModule _Module; #include <atlwin.h> #include <atlcrack.h> #include <atlmisc.h> #include <atlctrls.h> #include <atlframe.h> |
|
// view.h class CTreeView : public CWindowImpl<CTreeView, CTreeViewCtrl> { public:
DECLARE_WND_SUPERCLASS(NULL, CTreeViewCtrl::GetWndClassName()) BOOL PreTranslateMessage(MSG*
pMsg){ return FALSE; } private: enum {SHELL = 1, COMCTL, WINDIR, SYSDIR}; // Æ®¸® ¾ÆÀÌÅÛ ½Äº°ÀÚ // ¸Þ¼¼Áö ¸Ê BEGIN_MSG_MAP_EX(CTreeView)
MSG_WM_CREATE(OnCreate)
REFLECTED_NOTIFY_CODE_HANDLER_EX(NM_DBLCLK, OnTreeDblClick)
DEFAULT_REFLECTION_HANDLER() END_MSG_MAP() LRESULT OnCreate(LPCREATESTRUCT lpcs){ LRESULT
lRet = DefWindowProc(); SetFont(AtlGetDefaultGuiFont()); // Æ®¸®ºä¿¡ ¾ÆÀÌÅÛ »ðÀÔ
HTREEITEM hSysInfo =
InsertItem(_T("½Ã½ºÅÛ Á¤º¸"), TVI_ROOT,
TVI_LAST);
HTREEITEM hDllVer =
InsertItem(_T("DLL¹öÁ¯"),
hSysInfo, TVI_LAST);
HTREEITEM hItem; hItem = InsertItem(_T("shell32.dll"),
hDllVer, TVI_LAST); SetItemData(hItem, SHELL); hItem = InsertItem(_T("comctl32.dll"),
hDllVer, TVI_LAST); SetItemData(hItem, COMCTL); HTREEITEM hSysDir
=
InsertItem(_T("µð·ºÅ丮"),
hSysInfo, TVI_LAST); hItem = InsertItem(_T("Windows"),
hSysDir, TVI_LAST); SetItemData(hItem, WINDIR); hItem = InsertItem(_T("½Ã½ºÅÛ"),
hSysDir, TVI_LAST); SetItemData(hItem, SYSDIR); return lRet; } LRESULT OnTreeDblClick(LPNMHDR pnmh){ // Ŭ¸¯µÈ ¾ÆÀÌÅÛ ÇÚµé Ãëµæ
UINT uFlag; CPoint pt = ::GetMessagePos(); ScreenToClient(&pt);
HTREEITEM hItem = HitTest(pt,
&uFlag); if(hItem == NULL || !(uFlag
& TVHT_ONITEM))
return 0; // ¾ÆÀÌÅÛ µ¥ÀÌÅÍ Ãëµæ CString strInfo;
DWORD dwData = GetItemData(hItem); 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; } if(!strInfo.IsEmpty())
MessageBox(strInfo,
_T("¾ÆÀÌÅÛ")); return 0; } }; |
|
// mainfrm.h class CMainFrame : public CFrameWindowImpl<CMainFrame>, public CUpdateUI<CMainFrame>, public CMessageFilter, public CIdleHandler { public:
DECLARE_FRAME_WND_CLASS(NULL, IDR_MAINFRAME) CTreeView
m_view; virtual BOOL
PreTranslateMessage(MSG* pMsg){ if(CFrameWindowImpl<CMainFrame>::PreTranslateMessage(pMsg))
return TRUE; return m_view.PreTranslateMessage(pMsg); } virtual
BOOL OnIdle(){ UIUpdateStatusBar(); return FALSE; } BEGIN_UPDATE_UI_MAP(CMainFrame) // ¿£Æ®¸® ¾øÀ½ END_UPDATE_UI_MAP() BEGIN_MSG_MAP_EX(CMainFrame)
MSG_WM_CREATE(OnCreate)
COMMAND_ID_HANDLER_EX(ID_APP_EXIT, OnMenuExit)
CHAIN_MSG_MAP(CUpdateUI<CMainFrame>)
CHAIN_MSG_MAP(CFrameWindowImpl<CMainFrame>)
CHAIN_CLIENT_COMMANDS() // ºäÅ©¶ó½º¿¡ Ä¿¸àµå
üÀÎ
REFLECT_NOTIFICATIONS() // ¸Þ¼¼Áö ¸®Ç÷º¼Ç END_MSG_MAP() LRESULT OnCreate(LPCREATESTRUCT lpcs){ // »óÅ ¹Ù¸¦ ÀÛ¼º CreateSimpleStatusBar(); UIAddStatusBar(m_hWndStatusBar); // ºä¸¦ ÀÛ¼º m_hWndClient = m_view.Create(m_hWnd, rcDefault, NULL,
WS_CHILD | WS_VISIBLE | WS_CLIPSIBLINGS | WS_CLIPCHILDREN |
TVS_HASBUTTONS | TVS_HASLINES | TVS_LINESATROOT | TVS_SHOWSELALWAYS,
WS_EX_CLIENTEDGE); // ¸Þ½ÃÁö ·çÇÁ¿¡ ¸Þ¼¼Áö ÇÊÅÍ¿Í
¾ÆÀ̵¹ Çڵ鷯¸¦ Ãß°¡ CMessageLoop* pLoop = _Module.GetMessageLoop(); pLoop->AddMessageFilter(this); pLoop->AddIdleHandler(this); return 0; } void OnMenuExit(UINT uNotifyCode, int nID, HWND hWndCtl){ PostMessage(WM_CLOSE); } }; |
|
// app.cpp #include "stdafx.h" #include "resource.h" #include "view.h" #include "mainfrm.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: ¾îÇø®ÄÉÀÌ¼Ç ½ÇÇà { CMessageLoop theLoop; _Module.AddMessageLoop(&theLoop); CMainFrame wnd; wnd.CreateEx(); wnd.ShowWindow(nCmdShow); wnd.UpdateWindow(); nRet = theLoop.Run(); _Module.RemoveMessageLoop(); } _Module.Term(); ::CoUninitialize(); return nRet; } |
¡¡¿ì¼± stdafx.h ¿¡¼´Â ÄÁÆ®·Ñ¿ë Ŭ·¡½º¸¦ »ç¿ëÇϱâ À§Çؼ atlctrls.h Çì´õ¸¦ ÀÎŬ·çµå ÇÕ´Ï´Ù.
¡¡´ÙÀ½¿¡ ºä À©µµ¿ì¸¦ À§ÇÑ Å¬·¡½º¸¦ Á¤ÀÇÇÕ´Ï´Ù. À§ÀÇ ¿¹¿¡¼´Â ÇÁ·ÎÁ§Æ®¿¡ view.h ¶ó°í ÇÏ´Â Çì´õ ÆÄÀÏÀ» Ãß°¡ÇÏ¿© °Å±â¿¡ CWindowImpl Ŭ·¡½º·ÎºÎÅÍ ÆÄ»ýÇÑ CTreeView ¶ó°í Çϴ Ŭ·¡½º¸¦ Á¤ÀÇÇϰí ÀÖ½À´Ï´Ù. CWindowImpl Ŭ·¡½ºÀÇ Á¦2Àμö¿¡´Â º£À̽º°¡ µÇ´ÂCTreeViewCtrl Ŭ·¡½º¸¦ ÁöÁ¤ÇÕ´Ï´Ù.
¡¡CTreeView Ŭ·¡½º ³»¿¡¼´Â ¿ì¼± WM_CREATE ¸Þ¼¼Áö Çڵ鷯¸¦ Ãß°¡ÇÏ¿© óÀ½¿¡DefWindowProc()¸¦ È£ÃâÇÏ°í ³ª¼ µðÆúÆ®ÀÇ GUI ÆùÆ®¸¦ ¼³Á¤ÇØ ºä¿¡ Æ®¸® ¾ÆÀÌÅÛÀ» »ðÀÔÇÕ´Ï´Ù.
¡¡´ÙÀ½¿¡ ÅëÁö Äڵ尡 NM_DBLCLKÀÇ ÅëÁö ¸Þ¼¼Áö Çڵ鷯¸¦ Ãß°¡ÇÕ´Ï´Ù. ¿©±â¿¡¼´Â ¼±Åõǰí ÀÖ´Â ¾ÆÀÌÅÛ¿¡ °ü·Ã ÁöÀ» ¼ö ÀÖ¾ú´ø ¼öÄ¡¿¡ ÀÇÇØ ÀûÀýÇÑ ½Ã½ºÅÛ Á¤º¸¸¦ ÃëµæÇÏ¿© ¸Þ½ÃÁö ¹Ú½º·Î Ç¥½ÃÇϰí ÀÖ½À´Ï´Ù. µ¡ºÙ¿© ÀÌ ÇÔ¼ö´Â ¸Þ¼¼Áö ¸®Ç÷º¼Ç¿¡ ÀÇÇØ ºÒ·Á °©´Ï´Ù.
¡¡À̹ø ¿¹¿¡¼´Â ºä À©µµ¿ìÀÇ º£À̽º·Î¼ CTreeViewCtrl Ŭ·¡½º¸¦ »ç¿ëÇß½À´Ï´Ù¸¸ WTLÀÌ Æ®¸®ºä ÄÁÆ®·ÑÀ» À§Çؼ ÁغñÇØ ÀÖ´Â CTreeViewCtrlEx Ŭ·¡½º¸¦ »ç¿ëÇÒ ¼öµµ ÀÖ½À´Ï´Ù.