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

📄 wavsvw.cpp

📁 西安电子科技大学王亚民教授所著《组态软件设计与开发》附带的源代码07章
💻 CPP
字号:
// wavsvw.cpp : implementation of the CWaveSampleView class
//

#include "stdafx.h"
#include "waves.h"
#include "wave.h"
#include "wavesdoc.h"
#include "wavsvw.h"

#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CWaveSampleView

IMPLEMENT_DYNCREATE(CWaveSampleView, CView)

BEGIN_MESSAGE_MAP(CWaveSampleView, CView)
    //{{AFX_MSG_MAP(CWaveSampleView)
    ON_COMMAND(ID_FILE_SAVE, OnFileSave)
    ON_COMMAND(ID_FILE_SAVE_AS, OnFileSaveAs)
    ON_COMMAND(ID_FILE_PLAY, OnFilePlay)
    ON_COMMAND(ID_FILE_STOP, OnFileStop)
    ON_WM_LBUTTONDBLCLK()
    ON_WM_HSCROLL()
    ON_WM_KEYDOWN()
    ON_WM_ERASEBKGND()
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CWaveSampleView construction/destruction

CWaveSampleView::CWaveSampleView()
{
    m_iWndSamples = 0;
    m_iFirstSample = 0;
    m_iNumSamples = 0;
}

CWaveSampleView::~CWaveSampleView()
{
}

BOOL CWaveSampleView::PreCreateWindow(CREATESTRUCT& cs)
{
    cs.style |= WS_HSCROLL;
    return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CWaveSampleView drawing

void CWaveSampleView::OnInitialUpdate()
{
    CWavesDoc* pDoc = GetDocument();
    CWave* pWave = pDoc->GetWave();
    m_iNumSamples = pWave->GetNumSamples();
    SetScrollRange(SB_HORZ, 0, 1000);
}


void CWaveSampleView::OnDraw(CDC* pDC)
{
    CWavesDoc* pDoc = GetDocument();
    CWave* pWave = pDoc->GetWave();
    CRect rcWnd;
    GetClientRect(&rcWnd);
    m_iWndSamples = rcWnd.right; // 1 pixel per sample

    // Create an off-screen buffer so we can update without flicker.
    CDC dcMem;
    dcMem.CreateCompatibleDC(pDC);
    CBitmap bmMem;
    bmMem.CreateCompatibleBitmap(pDC, rcWnd.right, rcWnd.bottom);
    CBitmap* pbmMemOld = dcMem.SelectObject(&bmMem);
    CBrush brBk;
    brBk.CreateSolidBrush(GetSysColor(COLOR_WINDOW));
    dcMem.FillRect(&rcWnd, &brBk);

    // Draw the axis.
    dcMem.MoveTo(0, rcWnd.bottom / 2);
    dcMem.LineTo(rcWnd.right, rcWnd.bottom / 2);

    // Draw the samples.
    CPen penRed (PS_SOLID, 1, RGB(255,0,0));
    CPen* ppenOld = dcMem.SelectObject(&penRed);
    int iMax = min(m_iWndSamples, pWave->GetNumSamples() - m_iFirstSample);
    int iYPrev = -1;
    for (int i = 0; i < iMax; i++) {
        int iSample = pWave->GetSample(i+m_iFirstSample);
        int y = rcWnd.bottom / 2 - (iSample * (rcWnd.bottom / 2) / 32768);
        if (iYPrev != -1) {
            dcMem.MoveTo(i-1, iYPrev);
            dcMem.LineTo(i, y);
        }
        iYPrev = y; 
    }
    dcMem.SelectObject(ppenOld);

    // Update the screen.
    pDC->BitBlt(rcWnd.left, rcWnd.top,
                rcWnd.right - rcWnd.left, rcWnd.bottom - rcWnd.top,
                &dcMem,
                0, 0,
                SRCCOPY);

    // Tidy up.
    dcMem.SelectObject(pbmMemOld);
}



/////////////////////////////////////////////////////////////////////////////
// CWaveSampleView diagnostics

#ifdef _DEBUG
void CWaveSampleView::AssertValid() const
{
    CView::AssertValid();
}

void CWaveSampleView::Dump(CDumpContext& dc) const
{
    CView::Dump(dc);
}

CWavesDoc* CWaveSampleView::GetDocument() // Non-debug version is inline
{
    ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CWavesDoc)));
    return (CWavesDoc*) m_pDocument;
}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CWaveSampleView message handlers

