µ±Ç°Î»Öà : 145zÓÎÏ·Õ¾¡¡|¡¡ÈÈѪ´«Ææ¡¡|¡¡¼¼Êõ½Ì³Ì¡¡|¡¡

´«ÆæÎÞÉÁ˸ˢÆÁ¼¼ÊõµÄʵÏÖ

Èȶȣº
µ±ÎÒÃÇÐèÒªÔÚÓû§ÇøÏÔʾһЩͼÐÎʱ£¬ÏȰÑͼÐÎÔÚ¿Í»§Çø»­ÉÏ£¬ËäÈ»ÒѾ­»­ºÃµ«´ËʱÎÒÃÇ»¹ÎÞ·¨¿´µ½£¬»¹ÒªÍ¨¹ý³ÌÐòÖ÷¶¯µØË¢ÐÂÓû§Çø£¬Ç¿ÖÆWindows·¢ËÍÒ»ÌõWM_PAINTÏûÏ¢£¬Õ⽫Òý·¢ÊÓÀàOnDrawº¯Êý¼òµ¥µØ½«ËùÓеÄͼÐζÔÏóÖØ»­£¬ÕâÑù²ÅÍê³ÉÁËͼÐεÄÏÔʾ¹¤×÷£¬µ«ÔÚˢеÄͬʱ»áÒýÆð½ÏÃ÷ÏÔµÄÉÁ˸ÓÈÆäÊǵ±»­ÃæÃæ»ý½Ï´ó¡¢Í¼ÏñÔªËØ¹ý¶àʱÓÈΪÃ÷ÏÔÉõÖÁ´ïµ½ÎÞ·¨Õý³£¹¤×÷µÄµØ²½¡£Òò´Ë£¬ÎÒÃÇÐèÒª×öÏàÓ¦µÄ´¦Àí¡£±¾ÎĽéÉÜÁ˲ÉÓÃÏÈÔÚÄÚ´æÖлæÖÆÍ¼ÐΣ¬È»ºóÔÙ°Ñ»æºÃµÄͼÐÎÒÔλͼ·½Ê½´ÓÄڴ濽±´µ½´°¿Ú¿Í»§µÄÏû³ýË¢ÆÁÉÁ˸µÄÒ»ÖÖ·½·¨¡£

Ò»¡¢ WM_PAINTÏûÏ¢ºÍÎÞÐ§Çø
µ±ÒÔÏÂÇé¿öÖ®Ò»·¢Éúʱ£¬¾ÍÒªÇóÓ¦ÓóÌÐòÒ»¶¨Ë¢ÐÂÆäÓû§ÇøµÄÒ»²¿·Ö»òÈ«²¿£º
1£® ÔÚÓû§Òƶ¯´°¿Ú»òÏÔʾ´°¿Úʱ£¬´°¿ÚÖÐÏÈǰ±»Òþ²ØµÄÇøÓòÖØÐ¿ɼû¡£
2£® Óû§¸Ä±ä´°¿ÚµÄ´óС¡£
3£® ¹ö¶¯´°¿ÚÓû§Çø¡£
4£® ³ÌÐòµ÷ÓÃInvalidateRect»òInvalidateRgnº¯ÊýÏÔʽµØ·¢ËÍÒ»ÌõWM_PAINTÏûÏ¢¡£
´ËʱWindows»áÏò´°¿Úº¯Êý·¢ËÍÒ»ÌõWM_PAINTÏûÏ¢¡£ÁíÍ⣬µ±Windowsɾ³ý¸²¸Ç´°¿Ú²¿·ÖÇøÓòµÄ¶Ô»°¿ò»òÏûÏ¢¿òʱºÍ²Ëµ¥ÏÂÀ­³öÀ´ÓÖ±»ÊÍ·Åʱ´°¿ÚÓû§Çø±»ÁÙʱ¸²¸Ç£¬ÏµÍ³»áÊÔͼ±£´æÏÔÊ¾ÇøÓò£¬µ«ÊDz»Ò»¶¨Äܳɹ¦£¬¿ÉÄÜÏò´°¿Úº¯Êý·¢ËÍÒ»ÌõWM_PAINTÏûÏ¢£¬ÒªÇóÓ¦ÓóÌÐòË¢ÐÂÆäÓû§Çø¡£ÐèҪ˵Ã÷µÄÊÇ£º¹â±ê»òͼ·û´©¹ý´°¿ÚÓû§ÇøÊ±£¬Ò²¿ÉÄܸ²¸ÇÏÔʾÄÚÈÝ£¬µ«ÕâÖÖÇé¿öÏ£¬ÏµÍ³Ò»¶¨Äܱ£Áô²¢»Ö¸´±»¸²¸ÇµÄÇøÓò£¬ËùÒÔ´Ëʱ²¢²»»á·¢ËÍWM_PAINTÏûÏ¢À´ÒªÇóÓ¦ÓóÌÐòȥˢÐÂÆäÏÔÊ¾Çø¡£ÔÚWindows Ó¦ÓóÌÐòµÄ´°¿Úº¯ÊýÖУ¬¶ÔWM_PAINTÏûÏ¢µÄ´¦Àí¾ÍÊÇË¢ÐÂÆäÓû§Çø£¬ÕâÊÇÒ»Ö̶ֹ¨µÄ³ÌÐò½á¹¹¡£ÎªÌá¸ßË¢ÐÂЧÂÊ£¬ÎÒÃÇ¿ÉÒÔֻˢÐÂÓû§ÇøµÄһС²¿·Ö£¬ÆäÓàûÓз¢Éú±ä»¯µÄÎÒÃÇ¿ÉÒÔ²»ÓèˢУ¬´°¿Úº¯Êý¿ÉÒÔͨ¹ýµ÷Óú¯ÊýInvalidateRectÏÔʽµØÊ¹Óû§ÇøÄÚµÄÒ»¸ö¾ØÐÎÎÞЧ¡£¶øÇÒÖ»Óе±´°¿Ú¿Í»§ÇøµÄijһ²¿·ÖʧЧʱ£¬Æä´°¿Úº¯Êý²Å»áÊÕµ½WM_PAINTÏûÏ¢¡£

