home *** CD-ROM | disk | FTP | other *** search
/ Windows Graphics Programming / Feng_Yuan_Win32_GDI_DirectX.iso / Samples / include / LogWindow.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2000-05-20  |  3.7 KB  |  145 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   : logwindow.cpp                                                         //
  10. //  Description: Generic Text-based Logging Window                                   //
  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. #include <stdio.h>
  21. #include <stdarg.h>
  22.  
  23. #include "win.h"
  24. #include "logwindow.h"
  25.  
  26.  
  27. void KLogWindow::Create(HINSTANCE hInst, const TCHAR * pTitle, HICON hIcon)
  28. {
  29.     m_hInst = hInst;
  30.     m_hIcon = hIcon;
  31.  
  32.     CreateEx(0, _T("LOGWINDOW"), pTitle, WS_VISIBLE | WS_OVERLAPPEDWINDOW, 
  33.         0, 0, 240, 600, NULL, NULL, hInst);
  34. }
  35.  
  36.  
  37. LRESULT KLogWindow::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
  38. {
  39.     switch( uMsg )
  40.     {
  41.         case WM_CREATE:
  42.             {
  43.                 m_hWnd       = hWnd;
  44.  
  45.                 RECT rect;
  46.                 GetClientRect(m_hWnd, & rect);
  47.  
  48.                 m_hEditWnd = CreateWindow(_T("EDIT"), NULL,  
  49.                     WS_VISIBLE | WS_CHILD | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL, 
  50.                     0, 0, rect.right, rect.bottom, m_hWnd, NULL, m_hInst, NULL);
  51.  
  52.                 SendMessage(m_hEditWnd, WM_SETFONT, (LPARAM) GetStockObject(SYSTEM_FIXED_FONT), 0);
  53.                 SendMessage(m_hEditWnd, EM_LIMITTEXT, 2 * 1024 * 1024, 0);
  54.             }
  55.  
  56.             return 0;
  57.  
  58.         case WM_SIZE:
  59.             MoveWindow(m_hEditWnd, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);    
  60.             return 0;
  61.  
  62.         case WM_NCDESTROY:
  63.             delete this; // deallocate itself
  64.             return 0;
  65.  
  66.         default:
  67.             return DefWindowProc(hWnd, uMsg, wParam, lParam);
  68.     }
  69. }
  70.  
  71.  
  72. void KLogWindow::Log(const char * format, ...)
  73. {
  74.     char buffer[1024];
  75.  
  76.     va_list ap;
  77.  
  78.     va_start(ap, format);
  79.     vsprintf(buffer, format, ap);
  80.     SendMessage(m_hEditWnd, EM_SETSEL, 0xFFFFFF, 0xFFFFFF);
  81.     SendMessage(m_hEditWnd, EM_REPLACESEL, 0, (LPARAM) buffer);
  82.  
  83.     va_end(ap);
  84. }
  85.  
  86.  
  87. void KLogWindow::DumpRegion(const char * mess, HRGN hRgn, bool detail, int p1)
  88. {
  89.     if ( mess )
  90.         Log(mess, p1);
  91.  
  92.     if ( hRgn==NULL )
  93.         Log(" NULL");
  94.     else
  95.     {
  96.         RECT rect;
  97.  
  98.         memset(& rect, 0, sizeof(rect));
  99.     
  100.         switch ( GetRgnBox(hRgn, & rect) )
  101.         {
  102.             case NULLREGION: 
  103.                 Log(" NULLREGION "); break;
  104.  
  105.             case SIMPLEREGION:
  106.                 Log(" SIMPLEREGION "); break;
  107.  
  108.             case COMPLEXREGION:
  109.                 Log(" COMPLEXREGION "); break;
  110.  
  111.             default:
  112.                 Log(" Error "); break;
  113.         }
  114.  
  115.         Log(" RgnBox=[%d, %d, %d, %d) ", rect.left, rect.top, rect.right, rect.bottom);
  116.  
  117.         int size = GetRegionData(hRgn, 0, NULL);
  118.         int rectcount = 0;
  119.  
  120.         if ( size )
  121.         {
  122.             RGNDATA * pRegion = (RGNDATA *) new char[size];
  123.             GetRegionData(hRgn, size, pRegion);
  124.  
  125.             const RECT * pRect = (const RECT *) & pRegion->Buffer;
  126.             rectcount = pRegion->rdh.nCount;
  127.  
  128.             Log("%d rectangles", rectcount);
  129.  
  130.             if ( detail )
  131.             {
  132.                 Log("\r\n");
  133.                 for (unsigned i=0; i<pRegion->rdh.nCount; i++)
  134.                     Log("rect %d [%d, %d, %d, %d)\r\n", i, pRect[i].left, pRect[i].top, pRect[i].right, pRect[i].bottom);
  135.             }
  136.  
  137.             delete [] (char *) pRegion;
  138.         }
  139.         else
  140.             Log("0 rectangle");
  141.     }
  142.  
  143.     Log("\r\n");
  144. }
  145.