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 + -
显示快捷键?