¶þ¡¢ Ë¢ÆÁÉÁ˸µÄ²úÉúÔ­ÒòÓë½â¾ö·½·¨
µ±¿Í»§ÇøÓÐËù¸Ä¶¯£¬¶øÓÖÒª½«¸Ä¶¯ÏÔʾ³öÀ´£¬¾Í±ØÈ»ÒªÇ¿ÖÆWindows·¢ËÍÒ»ÌõWM_PAINTÏûÏ¢£¬´Ó¶øÒý·¢OnDrawº¯ÊýµÄÖØ»­£¬ÕâÑùËäÍê³ÉÁËͼÐεÄÏÔʾ£¬È´Ò²»áÒýÆð½ÏÃ÷ÏÔµÄÉÁ˸£¬µ±»­ÃæÉÏÊý¾Ý²»ÊǺܶàʱÉв»Ã÷ÏÔ£¬µ±¿Í»§ÇøÓгÉǧÉÏÍò¸öµãµÄʱºòË¢ÐÂÒ»´Î»áÒýÆðÕû·ù»­ÃæµÄ¾çÁÒÌø¶¯£¬ÓÈÆäÊǶÔÓÚÐí¶àʵʱ¼à¿ØÈí¼þºÍʸÁ¿µç×ÓµØÍ¼Èí¼þ£¬´ËÀàÈí¼þͨ³£ÔÚÆÁÄ»É϶¼»á¶¯éü¼¸Ç§¡¢¼¸Íò¸öÒªËØµã£¬ºÜÃ÷ÏÔµ¥¿¿·¢ËÍWM_PAINT ÏûÏ¢Òý·¢OnDraw µÄÖØ»­¸ù±¾Âú×ã²»ÁËʵ¼ÊÐèÇó¡£

