⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chartwnd.cpp

📁 PCI的一个测试程序,可以测试PCI driver和BOARD的功能.
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// ChartWnd.cpp : 实现文件
//

#include "stdafx.h"
#include "TestFunc.h"
#include "PCIEBoardTest.h"
#include ".\chartdata.h"
#include "ChartWnd.h"
#include ".\chartwnd.h"



// CChartWnd

IMPLEMENT_DYNAMIC(CChartWnd, CWnd)
CChartWnd::CChartWnd()
{
    m_nChartCount = 0;
    for(int i=0; i<MAX_CHART_COUNT; ++i)
        m_pChartItem[i] = NULL;

    m_AxresInfor[0].Transformer = 1024;         // k
    m_AxresInfor[1].Transformer = 1000 * 1000;  // M
}

CChartWnd::~CChartWnd()
{
    for(int i=0; i<MAX_CHART_COUNT; ++i)
    {
        if (m_pChartItem[i])
        {
            delete m_pChartItem[i];
            m_pChartItem[i] = NULL;
        }
    }

    m_nChartCount = 0;
}


BEGIN_MESSAGE_MAP(CChartWnd, CWnd)
    ON_WM_ERASEBKGND()
    ON_WM_CREATE()
    ON_WM_MOUSEMOVE()
END_MESSAGE_MAP()



// CChartWnd 消息处理程序


