Âü°í¹®Çå : Visual C++ 6 ¿Ïº®°¡À̵å

 

2. Æ®¸®ÄÁÆ®·Ñ(TreeControl)

 Æ®¸® ÄÁÆ®·ÑÀº °èÃþ±¸Á¶¸¦ °¡Áö´Â µ¥ÀÌÅ͸¦ Ç¥½ÃÇϴµ¥ ÀûÇÕÇÕ´Ï´Ù. °èÃþ±¸Á¶¸¦ °¡Áö´Â µ¥ÀÌÅÍ Áß¿¡¼­ °¡Àå ÀϹÝÀûÀÎ °ÍÀ̶ó¸é MFC Ŭ·¡½ºÀÇ °èÃþ±¸Á¶°¡ µÇ°Ú³×¿ä. ÀÌÁ¦ Äڵ带 ÀÔ·ÂÇØ º¸ÁÒ.

 »ùÇà ÇÁ·ÎÁ§Æ®ÀÔ´Ï´Ù.

1) ´ÙÀ̾ó·Î±× º£À̽ºÀÇ ÇÁ·ÎÁ§Æ®¸¦ Çϳª ¸¸µì´Ï´Ù. ±×¸®°í´Â ¿ì¼± OnInitDialog() ÇÔ¼ö¿¡ ¼ÕÀ» ´ë¾î º¾´Ï´Ù. Ŭ·¡½º À§Àúµå¿¡¼­ WM_INITDIALOG ¸Þ½ÃÁö¸¦ ¿À¹ö¶óÀ̵å ÇÏ¸é µÇÁÒ.

  Æ®¸®ÄÁÆ®·Ñ ¾Æ·¡¿¡ ¼±ÅÃµÈ ³»¿ëÀ» Ç¥½ÃÇÏ·Á Çϴµ¥, óÀ½ ½ÇÇàµÇ¸é¼­ ƯÁ¤ ³»¿ëÀ» ³ªÅ¸³»±â À§ÇØ, CDialog Ŭ·¡½ºÀÇ OnInitDialog() ÇÔ¼ö¸¦ È£ÃâÇϱâ Àü¿¡    

    m_Label = CString("¼±ÅÃµÈ Ç׸ñ : ");

 ¸¦ ½ÇÇà½ÃÄÑ ÁÖ¾î¾ß Á¦´ë·Î ³ªÅ¸³³´Ï´Ù. OnInitDialog() ÇÔ¼ö ´ÙÀ½¿¡ ½ÇÇàÇß´õ´Ï Á¦´ë·Î ³ªÅ¸³ªÁú ¾Ê´õ±º¿ä.

 ´ÙÀ½Àº ÀÔ·ÂµÈ ÄÚµåÀÔ´Ï´Ù.

 

// ³ëµå·Î Ãß°¡µÉ ÅؽºÆ®µé
char *pLevel1[] = {"CObject"};
char *pLevel2[] = {"CWnd", "CCmdTarget"};
char *pLevel31[] = {"CFrameWnd", "CView", "CDialog"};
char *pLevel32[] = {"CWinApp", "CDocument", "CDocTemplate"};

