home *** CD-ROM | disk | FTP | other *** search
/ Windows Graphics Programming / Feng_Yuan_Win32_GDI_DirectX.iso / Samples / include / treeview.cpp < prev    next >
C/C++ Source or Header  |  2000-05-11  |  4KB  |  146 lines

  1. //-----------------------------------------------------------------------------------//
  2. //              Windows Graphics Programming: Win32 GDI and DirectDraw               //
  3. //                             ISBN  0-13-086985-6                                   //
  4. //                                                                                   //
  5. //  Written            by  Yuan, Feng                             www.fengyuan.com   //
  6. //  Copyright (c) 2000 by  Hewlett-Packard Company                www.hp.com         //
  7. //  Published          by  Prentice Hall PTR, Prentice-Hall, Inc. www.phptr.com      //
  8. //                                                                                   //
  9. //  FileName   : treeview.cpp                                                         //
  10. //  Description: Tree View class                                                     //
  11. //  Version    : 1.00.000, May 31, 2000                                              //
  12. //-----------------------------------------------------------------------------------//
  13.  
  14. #define STRICT
  15. #define WIN32_LEAN_AND_MEAN
  16.  
  17. #include <windows.h>
  18. #include <tchar.h>
  19. #include <assert.h>
  20. #include <commctrl.h>
  21.  
  22. #include "treeview.h"
  23.  
  24. // { <tag> <format> }
  25. // <tag>::= g |   // dword, dword, dword, dword
  26. //          8 |   // dword, dword
  27. //          4 |   // dword
  28. //          2 |   // unsigned short
  29. //          1 |   // unsigned char
  30. //          &     // address of input data
  31.  
  32. // Class for formating structures into text string 
  33. class KFormat
  34. {
  35.     const TCHAR * m_pFormat;
  36.     const DWORD * m_pData;
  37.  
  38. public:
  39.     TCHAR          m_Output[MAX_PATH];
  40.  
  41.     KFormat(const TCHAR * pFormat, const void * pData)
  42.     {
  43.         m_pFormat = pFormat;
  44.         m_pData   = (const DWORD *) pData;
  45.     }
  46.  
  47.     bool Getline(void)
  48.     {
  49.         if ( (m_pFormat==NULL) || m_pFormat[0]==0 )
  50.             return false;
  51.  
  52.         DWORD value = m_pData[0];
  53.  
  54.         int len = 0;
  55.  
  56.         switch ( m_pFormat[0] )
  57.         {
  58.             case 'g': len = 16; break;
  59.             case '8': len =  8; break;
  60.             case '4': len =  4; break;
  61.             case '2': len =  2; value = value & 0xFFFF;  break;
  62.             case '1': len =  1; value = value & 0xFF;    break;
  63.             case '&': len =  0; value = (DWORD) m_pData; break;
  64.             
  65.             default:
  66.                 assert(false);
  67.                 return false;
  68.         }                      
  69.  
  70.         wsprintf(m_Output, m_pFormat + 1, value, m_pData[1], m_pData[2], m_pData[3]);
  71.  
  72.         m_pFormat = m_pFormat + _tcslen(m_pFormat) + 1;
  73.         m_pData   = (const DWORD *) ((const BYTE *) m_pData + len);
  74.         
  75.         return true;
  76.     }
  77. };
  78.  
  79.  
  80. void KTreeView::Create(HWND hParent, int id, int x, int y, int width, int height, HINSTANCE hInst)
  81. {
  82.     m_hWnd = CreateWindowEx(WS_EX_CLIENTEDGE, WC_TREEVIEW, _T(""),
  83.                     WS_CHILD | WS_BORDER | WS_VISIBLE | WS_VSCROLL | 
  84.                     TVS_HASLINES | TVS_HASBUTTONS | TVS_LINESATROOT,
  85.                     x, y, width, height,
  86.                     hParent, (HMENU) id, hInst, NULL);
  87. }
  88.  
  89.  
  90. HTREEITEM KTreeView::InsertItem(HTREEITEM hLast, HTREEITEM hParent, const TCHAR * mess)
  91. {
  92.     TV_INSERTSTRUCT tv;
  93.  
  94.     tv.hInsertAfter = hLast;
  95.     tv.item.mask    = TVIF_TEXT;
  96.     tv.hParent      = hParent;
  97.     tv.item.pszText = (TCHAR *) mess;
  98.  
  99.     return TreeView_InsertItem(m_hWnd, & tv);
  100. }
  101.  
  102.  
  103. HTREEITEM KTreeView::InsertTree(HTREEITEM hLast, HTREEITEM hParent, 
  104.                      const TCHAR * rootname, const TCHAR * pField, const void * data)
  105. {
  106.     KFormat format(pField, data);
  107.  
  108.     if ( rootname )
  109.     {
  110.         hParent = InsertItem(hLast, hParent, rootname);
  111.         hLast   = TVI_LAST;
  112.     }
  113.     
  114.     while ( format.Getline() )
  115.         hLast = InsertItem(hLast, hParent, format.m_Output);
  116.  
  117.     if ( rootname )
  118.         return hParent;
  119.     else
  120.         return hLast;
  121. }
  122.  
  123.  
  124. void KTreeView::AddFlags(HTREEITEM hRoot, DWORD flags, const term * Dict)
  125. {
  126.     while ( Dict->mask && Dict->desp )
  127.     {
  128.         if ( Dict->mask & flags )
  129.         {
  130.             InsertItem(TVI_LAST, hRoot, Dict->desp);
  131.             flags &= ~ Dict->mask;
  132.         }
  133.  
  134.         Dict ++;
  135.     }
  136.  
  137.     if ( flags )
  138.     {
  139.         TCHAR temp[32];
  140.         wsprintf(temp, _T("unknown 0x%x"), flags);
  141.         InsertItem(TVI_LAST, hRoot, temp);
  142.     }
  143. }
  144.  
  145.  
  146.