ΪÁ˽â¾öÉÏÊöÎÊÌ⣬ÎÒÃÇÐèÒª×öһЩÏàÓ¦µÄ´¦Àí¡£Ê×ÏÈÒªÏȼìÈ¡ÎÞÐ§Çø£¬È»ºó´´½¨Ò»¸öÓëÔ­É豸»·¾³¾ä±úpDCÏà¼æÈݵÄÄÚ´æÉ豸»·¾³£¬Ö®ºó¾Í¿ÉÒÔ²ÉÓÃÔÚÄÚ´æÖлæÖÆÍ¼Ðβ¢°Ñ»æºÃµÄͼÐÎÒÔλͼ·½Ê½´ÓÄڴ濽±´µ½´°¿Ú¿Í»§µÄ·½·¨À´Ïû³ýË¢ÆÁʱÒýÆðµÄÉÁ˸¡£Õ⻹ÐèÒª´´½¨Ò»¸öÓëÔ­É豸»·¾³¾ä±úpDCÏà¼æÈݵġ¢´óСΪÕû¸ö¿Í»§ÇøµÄλͼ¡£È»ºóÔÙʹеÄÉ豸»·¾³dcÓëpDC¾ßÓÐͬÑùµÄÓ³Éä¹ØÏµ£¬½«Î»Í¼Ñ¡ÈëÄÚ´æ»·¾³¡£ÔÙʹdcµÄÕû¸ö¿Í»§Çø¶¼³ÉÎÞÐ§Çø£¬ÔÙ"ÓëÉÏ"Ëù¼ìÈ¡µÄÎÞÐ§Çø£¬Ê¹ÄÚ´æ»·¾³ÓëpDC¼ìÈ¡µÄÎÞÐ§ÇøÏàµÈ¡£Ö®ºó±ã¿ÉÒÔ½øÐлæÍ¼¹¤×÷ÁË£¬»æÍ¼Íê±ÏÖ®ºóÓ¦µ±ÊÍ·ÅËù»ñÈ¡µÄÉ豸»·¾³¾ä±úpDC¡£·ñÔò»áÔì³Éϵͳ×ÊÔ´µÄÀË·Ñ¡£

Èý¡¢ ³ÌÐòʾÀý
±¾Ê¾Àý³ÌÐòͨ¹ý´ò¿ªÈÎÒâ´æµµÎļþ£¬½«ÆäASCIIÂëÂëÖµµ±×÷ÒªÏÔʾµÄÊý¾Ý£¬²¢Í¨¹ýһͼ»­¿Ø¼þ½«ÆäÊý¾ÝÒÔͼÐεÄÐÎʽÒÀ´ÎÏÔʾ³öÀ´¡£±¾³ÌÐòÒª´¦ÀíµÄÊý¾ÝÁ¿½Ï´ó£¬Èç²»²ÉÓñ¾ÎÄËùÊö·½·¨½«»áÓкÜÃ÷ÏÔµÄÉÁ˸¡£

£¨1£© н¨Ò»»ùÓÚCFormViewµÄµ¥ÎĵµÓ¦ÓóÌÐòWaveShower¡£

£¨2£© ÔÚFormÉÏÌí¼ÓÒ»"picture"¿Ø¼þ,ÉèÖÃÆäIDΪIDC_SCREEN¡¢TypeΪRectangle¡¢ColorΪBlack¡£ÔÚ"Extended Styles"ÊôÐÔÒ³ÀïÑ¡ÖÐModal Frame¼ì²é¿ò¡£

£¨3£© Ìí¼ÓÒ»²Ëµ¥"´ò¿ªÊý¾ÝÎļþ"£¬²¢Éú³ÉÆäÏìÓ¦º¯ÊýOnOpenData£¨£©¡£

£¨4£© ÔÚÊÓÀàÖÐÌí¼ÓÈçϳÉÔ±±äÁ¿£º
int m_BufLen; //Êý¾Ý³¤¶È
unsigned char* buffer; //Êý¾Ý»º´æ
int m_dx; //Êý¾ÝÆ«ÒÆÁ¿
int m_DY; //Êý¾ÝÏÔÊ¾ÇøµÄ·ù¶È
CPoint* value; //½«ÒªÏÔʾµÄÊýÖµ
int m_DX; //Êý¾ÝÏÔÊ¾ÇøµÄ¿í¶È
int m_Y0; //Êý¾ÝÏÔÊ¾Çø²ÎÕÕµãλÖÃ
CRect rect; //Êý¾ÝÏÔÊ¾Çø¾ØÐÎ

£¨5£© ÔÚÊÓÀàÖÐÌí¼Óº¯ÊýGetScreenRect()ÓÃÒÔ»ñÈ¡Êý¾ÝÏÔÊ¾ÇøµÄ´óС¼°ÆäËû²ÎÊý£»Ìí¼Óº¯ÊýCleanScreen()Íê³ÉÇå³ýÊý¾ÝÏÔÊ¾ÇøµÄ¹¦ÄÜ£»Ìí¼Óº¯ÊýDrawPoint()ÒÔ±ãÔÚÊý¾ÝÏÔÊ¾Çø»­µã£º

void CWaveShowerView::GetScreenRect()
{
CWnd* pStatic = GetDlgItem(IDC_SCREEN);
pStatic-¡µGetWindowRect(&rect);
ScreenToClient(&rect);
rect.top+=4;
rect.left+=4;
rect.bottom-=4;
rect.right-=4;
m_Y0=(rect.bottom-rect.top)/2+rect.top;
m_DX=rect.Width();
m_DY=rect.Height()/2;
value=new CPoint[m_DX];
}

