home *** CD-ROM | disk | FTP | other *** search
/ Windows Graphics Programming / Feng_Yuan_Win32_GDI_DirectX.iso / Samples / include / EditView.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-05-11  |  4.7 KB  |  212 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   : editview.cpp                                                         //
  10. //  Description: text window with hexdump support                                    //
  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 <assert.h>
  19. #include <tchar.h>
  20.  
  21. #include "win.h"
  22. #include "Canvas.h"
  23. #include "ScrollCanvas.h"
  24. #include "EditView.h"
  25. #include "DDB.h"
  26. #include "Background.h"
  27.  
  28. class KCount
  29. {
  30. protected:
  31.     DWORD Used[1024];
  32.  
  33. public:    
  34.     int   nUsed;
  35.  
  36.     KCount()
  37.     {
  38.         nUsed = 0;
  39.     }
  40.  
  41.     void Check(DWORD value);
  42. };
  43.  
  44.  
  45. void KCount::Check(DWORD value)
  46. {
  47.     if ( nUsed>=1024 )
  48.         return;
  49.  
  50.     for (int i=0; i<nUsed; i++)
  51.         if ( Used[i]==value )
  52.             return;
  53.  
  54.     Used[nUsed++] = value;
  55. }
  56.  
  57.  
  58. void Append(HWND hWnd, const TCHAR * buffer)
  59. {
  60.     SendMessage(hWnd, EM_SETSEL, 0xFFFFFFF, 0xFFFFFFF);
  61.     SendMessage(hWnd, EM_REPLACESEL, 0, (LPARAM) buffer);
  62. }
  63.  
  64.  
  65. void AppendHex(HWND hWnd, const BYTE * pBuffer, int size, int unit)
  66. {
  67.     TCHAR text[8192];
  68.  
  69.     wsprintf(text, _T("size %d bytes\r\n\r\n"), size);
  70.     Append(hWnd, text);
  71.  
  72.     KCount count;
  73.  
  74.     int len = 0;
  75.  
  76.     for (int i=0; i<size; i+=16 )
  77.     {
  78.         wsprintf(text+len, _T("%05X: "), i); len += 7;
  79.  
  80.         if ( unit==4 )    // 32 bit
  81.         {
  82.             for (int j=0; j<16; j+=4) 
  83.                 if ( (i+j)<size )
  84.                 {
  85.                     DWORD value = (DWORD) * (DWORD *) (pBuffer+j);
  86.  
  87.                     count.Check(value);
  88.  
  89.                     wsprintf(text + len, _T("%08X "), value); len += 9;
  90.                 }
  91.         }
  92.         else            // 8 bit
  93.         {
  94.             for (int j=0; j<16; j++) 
  95.                 if ( (i+j)<size )
  96.                 {
  97.                     DWORD value = pBuffer[j];
  98.  
  99.                     count.Check(value);
  100.                     wsprintf(text + len, _T("%02X "), value); len += 3;
  101.                 }
  102.         }
  103.  
  104.         _tcscat(text + len, _T("\r\n")); len += 2;
  105.  
  106.         if ( len + MAX_PATH >= sizeof(text)/sizeof(TCHAR) )
  107.         {
  108.             text[len] = 0;
  109.             Append(hWnd, text);
  110.             len = 0;
  111.         }
  112.         
  113.         pBuffer += 16;
  114.     }
  115.  
  116.     text[len] = 0;
  117.     Append(hWnd, text);
  118.  
  119.     wsprintf(text, _T("size %d %d bytes %d unique\r\n"), i, size, count.nUsed);
  120.     Append(hWnd, text);
  121. }
  122.  
  123.  
  124. LRESULT KEditView::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  125. {
  126.     switch( uMsg )
  127.     {
  128.         case WM_CREATE:
  129.             m_hWnd        = hWnd;
  130.             m_hEdit     = CreateWindow(_T("EDIT"), NULL, 
  131.                 WS_CHILD | WS_VISIBLE | ES_AUTOVSCROLL | ES_AUTOHSCROLL | 
  132.                 ES_WANTRETURN | ES_MULTILINE | WS_HSCROLL | WS_VSCROLL,
  133.                 0, 0, 0, 0, m_hWnd, NULL, m_hInstance, NULL);
  134.  
  135.             SendMessage(m_hEdit, WM_SETFONT, (WPARAM) GetStockObject(ANSI_FIXED_FONT), 0);
  136.             SendMessage(m_hEdit, EM_LIMITTEXT, 512 * 1024, 0);    // 512 Kb limit
  137.  
  138. //            m_pBackground = new CDDBBackground;
  139. //            if ( m_pBackground )
  140. //            {
  141. //                m_pBackground->Attach(m_hEdit);
  142. //            }                
  143.             return 0;
  144.  
  145.         case WM_SIZE:
  146.             MoveWindow(m_hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
  147.             return 0;
  148.  
  149. //        case WM_DESTROY:
  150. //            if ( m_pBackground )
  151. //            {
  152. //                m_pBackground->Detatch(m_hEdit);
  153. //                delete m_pBackground;
  154. //                m_pBackground = NULL;
  155. //            }
  156.  
  157.         default:
  158.             return CommonMDIChildProc(hWnd, uMsg, wParam, lParam, NULL, 0);
  159.     }
  160. }
  161.  
  162.  
  163. bool KEditView::Initialize(HINSTANCE hInstance)
  164. {
  165.     m_hInstance = hInstance;
  166.  
  167.     RegisterClass(_T("EditView"), hInstance);
  168.             
  169.     return true;
  170. }
  171.  
  172.  
  173. void KEditView::Decode(DWORD m_Data, DWORD m_Type)
  174. {
  175.     TCHAR mess[128];
  176.  
  177.     if ( m_Type==1 )
  178.     {
  179.         HBITMAP hBmp = (HBITMAP) m_Data;
  180.  
  181.         wsprintf(mess, _T("DDB %x "), m_Data);
  182.         DecodeDDB(hBmp, mess + _tcslen(mess));
  183.  
  184.         BITMAP bmp;
  185.         GetObject(hBmp, sizeof(bmp), & bmp);
  186.  
  187.         int size = GetBitmapBits(hBmp, 0, NULL);
  188.         BYTE * pBuffer = new BYTE[size];
  189.  
  190.         Append(m_hEdit, mess);
  191.         Append(m_hEdit, _T("\r\n"));
  192.             
  193.         if ( pBuffer )
  194.         {
  195.             GetBitmapBits(hBmp, size, pBuffer);
  196.  
  197.             if ( bmp.bmBitsPixel==32 )
  198.                 AppendHex(m_hEdit, pBuffer, size, 4);
  199.             else
  200.                 AppendHex(m_hEdit, pBuffer, size, 1);
  201.  
  202.             delete [] pBuffer;
  203.         }
  204.  
  205.         mess[0] = 0;
  206.     }
  207.     else
  208.         wsprintf(mess, _T("DIB %x "), m_Data);
  209.         
  210.     Append(m_hEdit, mess);
  211. }
  212.