eventlist.cpp

来自「IO函数调用测试」· C++ 代码 · 共 237 行

CPP
237
字号
// EventList.cpp : implementation file
//

#include "stdafx.h"
#include "format.h"
#include "IOExplorer.h"
#include "TraceEvent.h"
#include "EventList.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CEventList

CEventList::CEventList()
{
 fixed = NULL; // no initial font
 height = 0;   // initial height is unknown
 modified = FALSE;
}

CEventList::~CEventList()
{
}


BEGIN_MESSAGE_MAP(CEventList, CListBox)
	//{{AFX_MSG_MAP(CEventList)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CEventList message handlers

void CEventList::MeasureItem(LPMEASUREITEMSTRUCT mis) 
{
 if(height == 0)
    { /* compute double-height */
     CClientDC dc(this);
     CFont * f = GetFont();
     dc.SelectObject(f);
     TEXTMETRIC tm;
     dc.GetTextMetrics(&tm);
     height = tm.tmHeight + tm.tmInternalLeading;
    } /* compute double-height */

 TraceEvent * e = (TraceEvent *)mis->itemData;
 mis->itemHeight = height * e->displayHeight();
	
}

/****************************************************************************
*                            CEventList::DrawItem
* Inputs:
*       LPDRAWITEMSTRUCT dis:
* Result: void
*       
* Effect: 
*       Draws the item
*
* (display value)
*   => (return value)
* 00000 |aaaaaaaa aaaaaaaa| xx xx xx xx xx xx xx xx   xx xx xx xx xx xx xx xx
* 00010 |aaaaaaaa aaaaaaaa| xx xx xx xx xx xx xx xx   xx xx xx xx xx xx xx xx
****************************************************************************/

void CEventList::DrawItem(LPDRAWITEMSTRUCT dis) 
{
 CDC * dc = CDC::FromHandle(dis->hDC);
 
 if(height == 0)
    { /* compute line height */
     TEXTMETRIC tm;
     dc->GetTextMetrics(&tm);
     height = tm.tmHeight + tm.tmInternalLeading;
    } /* compute line height */

 if(fixed == NULL)
    { /* create fixed font */
     CFont * f = GetFont();
     LOGFONT lf;
     f->GetLogFont(&lf);
     // We now have the logfont properties.  Tweak them to get Courier
     lstrcpy(lf.lfFaceName, _T("Courier New"));
     lf.lfPitchAndFamily = FIXED_PITCH;
     fixed = new CFont();
     fixed->CreateFontIndirect(&lf);
    } /* create fixed font */

 if(dis->itemID == -1)
    { /* no items */
     CBrush bg(::GetSysColor(COLOR_WINDOW));
     dc->FillRect(&dis->rcItem, &bg);
     if(dis->itemState & ODS_FOCUS)
        { /* selected */
	 dc->DrawFocusRect(&dis->rcItem);
	} /* selected */
     return;
    } /* no items */

 TraceEvent * e = (TraceEvent *)dis->itemData;

// if(dis->itemState & ODA_FOCUS)
//    { /* focus only */
//     dc->DrawFocusRect(&dis->rcItem);
//     return;
//    } /* focus only */

 int saved = dc->SaveDC();

 COLORREF txcolor;
 COLORREF bkcolor;
 COLORREF errcolor;

 if(dis->itemState & ODS_SELECTED)
    { /* selected */
     if(::GetFocus() == m_hWnd)
        { /* has focus */
	 bkcolor = ::GetSysColor(COLOR_HIGHLIGHT);
	 txcolor = ::GetSysColor(COLOR_HIGHLIGHTTEXT);
	 errcolor = txcolor;
	} /* has focus */
     else
        { /* no focus */
	 bkcolor = ::GetSysColor(COLOR_BTNFACE);
	 txcolor = ::GetSysColor(COLOR_BTNTEXT);
	 errcolor = RGB(255, 0, 0);
	} /* no focus */
    } /* selected */
 else
    { /* not selected */
     switch(e->type())
	{ /* type */
	 case TRACE_TYPE_ANNOTATION:
		 txcolor = RGB(0, 0, 128);
		 break;
	 default:
		 txcolor = ::GetSysColor(COLOR_WINDOWTEXT);
		 break;
	} /* type */

     bkcolor = ::GetSysColor(COLOR_WINDOW);
     errcolor = RGB(255, 0, 0);
    } /* not selected */

 {
  CBrush bg(bkcolor);
  dc->FillRect(&dis->rcItem, &bg);
 }

 dc->SetTextColor(txcolor);
 dc->SetBkMode(TRANSPARENT);

 CString s = e->display();

 int y = dis->rcItem.top + height;

 dc->TextOut(dis->rcItem.left, dis->rcItem.top, s);

 CString t = e->display_result();
 if(t.GetLength() > 0)
    { /* has result */
     s = _T("  => ");
     s += t;

     dc->TextOut(dis->rcItem.left, y, s);

     // Show any error (note that if there is no result string, no error
     // can be displayed)

     int delta = dc->GetTextExtent(s).cx;
     int sp = 20; // TODO: choose a font-related value?

     if(delta + sp < dis->rcItem.right / 2)
	delta = dis->rcItem.right / 2;
     else
	delta += sp;

     if(e->lasterror != 0)
	{ /* show error */
	 CString s = formatError(e->lasterror);
	 int saved = dc->SaveDC();
	 dc->SetTextColor(errcolor);
	 dc->TextOut(delta, y, s);
	 dc->RestoreDC(saved);
	} /* show error */

     y += height;
    } /* has result */


 // Now if there is data present, show it
 if(e->displayDataCount() > 0)
    { /* data */
     dc->SelectObject(fixed);  // set to fixed font
     for(UINT i = 0; i < e->displayDataCount(); i++)
        { /* display each */
	 s = e->displayData(i);
	 dc->TextOut(dis->rcItem.left, y, s);
	 y += height;
	} /* display each */
    } /* data */

 CPen pen(PS_SOLID, 0, RGB(255, 0, 0));
 dc->SelectObject(&pen);
 dc->MoveTo(dis->rcItem.left, dis->rcItem.bottom - 1);
 dc->LineTo(dis->rcItem.right, dis->rcItem.bottom - 1);

 if(dis->itemState & ODS_FOCUS)
    dc->DrawFocusRect(&dis->rcItem);

 dc->RestoreDC(saved);
}

/****************************************************************************
*                           CEventList::DeleteItem
* Inputs:
*       LPDELETEITEMSTRUCT dis
* Result: void
*       
* Effect: 
*       Deletes the item attached to the element
****************************************************************************/

void CEventList::DeleteItem(LPDELETEITEMSTRUCT dis) 
{
 TraceEvent * e = (TraceEvent *)dis->itemData;
 delete e;

 CListBox::DeleteItem(dis);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?