void CWaveShowerView::CleanScreen()
{
CDC* pDC=GetDC();
CPen pen1(PS_SOLID,1,RGB(0,0,0));
CPen* oldPen1=pDC-¡µSelectObject(&pen1);
for(int i=rect.top;i
{
pDC-¡µMoveTo(rect.left,i);
pDC-¡µLineTo(rect.right,i);
}
pDC-¡µSelectObject(&oldPen1);
CPen pen2(PS_SOLID,1,RGB(0,0,255));
CPen* oldPen2=pDC-¡µSelectObject(&pen2);
pDC-¡µMoveTo(rect.left,m_Y0);
pDC-¡µLineTo(rect.right,m_Y0);
pDC-¡µSelectObject(&oldPen2);
ReleaseDC(pDC);
}

void CWaveShowerView::DrawPoint(CPoint pt, COLORREF color)
{
CDC* pDC=GetDC();
pDC-¡µSetPixel(rect.left+pt.x,m_Y0-pt.y,color);
ReleaseDC(pDC);
}

£¨6£© ÔÚÊÓÀàµÄOnInitialUpdate()³õʼ»¯º¯ÊýÖÐÌí¼Ó´úÂëÒÔ½øÐÐÊý¾ÝÏÔʾµÄ¸÷ÏîǰÆÚ×¼±¸¹¤×÷£¬²¢ÔÚ"´ò¿ªÊý¾ÝÎļþ"²Ëµ¥µÄÏìÓ¦º¯ÊýÖÐÌí¼Ó´úÂëÒÔ¶ÁÈ¡ÎļþµÄÄÚÂë¡£

void CWaveShowerView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()-¡µRecalcLayout();
ResizeParentToFit();
GetScreenRect();
for(int i=0;i
value.x=value.y=0;
SetTimer(0,10,NULL);
}

void CWaveShowerView::OnOpenData()
{
CString FileName="";
CFile file;
CFileDialog dlg(TRUE,"*","*.*",
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
"ËùÓÐÎļþ(*.*)|*.*||",NULL);
if(dlg.DoModal()==IDOK)
{
KillTimer(1);
FileName=dlg.GetPathName();
file.Open(FileName,CFile::modeReadWrite);
m_BufLen=file.GetLength();
buffer= new unsigned char[m_BufLen+m_DX+10];
file.Read(buffer,m_BufLen);
file.Close();
SetTimer(1,10,NULL);
}
}

£¨7£©ÏÂÃæÌí¼ÓµÄ¶¨Ê±Æ÷ÏìÓ¦º¯ÊýÕýÊDZ¾ÎĵÄÖØµã£¬Îª·½±ã¶Ô±ÈÆð¼û£¬±ÊÕßдÁËÁ½¸öOnTimerÏìÓ¦º¯Êý£¬Ç°Ò»¸öÊDzÉÓ󣹿µÄÆÕͨ·½·¨ÃèµãµÄ£¬ÔËÐÐÆðÀ´¿ÉÒÔºÜÃ÷ÏԵؿ´µ½»­ÃæµÄÉÁË¸Ìø¶¯¡£¶øºóÒ»ÖÖÔòÊDzÉÓñ¾ÎÄËùÊö·½·¨²ÉÓõÄÄڴ滭ͼµÄ·½·¨£¬ÔËÐк󼸺õ»­ÃæÎÞÉÁ˸¡£ÏÂÃæ±ãÊÇÁ½¶Î¶Ô±È´úÂëµÄÔ­Â벿·Ö£º

//´úÂëÒ»£ºÓÐÉÁ˸µÄ´úÂë
void CWaveShowerView::OnTimer(UINT nIDEvent)
{
if(nIDEvent==0)
{
CleanScreen();
for(int i=0;i
DrawPoint(value,RGB(0,255,0));
}
if(nIDEvent==1)
{
m_dx+=2;
for(int i=0;i
{
value.x=i;
if(m_dx+i¡´0)
buffer[m_dx+i]=128;
if(m_dx+i¡´-m_DX)
m_dx-=2;
if(m_dx+i¡µm_BufLen)
buffer[m_dx+i]=128;
if(m_dx+i¡µm_BufLen+m_DX)
m_dx-=2;
value.y=m_DY*(buffer[m_dx+i]-128)/256;
}
}
CFormView::OnTimer(nIDEvent);
}

//´úÂë¶þ£ºÎÞÉÁ˸µÄ´úÂë
void CWaveShowerView::OnTimer(UINT nIDEvent)
{
if(nIDEvent==0)
{
CDC* pDC=GetDC();
CDC dc;
CBitmap bitmap;
CBitmap* pOldBitmap;
CRect client;
pDC-¡µGetClipBox(client); //¼ìÈ¡ÎÞÐ§Çø
//´´½¨Ò»¸öÓëpDC¼æÈݵÄÄÚ´æÉ豸»·¾³
if(dc.CreateCompatibleDC(pDC))
{
//´´½¨Ò»ÓëpDC¼æÈݵÄλͼ£¬´óСΪÕû¸ö¿Í»§Çø
if(bitmap.CreateCompatibleBitmap(pDC,rect.Width(), rect.Height()))
{
//ʹdcÓëpDC¾ßÓÐͬÑùµÄÓ³Éä¹ØÏµ
OnPrepareDC(&dc,NULL);
//½«Î»Í¼Ñ¡ÈëÄÚ´æ»·¾³
pOldBitmap=dc.SelectObject(&bitmap);
//ʹdcµÄÕû¸ö¿Í»§Çø¶¼³ÉÎÞÐ§Çø
dc.SelectClipRgn(NULL);
//ÔÙ"ÓëÉÏ"¼ìÈ¡µÄÎÞÐ§Çø£¬Ê¹ÄÚ´æ»·¾³Óë
//pDC¼ìÈ¡µÄÎÞÐ§ÇøÏàµÈ
dc.IntersectClipRect(client);
}
}
CleanScreen();
for(int i=0;i
DrawPoint(value,RGB(0,255,0));
dc.SelectObject(pOldBitmap);
ReleaseDC(pDC);
}
if(nIDEvent==1)
{
m_dx+=2;
for(int i=0;i
{
value.x=i;
if(m_dx+i¡´0)
buffer[m_dx+i]=128;
if(m_dx+i¡´-m_DX)
m_dx-=2;
if(m_dx+i¡µm_BufLen)
buffer[m_dx+i]=128;
if(m_dx+i¡µm_BufLen+m_DX)
m_dx-=2;
value.y=m_DY*(buffer[m_dx+i]-128)/256;
}
}
CFormView::OnTimer(nIDEvent);
}

£¨8£©ËäȻͨ¹ýÉÏÊö¼¸²½¿ÉÒÔʵÏÖËùÓеŦÄÜ£¬µ«ÎªÁË·ÀÖ¹ÄÚ´æÐ¹Â¶ºÍÑø³ÉÁ¼ºÃµÄ±à³Ìϰ¹ß£¬ÎÒÃÇ»¹Ðë×öЩ¹¤×÷£¬ÔÚÊÓÀàµÄ¹¹Ô캯ÊýÖÐÊÍ·ÅÎÒÃÇÔø¾­ÉêÇë¹ýµÄÄÚ´æÒÔ¼°¶¨Ê±Æ÷£º

CWaveShowerView::~CWaveShowerView()
{
delete[] value;
KillTimer(0);
KillTimer(1);
}

ËÄ¡¢ ±àÒëÔËÐÐ
±àÒëÔËÐд˳ÌÐò£¬Í¨¹ý²Ëµ¥Ñ¡È¡ÐèÒªÏÔʾµÄÎļþ£¨ÈÎÒâÎļþ¾ù¿É£©£¬ÈçÔÚ¶¨Ê±Æ÷ÏìÓ¦´úÂëÖвÉÓõÄÊǵÚÒ»ÖÖ´úÂ룬Ôò»á¿´µ½Êý¾ÝÏÔʾµÄͬʱ°éËæ×ÅÃ÷ÏÔµÄÉÁ˸¶ø²ÉÓúóÒ»ÖÖ´úÂë±àÂëÔò»áºÜƽÎȵĽ«Êý¾ÝÏÔʾ³öÀ´¡£

½áÂÛ£º±¾ÎĽéÉܵÄÕâÖÖ·½·¨ÊÊÓÃÓÚ¸÷ÖÖÇ£³¶µ½Êý×éÊý¾ÝͼÐÎÏÔʾµÄ³ÌÐò£¬±ÈÈç¼à¿ØÈí¼þ¡¢Êý¾Ý·ÖÎöÈí¼þ¡¢²âÁ¿Èí¼þµÈµÈ£¬¾ßÓй㷺µÄÓ¦ÓÃǰ¾°¡£