BOOL CTreeDlg::OnInitDialog()
{
        m_Label = CString("¼±ÅÃµÈ Ç׸ñ : ");  // óÀ½ ½ÇÇàµÇ¸é¼­ Ç¥½ÃµÇ´Â ³»¿ë

        CDialog::OnInitDialog();
        ......................................

       // TODO: Add extra initialization here


        // Æ®¸®ÄÁÆ®·Ñ¿¡ À̹ÌÁö ¸®½ºÆ® Ãß°¡
        m_ImageTree.Create(IDB_TREE, 16, 2, RGB(0,128,128));
        m_ctrlTree.SetImageList(&m_ImageTree, TVSIL_NORMAL);

        TV_INSERTSTRUCT tvinsert;

        // ¿É¼Ç¼³Á¤
        tvinsert.hParent = NULL;
        tvinsert.hInsertAfter = TVI_LAST;
        tvinsert.item.mask = TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_TEXT;
        tvinsert.item.state = 0;
        tvinsert.item.stateMask = 0;
        tvinsert.item.cchTextMax = 60;
        tvinsert.item.iSelectedImage = 1;
        tvinsert.item.cChildren = 0;

        // ·¹º§1ÀÇ ³ëµå Ãß°¡
        tvinsert.item.pszText = pLevel1[0];
        tvinsert.item.iImage = 0;
        HTREEITEM hRoot = m_ctrlTree.InsertItem(&tvinsert);
        HTREEITEM hItem;

        // ·¹º§2ÀÇ ³ëµå Ãß°¡
        tvinsert.hParent = hRoot;  // ·¹º§1ÀÇ ÀÚ½ÄÀ¸·Î Ãß°¡
        tvinsert.item.pszText = pLevel2[0];
        hItem = m_ctrlTree.InsertItem(&tvinsert);

        // ·¹º§3ÀÇ ³ëµå Ãß°¡
        tvinsert.hParent = hItem;  // ·¹º§2ÀÇ ÀÚ½ÄÀ¸·Î Ãß°¡
        for(int i=0; i<3; i++) {
                tvinsert.item.pszText = pLevel31[i];
                m_ctrlTree.InsertItem(&tvinsert);
        }

        m_ctrlTree.Expand(hItem, TVE_EXPAND);

        // ·¹º§2ÀÇ ³ëµå Ãß°¡
        tvinsert.hParent = hRoot;  // ·¹º§1ÀÇ ÀÚ½ÄÀ¸·Î Ãß°¡
        tvinsert.item.pszText = pLevel2[1];
        tvinsert.item.iImage = 0;
        hItem = m_ctrlTree.InsertItem(&tvinsert);

        // ·¹º§3ÀÇ ³ëµåÃß°¡
        tvinsert.hParent = hItem;  // ·¹º§2ÀÇ ÀÚ½ÄÀ¸·Î Ãß°¡
        for(i=0; i<3; i++) {
                tvinsert.item.pszText = pLevel32[i];
                m_ctrlTree.InsertItem(&tvinsert);
        }

        m_ctrlTree.Expand(hItem, TVE_EXPAND);   
        m_ctrlTree.Expand(hRoot, TVE_EXPAND);

        return TRUE;  // return TRUE  unless you set the focus to a control
}

 

2) ´ÙÀ̾ó·Î±× ÅÛÇø´Àº ´ÙÀ½°ú °°ÀÌ ¹èÄ¡ÇÕ´Ï´Ù. Æ®¸® ÄÁÆ®·ÑÀ» ³õ°í, ±× ¾Æ·¡¿¡ Static ÄÁÆ®·ÑÀ» ³õ½À´Ï´Ù.

 

3) Æ®¸® ÄÁÆ®·ÑÀ» Á¦¾îÇϱâ À§ÇØ CTreeCtrlÇüÀÇ ControlÇü ¸â¹öº¯¼ö m_ctrlTree¿Í ¿¬°áÇÕ´Ï´Ù. ¹æ¹ýÀº ClassWizard¸¦ ½ÇÇà½ÃÄѼ­ Member Variables ÅÇ¿¡¼­ ÀÔ·ÂÇÏ¸é µË´Ï´Ù.

 ±×¸®°í, Æ®¸® ÄÁÆ®·ÑÀÇ ³ëµå¿¡ ¾ÆÀÌÄÜÀ» ³Ö¾îÁÖ±â À§ÇØ CImageListÇüÀÇ º¯¼ö m_ImageTree ¸¦ Ãß°¡ÇÕ´Ï´Ù.

 ¼¼ ¹ø°·Î, Æ®¸® ÄÁÆ®·Ñ¿¡¼­ ¼±ÅÃµÈ ¹®ÀÚ¿­À» Ç¥½ÃÇØ ÁÖ±â À§ÇØ Static ÄÁÆ®·Ñ°ú ¿¬°áµÉ m_Label º¯¼ö¸¦ Á¤ÀÇÇÕ´Ï´Ù. ¿ª½Ã Ŭ·¡½º À§Àúµå¸¦ ½ÇÇà½ÃÄѼ­ Member Variables ÅÇ¿¡¼­ ´ÙÀ½°ú °°ÀÌ ÀÔ·ÂÇÏ´Â °Ì´Ï´Ù.

 Control IDs : IDC_LABEL          Type : CString          Member : m_Label

 

