Wednesday, May 19, 2004

Draw graphic in memory, then copy to screen in VC++

Wizard in VC++.net? Properites->several buttons (event)
This example add one button on menu, popup a window to show graphic.
Create one more class "CDrawTest" based on Dialog, OnTimer, OnPaint: use Properties. Pop window, use: CDrawTest dlg; dlg.DoModal(); in view.cpp file (may include drawtest.h).

void CDrawTest::OnTimer(UINT nIDEvent)
{
CRect rect;

// IDC_COORD is the field for drawing
CWnd* pWnd = GetDlgItem(IDC_COORD);

//get the handler of picture window
pWnd->GetClientRect(&rect);

pDC = pWnd->GetDC();
pWnd->Invalidate();
pWnd->UpdateWindow();

//draw in memory
CBitmap memBitmap;
CBitmap* pOldBmp = NULL;

//create memory device
memDC.CreateCompatibleDC(pDC);
memBitmap.CreateCompatibleBitmap(pDC,rect.right,rect.bottom);
pOldBmp = memDC.SelectObject(&memBitmap);
memDC.BitBlt rect.left,rect.top,rect.right,rect.bottom,pDC,0,0,SRCCOPY);

//draw pic
DrawWave(&memDC);

//copy mem to screen
pDC->BitBlt rect.left,rect.top,rect.right,rect.bottom,&memDC,0,0,SRCCOPY);

memDC.SelectObject(pOldBmp);
memDC.DeleteDC();
memBitmap.DeleteObject();

CDialog::OnTimer(nIDEvent);
}
/*************************************/
// draw pic
void CDrawTest::DrawWave(CDC *pDC)
{
CRect rect;
CString str;
int i;
int m_left,m_top,m_right,m_bottom;
int m_Interval = (m_High - m_Low)/10;
if (m_Interval < m_interval =" 1;" pwnd =" GetDlgItem(IDC_COORD);">GetClientRect(&rect);
pDC->Rectangle(&rect);
m_left = rect.left+10;
m_top = rect.top+10;
m_right = rect.right-10;
m_bottom = rect.bottom-20;
int m_IntervalPan = (m_right - m_left)/11;
if (m_IntervalPan < m_intervalpan ="1;" ppenred =" new">CreatePen(PS_SOLID,1,RGB(255,0,0));
// create pen
CPen* pPenBlue = new CPen;
// blue pen
pPenBlue->CreatePen(PS_SOLID,1,RGB(0,0, 255));
// create pen
CPen* pPenGreen = new CPen;
// green pen
pPenGreen->CreatePen(PS_DOT,1,RGB(0,255,0));

// choose red pen and save old pen
CGdiObject* pOldPen = pDC->SelectObject(pPenRed);

// draw axis
pDC->MoveTo(m_left,m_top);
// vertical
pDC->LineTo(m_left,m_bottom);
// horizontal
pDC->LineTo(m_right,m_bottom);

// x-measure number
for(i=0;i<10;i++)>TextOut(m_left+i*m_IntervalPan,m_bottom+3,str);
}
str.Format(_T("%d"),m_High);
pDC->TextOut(m_left+10*m_IntervalPan,m_bottom+3,str);

// x-measure grid
for (i = m_left; i <>MoveTo(m_right-5,m_bottom-5);
pDC->LineTo(m_right,m_bottom);
pDC->LineTo(m_right-5,m_bottom+5);
// x-arrow ...

// green Y grid
pDC->SelectObject(pPenGreen);
int iTemp = (m_bottom - m_top)/5;
for (i = 1; i <= 5; i++) { pDC->MoveTo(m_left,m_bottom - i*iTemp);
pDC->LineTo(m_right,m_bottom - i*iTemp);
}

// ..........blue pen.
pDC->SelectObject(pPenBlue);
for (i = m_Low; i <= m_High; i=i+3) {//draw wave } // restore former pen pDC->SelectObject(pOldPen);
delete pPenRed;
delete pPenBlue;
delete pPenGreen;
return;
}

No comments:

Post a Comment