DataDisplay.cpp
上传用户:zhuqijet
上传日期:2007-01-04
资源大小:138k
文件大小:6k
源码类别:

驱动编程

开发平台:

Visual C++

  1. // DataDisplay.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "PCI Explorer.h"
  5. #include "DataDisplay.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CDataDisplay
  13. CDataDisplay::CDataDisplay()
  14. {
  15.  col1 = 0;
  16.  format = DISPLAY_HEX_BYTES;
  17. }
  18. CDataDisplay::~CDataDisplay()
  19. {
  20. }
  21. BEGIN_MESSAGE_MAP(CDataDisplay, CListBox)
  22. //{{AFX_MSG_MAP(CDataDisplay)
  23. // NOTE - the ClassWizard will add and remove mapping macros here.
  24. //}}AFX_MSG_MAP
  25. END_MESSAGE_MAP()
  26. /////////////////////////////////////////////////////////////////////////////
  27. // CDataDisplay message handlers
  28. /****************************************************************************
  29. *                                   cvdisp
  30. * Inputs:
  31. *       char * c: Character to convert
  32. * Result: void
  33. *       
  34. * Effect: 
  35. *       Converts the character to a printable character
  36. ****************************************************************************/
  37. void cvdisp(char * c)
  38.     {
  39.      if(*c < ' ')
  40. *c = '.';
  41.     }
  42. void CDataDisplay::DrawItem(LPDRAWITEMSTRUCT dis) 
  43. {
  44.      CDC * dc = CDC::FromHandle(dis->hDC);
  45.      if(dis->itemID == -1)
  46.         { /* empty */
  47.  CBrush bg(::GetSysColor(COLOR_WINDOW));
  48.  dc->FillRect(&dis->rcItem, &bg);
  49.  if(dis->itemState & ODS_FOCUS)
  50.     { /* selected */
  51.      dc->DrawFocusRect(&dis->rcItem);
  52.     } /* selected */
  53.  return;  // nothing to draw
  54. } /* empty */
  55.      if(dis->itemState & ODA_FOCUS)
  56.         { /* focus only */
  57.  dc->DrawFocusRect(&dis->rcItem);
  58.  return;
  59. } /* focus only */
  60.      int saved = dc->SaveDC();
  61.      COLORREF txcolor;
  62.      COLORREF gycolor;
  63.      dc->SetBkMode(TRANSPARENT);
  64.      ///////////////////////////////////////////////////////////////////////
  65.      // Background
  66.      ///////////////////////////////////////////////////////////////////////
  67.      if((dis->itemState & ODS_SELECTED))
  68. { /* selected */
  69.  COLORREF fill;
  70.  if(::GetFocus() == m_hWnd)
  71.     fill = ::GetSysColor(COLOR_HIGHLIGHT);
  72.          else
  73.     fill = ::GetSysColor(COLOR_GRAYTEXT);
  74.  CBrush bg(fill);
  75.  dc->FillRect(&dis->rcItem, &bg);
  76.  txcolor = ::GetSysColor(COLOR_HIGHLIGHTTEXT);
  77.  gycolor = ::GetSysColor(COLOR_HIGHLIGHTTEXT);
  78. } /* selected */
  79.      else
  80.         { /* not selected */
  81.  CBrush bg(::GetSysColor(COLOR_WINDOW));
  82.  dc->FillRect(&dis->rcItem, &bg);
  83.  txcolor = ::GetSysColor(COLOR_WINDOWTEXT);
  84.  gycolor = ::GetSysColor(COLOR_GRAYTEXT);
  85. } /* not selected */
  86.      
  87.      ///////////////////////////////////////////////////////////////////////
  88.      // Value
  89.      ///////////////////////////////////////////////////////////////////////
  90.      if(col1 == 0)
  91.         { /* set it */
  92.  col1 = dc->GetTextExtent(CString(_T("000:  "))).cx;
  93. } /* set it */
  94.      CString s;
  95.      s.Format(_T("%3d:  "), dis->itemID * sizeof(DWORD));
  96.      int offset = dc->GetTextExtent(s, s.GetLength()).cx;
  97.      dc->SetTextColor(RGB(0, 0, 255));
  98.      dc->TextOut(col1 - offset, dis->rcItem.top, s);
  99.      ///////////////////////////////////////////////////////////////////////
  100.      // Data
  101.      ///////////////////////////////////////////////////////////////////////
  102.      dc->SetTextColor(txcolor);
  103.      switch(format)
  104.         { /* decode format */
  105.  case DISPLAY_HEX_BYTES:
  106.  s.Format(_T("%02x  %02x  %02x  %02x"),
  107.       HIBYTE(HIWORD(dis->itemData)),
  108.       LOBYTE(HIWORD(dis->itemData)),
  109.       HIBYTE(LOWORD(dis->itemData)),
  110.       LOBYTE(LOWORD(dis->itemData)));
  111.  break;
  112.  case DISPLAY_HEX_WORDS:
  113.  s.Format(_T("%04x  %04x"), HIWORD(dis->itemData),
  114.       LOWORD(dis->itemData));
  115.  break;
  116.  case DISPLAY_HEX_DWORDS:
  117.  s.Format(_T("%08x"), dis->itemData);
  118.  break;
  119.  case DISPLAY_DECIMAL_BYTES:
  120.  s.Format(_T("%u  %u  %u  %u"),
  121.       HIBYTE(HIWORD(dis->itemData)),
  122.       LOBYTE(HIWORD(dis->itemData)),
  123.       HIBYTE(LOWORD(dis->itemData)),
  124.       LOBYTE(LOWORD(dis->itemData)));
  125.  break;
  126.  case DISPLAY_DECIMAL_WORDS:
  127.  s.Format(_T("%u %u"), HIWORD(dis->itemData),
  128.       LOWORD(dis->itemData));
  129.  break;
  130.  case DISPLAY_DECIMAL_DWORDS:
  131.  s.Format(_T("%u"), dis->itemData);
  132.  break;
  133.          case DISPLAY_ANSI_CHARACTERS:
  134.  {
  135.   char t[5];
  136.   t[0] = HIBYTE(HIWORD(dis->itemData));
  137.   t[1] = LOBYTE(HIWORD(dis->itemData));
  138.   t[2] = HIBYTE(LOWORD(dis->itemData));
  139.   t[3] = LOBYTE(LOWORD(dis->itemData));
  140.   t[4] = '';
  141.   cvdisp(&t[0]);
  142.   cvdisp(&t[1]);
  143.   cvdisp(&t[2]);
  144.   cvdisp(&t[3]);
  145.   s.Format(_T("%02x  %02x  %02x  %02x  |%c%c%c%c|"),
  146.      HIBYTE(HIWORD(dis->itemData)),
  147.      LOBYTE(HIWORD(dis->itemData)),
  148.      HIBYTE(LOWORD(dis->itemData)),
  149.      LOBYTE(LOWORD(dis->itemData)),
  150.      t[0],
  151.      t[1],
  152.      t[2],
  153.      t[3]);
  154.  }
  155.  break;
  156.  case DISPLAY_UNICODE_CHARACTERS:
  157.  {
  158.   WCHAR t[3];
  159.   t[0] = HIWORD(dis->itemData);
  160.   t[1] = LOWORD(dis->itemData);
  161.   t[2] = L'';
  162.   // If we are already in Unicode, no need to convert
  163.   // If we are in ANSI, convert it
  164.   // NYI: ugly hack
  165.   char t2[3];
  166.   t2[0] = (char)t[0];
  167.   t2[1] = (char)t[1];
  168.   t2[2] = (char)t[2];
  169.   cvdisp(&t2[0]);
  170.   cvdisp(&t2[1]);
  171.   s.Format(_T("%04x  %04x |%c%c|"), HIWORD(dis->itemData),
  172.               LOWORD(dis->itemData),
  173.     t2[0],
  174.     t2[1]);
  175.  }
  176.  break;
  177. } /* decode format */
  178.      dc->TextOut(col1, dis->rcItem.top, s);
  179.      ///////////////////////////////////////////////////////////////////////
  180.      // finish off processing
  181.      ///////////////////////////////////////////////////////////////////////
  182.      if(dis->itemState & ODS_FOCUS)
  183. { /* selected */
  184.  dc->DrawFocusRect(&dis->rcItem);
  185. } /* selected */
  186.      dc->RestoreDC(saved);
  187.      
  188. // TODO: Add your code to draw the specified item
  189. }