4) OnInitDialog() ÇÔ¼öºÎºÐ¸¸ ó¸®ÇØÁÖ¸é Æ®¸®ÄÁÆ®·ÑÀÇ ¸ð¾ç¸¸ ³ªÅ¸³¯ »ÓÀÔ´Ï´Ù. ÀÌ ÄÁÆ®·ÑÀÇ ÀÛµ¿¿¡ ´ëÇØ ¹«¾ð°¡ ¹ÝÀÀÀ» ÇÏ·Á¸é ¾îµò°¡ 󸮸¦ ÇØÁÖ¾î¾ß ÇÏ°ÚÁÒ.

 ¿©±â¼­´Â Æ®¸®ÄÁÆ®·Ñ¿¡¼­ ¼±ÅÃÇÑ Ç׸ñÀ» ·¹ÀÌºí¿¡ Ç¥½ÃÇØÁÖ±â·Î ÇÕ´Ï´Ù. ±×·¯±â À§Çؼ­´Â Ŭ·¡½º À§Àúµå¿¡¼­ TVN_SELCHANGE ¸Þ½ÃÁö¸¦ ó¸®ÇØÁÝ´Ï´Ù. ÀÌ ¸Þ½ÃÁö¿¡ ´ëÇÑ Çڵ鷯´Â ´ÙÀ½°ú °°½À´Ï´Ù.

 

void CTreeDlg::OnSelchangedTree1(NMHDR* pNMHDR, LRESULT* pResult)
{
        NM_TREEVIEW* pNMTreeView = (NM_TREEVIEW*)pNMHDR;
       // TODO: Add your control notification handler code here

        HTREEITEM hItem = pNMTreeView->itemNew.hItem;

        char text[20];
        TV_ITEM item;
        memset(text, 0, 20);

        item.mask = TVIF_HANDLE | TVIF_TEXT;
        item.hItem = hItem;  // »õ·Î ¼±ÅÃµÈ ³ëµåÀÇ Á¤º¸¸¦ ¾ò°íÀÚ
        item.pszText = text;
        item.cchTextMax = 30;
        m_ctrlTree.GetItem(&item);

        m_Label = "¼±ÅÃµÈ Ç׸ñ : " + CString(text);
        UpdateData(FALSE);

        *pResult = 0;
}

 

5) ±×¸®°í Æ®¸® ÄÁÆ®·ÑÀÇ ¼Ó¼ºÀ» ´ÙÀ½°ú °°ÀÌ ÁöÁ¤ÇÕ´Ï´Ù.

°¢ ¼Ó¼ºµé°ú ±× Àǹ̴ ´ÙÀ½°ú °°½À´Ï´Ù.

Has buttons : ÇÏÀ§ ³ëµå°¡ ÀÖ´Â ³ëµå¿¡ »ç°¢Çü ¸ð¾çÀÇ ¹öÆ°À» ±×·ÁÁÝ´Ï´Ù. ³ëµå°¡ È®ÀåµÇ¾î ÀÖÀ» ¶§ - ¸ð¾ç, Ãà¼ÒµÇ¾î ÀÖÀ» ¶§ + ¸ð¾çÀÌ µÇ´Â »ç°¢ÇüÀÇ Á¶±×¸¸ ¹öÆ° ¸»ÀÌÁÒ.

Has lines : °¢ ³ëµå¸¦ ¿¬°áÇÏ´Â ¶óÀÎÀ» ±×·ÁÁÝ´Ï´Ù.

Lines at root : ·çÆ® ³ëµå¿¡µµ ¶óÀÎÀ» ±×·ÁÁÝ´Ï´Ù.

Edit labels : ·¹À̺íÀ» ÆíÁýÇÒ ¼ö ÀÖµµ·Ï ÇÕ´Ï´Ù.

Disable drag drop : µå·¡±× ¾Ø µå·ÓÀ» ÇÒ ¼ö ¾øµµ·Ï ÇÕ´Ï´Ù.

Border : ¸» ±×´ë·Î Æ®¸® ÄÁÆ®·Ñ ÁÖÀ§ÀÇ Å׵θ® ¶óÀÎÀ» ±×·ÁÁְųª ¾ø¾ÖÁÝ´Ï´Ù.

 

- the end of this article -