BOOL CChartWnd::OnEraseBkgnd(CDC* pDC)
{
    // TODO: 在此添加消息处理程序代码和/或调用默认值
    CRect   rectClient;
    CRect   rectSubTitle;       // 图示说明区域
    CRect   rectFrame;          // 坐标系区域,其左下角即为原点位置

    LOGFONT lfTitle;
    LOGFONT lfAxresName[2];
    LOGFONT lfSubTitle;
    LOGFONT lfAxresLabel[2];

    CFont   fontTitle;
    CFont   fontAxresName[2];
    CFont   fontSubTitle;
    CFont   fontAxresLabel[2];

    CFont* pOldFont;

    CSize   sizeTitle;
    CSize   sizeSubTitle;
    CSize   sizeXTitle;
    CSize   sizeYTitle;
    CSize   sizeXLabel;
    CSize   sizeYLabel;

    CPen    penFrame;
    CPen *  pOldPen;

    int     i;
    int     j;


    ::ZeroMemory (&lfTitle, sizeof (lfTitle));
    ::ZeroMemory (&lfAxresName[0], sizeof (lfAxresName[0]));
    ::ZeroMemory (&lfAxresName[1], sizeof (lfAxresName[1]));
    ::ZeroMemory (&lfSubTitle, sizeof (lfSubTitle));
    ::ZeroMemory (&lfAxresLabel[0], sizeof (lfAxresLabel[0]));
    ::ZeroMemory (&lfAxresLabel[1], sizeof (lfAxresLabel[1]));

    // Title
    lfTitle.lfHeight = 120;
    lfTitle.lfWeight = FW_BOLD;
    ::lstrcpy (lfTitle.lfFaceName, _T ("System"));
    fontTitle.CreatePointFontIndirect (&lfTitle);

    // X Axres Name
    lfAxresName[0].lfHeight = 120;
    lfAxresName[0].lfWeight = FW_NORMAL;
    ::lstrcpy (lfAxresName[0].lfFaceName, _T ("System"));
    fontAxresName[0].CreatePointFontIndirect (&lfAxresName[0]);

    // Y Axres Name
    lfAxresName[1].lfHeight = 120;
    lfAxresName[1].lfWeight = FW_NORMAL;
    lfAxresName[1].lfEscapement  = 900;
    lfAxresName[1].lfOrientation = 900;
    ::lstrcpy (lfAxresName[1].lfFaceName, _T ("System"));
    fontAxresName[1].CreatePointFontIndirect (&lfAxresName[1]);

    // SubTitle Name
    lfSubTitle.lfHeight = 90;
    lfSubTitle.lfWeight = FW_NORMAL;
    ::lstrcpy (lfSubTitle.lfFaceName, _T ("System"));
    fontSubTitle.CreatePointFontIndirect (&lfSubTitle);

    // X Axres Label
    lfAxresLabel[0].lfHeight = 100;
    lfAxresLabel[0].lfWeight = FW_NORMAL;
    ::lstrcpy (lfAxresLabel[0].lfFaceName, _T ("System"));
    fontAxresLabel[0].CreatePointFontIndirect (&lfAxresLabel[0]);

    // Y Axres Label
    lfAxresLabel[1].lfHeight = 100;
    lfAxresLabel[1].lfWeight = FW_NORMAL;
    ::lstrcpy (lfAxresLabel[1].lfFaceName, _T ("System"));
    fontAxresLabel[1].CreatePointFontIndirect (&lfAxresLabel[1]);




    GetClientRect(rectClient);

    // 背景
    pDC->FillSolidRect(rectClient, RGB(255, 255, 255));

    // 计算X/Y轴信息,如图形显示比较慢,可以放到AddChart等位置去更新,以节省绘图时间
    CalcChart();

    // 计算各个位置:
    //      title显示位置、xtitle显示位置、ytitle显示位置、原点位置、x轴顶端位置、y轴顶端位置、x/y显示比率
    //      图示显示位置/大小

    // 显示Title
    pOldFont = pDC->SelectObject (&fontTitle);
    sizeTitle = pDC->GetOutputTextExtent(m_strTitle);
    pDC->TextOut ((rectClient.left + rectClient.right - sizeTitle.cx) / 2, 2, m_strTitle);
    pDC->SelectObject (pOldFont);
    
    // 显示X Title
    pOldFont = pDC->SelectObject (&fontAxresName[0]);
    sizeXTitle = pDC->GetOutputTextExtent(m_strAxresName[0]);
    pDC->TextOut ((rectClient.left + rectClient.right - sizeXTitle.cx) / 2, rectClient.bottom - 2 - sizeXTitle.cy, m_strAxresName[0]);
    pDC->SelectObject (pOldFont);

    // 显示Y Title
    pOldFont = pDC->SelectObject (&fontAxresName[1]);
    sizeYTitle = pDC->GetOutputTextExtent(m_strAxresName[1]);
    pDC->TextOut (rectClient.left + 5, (rectClient.top + rectClient.bottom + sizeYTitle.cx) / 2, m_strAxresName[1]);
    pDC->SelectObject (pOldFont);

    // 获取Xlabel、Ylabel大小
    pOldFont = pDC->SelectObject(&fontAxresLabel[0]);
//    sizeXLabel = pDC->GetOutputTextExtent("000");
    sizeXLabel.cx = 0;
    for(i=0; i<=m_AxresInfor[0].Layers; ++i)
    {
        // label 
        CString     strLabel;
        strLabel.Format("%d", (int)((m_AxresInfor[0].BaseValue + i * m_AxresInfor[0].UnitValue) / (m_AxresInfor[0].Transformer)));

        CSize       sizeTemp;
        sizeTemp = pDC->GetOutputTextExtent(strLabel);

        if (sizeTemp.cx > sizeXLabel.cx)
            sizeXLabel = sizeTemp;
    }
    pDC->SelectObject(pOldFont);

    pOldFont = pDC->SelectObject(&fontAxresLabel[1]);
//    sizeYLabel = pDC->GetOutputTextExtent("000");
    sizeYLabel.cx = 0;
    for(i=0; i<=m_AxresInfor[1].Layers; ++i)
    {
        // label 
        CString     strLabel;
        if (m_AxresInfor[1].UnitValue > m_AxresInfor[1].Transformer && (m_AxresInfor[1].UnitValue % m_AxresInfor[1].Transformer == 0))
            strLabel.Format("%d", (int)((m_AxresInfor[1].BaseValue + i * m_AxresInfor[1].UnitValue) / (m_AxresInfor[1].Transformer)));
        else
            strLabel.Format("%.1f", (m_AxresInfor[1].BaseValue + i * m_AxresInfor[1].UnitValue * 1.0) / (m_AxresInfor[1].Transformer));

        CSize       sizeTemp;
        sizeTemp = pDC->GetOutputTextExtent(strLabel);

        if (sizeTemp.cx > sizeYLabel.cx)
            sizeYLabel = sizeTemp;
    }
    pDC->SelectObject(pOldFont);

    // 显示图示
    pOldFont = pDC->SelectObject(&fontSubTitle);
    sizeSubTitle = pDC->GetOutputTextExtent("000");
    sizeSubTitle.cy += 4;   //加上画矩形所需的点
    rectSubTitle.left = sizeYTitle.cy + 8 + sizeYLabel.cx;
    rectSubTitle.top  = sizeTitle.cy + 3;
    rectSubTitle.bottom = rectSubTitle.top + sizeSubTitle.cy + 4;
        //right 待定
    rectSubTitle.right = rectSubTitle.left + 2;
    for(i=0; i<m_nChartCount; ++i)
    {
        CPen    tmpPen;
        CPen *  pOldPen;

        // 画线
        pDC->MoveTo(rectSubTitle.right, (rectSubTitle.top + rectSubTitle.bottom) / 2);
        tmpPen.CreatePen(PS_SOLID, 1, m_pChartItem[i]->m_color);
        pOldPen = pDC->SelectObject(&tmpPen);
        pDC->LineTo(rectSubTitle.right + 30, (rectSubTitle.top + rectSubTitle.bottom) / 2);

        // 画图形
        POINT   Point[5];
        Point[0].x = rectSubTitle.right + 13;
        Point[0].y = (rectSubTitle.top + rectSubTitle.bottom) / 2 - 2;
        Point[1].x = rectSubTitle.right + 17;
        Point[1].y = Point[0].y;
        Point[2].x = Point[1].x;
        Point[2].y = (rectSubTitle.top + rectSubTitle.bottom) / 2 + 2;
        Point[3].x = Point[0].x;
        Point[3].y = Point[2].y;
        Point[4].x = Point[0].x;
        Point[4].y = Point[0].y;

        pDC->Polyline(Point, 5);
        pDC->SelectObject(pOldPen);

        rectSubTitle.right += 31;

        CSize   sizeTemp;
        sizeTemp = pDC->GetOutputTextExtent(m_pChartItem[i]->m_name);

        pDC->TextOut(rectSubTitle.right, (rectSubTitle.top + rectSubTitle.bottom - sizeTemp.cy)/2, m_pChartItem[i]->m_name);

        rectSubTitle.right += sizeTemp.cx + 2;
    }
    // 显示SUBTITLE的外框
    if (m_nChartCount > 0)
    {
        CPen    tmpPen;

        tmpPen.CreatePen(PS_SOLID, 1, RGB(0,0,0));
        pOldPen = pDC->SelectObject(&tmpPen);

        POINT   Point[5];
        Point[0].x = rectSubTitle.left;
        Point[0].y = rectSubTitle.top;
        Point[1].x = rectSubTitle.right;
        Point[1].y = rectSubTitle.top;
        Point[2].x = rectSubTitle.right;
        Point[2].y = rectSubTitle.bottom;
        Point[3].x = rectSubTitle.left;
        Point[3].y = rectSubTitle.bottom;
        Point[4].x = rectSubTitle.left;
        Point[4].y = rectSubTitle.top;

        pDC->Polyline(Point, 5);

        pDC->SelectObject(pOldPen);
    }
    pDC->SelectObject(pOldFont);



    // 显示X/Y轴
    rectFrame.left  = sizeYTitle.cy + 8 + sizeYLabel.cx;
    rectFrame.right = rectClient.right - 8;
    rectFrame.top   = rectSubTitle.bottom + 2;
    rectFrame.bottom = rectClient.bottom - sizeXTitle.cy - sizeXLabel.cy - 10;

    penFrame.CreatePen(PS_SOLID, 1, RGB(0,0,0));
    pOldPen = pDC->SelectObject(&penFrame);

    {
        POINT   Point[5];
        Point[0].x = rectFrame.left;
        Point[0].y = rectFrame.top;
        Point[1].x = rectFrame.right;
        Point[1].y = rectFrame.top;
        Point[2].x = rectFrame.right;
        Point[2].y = rectFrame.bottom;
        Point[3].x = rectFrame.left;
        Point[3].y = rectFrame.bottom;
        Point[4].x = rectFrame.left;
        Point[4].y = rectFrame.top;

        pDC->Polyline(Point, 5);
    }

    // X轴线
    m_AxresInfor[0].Ratio = (double)m_AxresInfor[0].Layers * m_AxresInfor[0].UnitValue * 1.0 / rectFrame.Width();
    // 使用字体XLabel
    pOldFont = pDC->SelectObject(&fontAxresLabel[0]);

    for(i=0; i<=m_AxresInfor[0].Layers; ++i)
    {
        // label and line
        pDC->MoveTo(rectFrame.left + i * m_AxresInfor[0].UnitValue / m_AxresInfor[0].Ratio, rectFrame.bottom + 4);
        pDC->LineTo(rectFrame.left + i * m_AxresInfor[0].UnitValue / m_AxresInfor[0].Ratio, rectFrame.bottom - 4);

        pDC->MoveTo(rectFrame.left + i * m_AxresInfor[0].UnitValue / m_AxresInfor[0].Ratio, rectFrame.top + 4);
        pDC->LineTo(rectFrame.left + i * m_AxresInfor[0].UnitValue / m_AxresInfor[0].Ratio, rectFrame.top);

        // label 
        CString     strLabel;
        strLabel.Format("%d", (int)((m_AxresInfor[0].BaseValue + i * m_AxresInfor[0].UnitValue) / (m_AxresInfor[0].Transformer)));

        CSize       sizeTemp;
        sizeTemp = pDC->GetOutputTextExtent(strLabel);

⌨️ 快捷键说明

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