void CWaveSampleView::OnFileSave()
{
    AfxMessageBox("Not implemented");
}

void CWaveSampleView::OnFileSaveAs()
{
    AfxMessageBox("Not implemented");
}

void CWaveSampleView::OnFilePlay()
{
    CWavesDoc* pDoc = GetDocument();
    CWave* pWave = pDoc->GetWave();
    ASSERT(pWave);
    if (!pWave->Play()) {
        AfxMessageBox("Failed to play");
    }
}

void CWaveSampleView::OnFileStop()
{
    CWavesDoc* pDoc = GetDocument();
    CWave* pWave = pDoc->GetWave();
    ASSERT(pWave);
    pWave->Stop();
}

void CWaveSampleView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
    OnFilePlay();
}

// TODO: scroll the DC for speed later.
void CWaveSampleView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
    switch (nSBCode) {
    case SB_LEFT:
        m_iFirstSample = 0;
        break;
    
    case SB_RIGHT:
        m_iFirstSample = m_iNumSamples - m_iWndSamples;
        break;
    
    case SB_LINELEFT:
        m_iFirstSample -= 10;
        break;
        
    case SB_PAGELEFT:    
        m_iFirstSample -= m_iWndSamples;
        break;

    case SB_LINERIGHT:
        m_iFirstSample += 10;
        break;

    case SB_PAGERIGHT:
        m_iFirstSample += m_iWndSamples;
        break;
    
    case SB_THUMBPOSITION:
    case SB_THUMBTRACK:
        m_iFirstSample = nPos 
                     * (m_iNumSamples - m_iWndSamples)
                     / 1000;
        break;

    default:
        return;
    }

    if (m_iFirstSample < 0) m_iFirstSample = 0;
    if (m_iWndSamples >= m_iNumSamples) {
        m_iFirstSample = 0;
    } else if (m_iFirstSample >= m_iNumSamples - m_iWndSamples) {
        m_iFirstSample = m_iNumSamples - m_iWndSamples;
    }

    int iPos;
    if (m_iWndSamples >= m_iNumSamples) {
        iPos = 0;
    } else {
        iPos = (1000 * m_iFirstSample)
             / (m_iNumSamples - m_iWndSamples);
    }
    SetScrollPos(SB_HORZ, iPos, TRUE);
    Invalidate(TRUE);
}

void CWaveSampleView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
    switch (nChar) {
    case VK_HOME:
        OnHScroll(SB_LEFT, 0, NULL);
        break;

    case VK_END:
        OnHScroll(SB_RIGHT, 0, NULL);
        break;

    case VK_LEFT:
        OnHScroll(SB_LINELEFT, 0, NULL);
        break;

    case VK_RIGHT:
        OnHScroll(SB_LINERIGHT, 0, NULL);
        break;

    case VK_PRIOR:
        OnHScroll(SB_PAGELEFT, 0, NULL);
        break;

    case VK_NEXT:
        OnHScroll(SB_PAGERIGHT, 0, NULL);
        break;
    
    default:    
        CView::OnKeyDown(nChar, nRepCnt, nFlags);
        break;
    }
}

// Stub out WM_ERASEBKGND handler so it won't do anything.
BOOL CWaveSampleView::OnEraseBkgnd(CDC* pDC)
{
    return TRUE;
}

⌨️ 快捷键说明

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