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

📄 playmp3dlg.cpp

📁 WinCE 简单的播放器。MFC写的。以前在PUDN上找到的。怕丢了重新上传下。支持WMA WAV MP3,支持LRC 播放
💻 CPP
📖 第 1 页 / 共 3 页
字号:
 // PLAYMP3Dlg.cpp : implementation file
//

#include "stdafx.h"
#include "PLAYMP3.h"
#include "PLAYMP3Dlg.h"
//#include "OpenFileDlg.h"
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "lrc.h"
#include "fullpathfile.h"


//#define WM_SUSPEND WM_USER+9

extern CString strPath;

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

//COpenFileDlg openfile_dlg;
CFullPathFile openfile_dlg;
/////////////////////////////////////////////////////////////////////////////
// CPLAYMP3Dlg dialog

#define WM_SUSPEND WM_USER+9
#define SLIDER_TIMER   100

#define WM_SET_VOL WM_USER+229

static TCHAR gszBaseInstance[256] = _T("ControlPanel\\Volume");
HKEY g_hkVolume = NULL;//



CPLAYMP3Dlg::CPLAYMP3Dlg(CWnd* pParent /*=NULL*/)
	: CDialog(CPLAYMP3Dlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CPLAYMP3Dlg)
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	mFilterGraph = NULL;
	mSourceFile  = "";
	mSliderTimer = 0;
	b_play_or_pause = true;
	str_lrc = L"";
	
	b_yesLrc = false;
	mp3Info = false;
	b_mp3info = false;
	b_btn_round = true;
	b_beginPlay = false;//最开始不播放
	temp_time = "00:00";
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
CPLAYMP3Dlg::~CPLAYMP3Dlg()
{
	mp3DestroyGraph();
}

void CPLAYMP3Dlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CPLAYMP3Dlg)
	DDX_Control(pDX, IDC_STATE_DIAN, m_StateDian);
	DDX_Control(pDX, IDC_VOL_DIAN, m_VolDian);
	DDX_Control(pDX, IDC_NAMEING, m_Nameing);
	DDX_Control(pDX, IDC_PLAYING, m_Playing);
	DDX_Control(pDX, IDC_PLAYTIME, m_PlayTime);
	DDX_Control(pDX, IDC_LRCNEW, m_NewLrc);
	DDX_Control(pDX, IDC_LIST, m_ListMp3);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CPLAYMP3Dlg, CDialog)
	//{{AFX_MSG_MAP(CPLAYMP3Dlg)
	ON_WM_CTLCOLOR()
	ON_WM_KEYDOWN()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	ON_WM_PAINT()
	ON_WM_ERASEBKGND()
	ON_WM_TIMER()
	ON_WM_CLOSE()
	ON_MESSAGE(WM_SUSPEND,OnSuspend)
	ON_LBN_SELCHANGE(IDC_LIST, OnSelchangeList)
	ON_WM_SETFOCUS()
	ON_WM_HSCROLL()
	ON_BN_CLICKED(IDC_BUTTON1, OnOK)
	ON_WM_MOUSEMOVE()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPLAYMP3Dlg message handlers

BOOL CPLAYMP3Dlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon

	m_StateDian.MoveWindow(150,201,29,20);

	

	
	::SetWindowPos(this->GetSafeHwnd(), HWND_TOPMOST,0, 0, 
		480, 272,SWP_SHOWWINDOW);

	RegOpenKeyEx(HKEY_CURRENT_USER, gszBaseInstance, 0, 0, &g_hkVolume);



	xxx = 0;
	bei = 0;

	m_ListMp3.MoveWindow(41,56,67,162);//
	m_ListMp3.SetItemHeight(NULL ,18);//设LIST列表行间矩
	m_ListMp3.ShowWindow(SW_HIDE);

	kkk_minute= "";
	kkk_second= "";
	b_volume = true;

	CoInitialize(NULL); 
	
	GetVolume();//得到当前声音

	CenterWindow(GetDesktopWindow());	// center to the hpc screen
	// TODO: Add extra initialization here
	m_BackScreenBitmap.LoadBitmap(IDB_BKG);

	SetToolRectangle();
	
	m_listPick = 0;

	BYTE m_Byte[16]={0x33 ,0x26,0xB2 ,0x75, 0x8E ,0x66 ,0xCF, 0x11 ,0xA6 ,0xD9, 0x00, 0xAA ,0x00 ,0x62 ,0xCE, 0x6C};//wma文件头。
	char cBuffer[100];
	memcpy(cBuffer,m_Byte,sizeof(m_Byte));
	strWmaTAG = cBuffer;//得到标准的WMA前字节字符串。


	
	m_Playing.MoveWindow(180,53,220,27);
	m_Nameing.MoveWindow(180,80,220,27);

	
	m_PlayTime.MoveWindow(180,126-6,220,14);
	m_NewLrc.MoveWindow(180,150-4,225,35);

	

	return TRUE;  // return TRUE  unless you set the focus to a control
}




void CPLAYMP3Dlg::DrawInterface(CDC &dc)
{
	CDC  memDC ;
	memDC.CreateCompatibleDC ( &dc ) ;
	
	
	CBitmap*  pBitmap ;		//load all bitmap
	CBitmap*  pOldBitmap ;	//save old bitmap temp
	
	
	/////////////////////////////////////////////////
	//分配bitmap对象内存
	pBitmap = new CBitmap ;
	pBitmap ->LoadBitmap ( IDB_UP_W) ;
	pOldBitmap = memDC.SelectObject ( pBitmap ) ;
	dc.BitBlt ( m_rect[0].TopLeft().x, m_rect[0].TopLeft().y, 158, 158, &memDC, 0, 0, SRCCOPY ) ;
	memDC.SelectObject ( pOldBitmap ) ;
	delete pBitmap ;
	//////////////////////////////////////////////
	
	//.............................................................
	//分配bitmap对象内存
	pBitmap = new CBitmap ;
	pBitmap ->LoadBitmap ( IDB_DOWN_W ) ;
	pOldBitmap = memDC.SelectObject ( pBitmap ) ;
	dc.BitBlt ( m_rect[1].TopLeft().x, m_rect[1].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ;
	memDC.SelectObject ( pOldBitmap ) ;
	delete pBitmap ;
	
	//...............................................................
	//分配bitmap对象内存
	pBitmap = new CBitmap ;
	pBitmap ->LoadBitmap ( IDB_ADD_W ) ;
	pOldBitmap = memDC.SelectObject ( pBitmap ) ;
	dc.BitBlt ( m_rect[2].TopLeft().x, m_rect[2].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ;
	memDC.SelectObject ( pOldBitmap ) ;
	delete pBitmap ;
	//................................................................
	
	//分配bitmap对象内存
	pBitmap = new CBitmap ;
	pBitmap ->LoadBitmap ( IDB_SUB_W ) ;
	pOldBitmap = memDC.SelectObject ( pBitmap ) ;
	dc.BitBlt ( m_rect[3].TopLeft().x, m_rect[3].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ;
	memDC.SelectObject ( pOldBitmap ) ;
	delete pBitmap ;
	//................................................................

	//分配bitmap对象内存
	pBitmap = new CBitmap ;
	
	if (!b_play_or_pause) 
	{
		pBitmap ->LoadBitmap ( IDB_SPAUSE_B ) ;
		pOldBitmap = memDC.SelectObject ( pBitmap ) ;
		
		//将图片COPY到指定的像素位置
		dc.BitBlt ( m_rect[4].TopLeft().x, m_rect[4].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ;

	}
	else
		{		
			pBitmap ->LoadBitmap ( IDB_PLAYMP3_W ) ;
			pOldBitmap = memDC.SelectObject ( pBitmap ) ;
			
			//将图片COPY到指定的像素位置
			dc.BitBlt ( m_rect[4].TopLeft().x, m_rect[4].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ;
		}
		
	memDC.SelectObject ( pOldBitmap ) ;
	delete pBitmap ;
	
	//................................................................
	//分配bitmap对象内存
	pBitmap = new CBitmap ;
	pBitmap ->LoadBitmap ( IDB_STOP_W ) ;
	pOldBitmap = memDC.SelectObject ( pBitmap ) ;
	dc.BitBlt ( m_rect[5].TopLeft().x, m_rect[5].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ;
	memDC.SelectObject ( pOldBitmap ) ;
	//释放bitmap对象内存
	delete pBitmap ;

	///////////////////////////////////////
	//分配bitmap对象内存
	pBitmap = new CBitmap ;
	pBitmap ->LoadBitmap ( IDB_LEFT_W ) ;
	pOldBitmap = memDC.SelectObject ( pBitmap ) ;
	dc.BitBlt ( m_rect[6].TopLeft().x, m_rect[6].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ;
	memDC.SelectObject ( pOldBitmap ) ;
	delete pBitmap ;
	////////////////////////

	
	//////////////////////
	//分配bitmap对象内存
	pBitmap = new CBitmap ;
	pBitmap ->LoadBitmap ( IDB_RIGHT_W ) ;
	pOldBitmap = memDC.SelectObject ( pBitmap ) ;
	dc.BitBlt ( m_rect[7].TopLeft().x, m_rect[7].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ;
	memDC.SelectObject ( pOldBitmap ) ;
	delete pBitmap ;
	/////////////////////////////////////////////////


	//分配bitmap对象内存
	pBitmap = new CBitmap ;
	pBitmap ->LoadBitmap ( IDB_ROUND_W ) ;
	pOldBitmap = memDC.SelectObject ( pBitmap ) ;
	dc.BitBlt ( m_rect[8].TopLeft().x, m_rect[8].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ;
	memDC.SelectObject ( pOldBitmap ) ;
	delete pBitmap ;
	/////////////////////


	//////////////////////
	//分配bitmap对象内存
	pBitmap = new CBitmap ;
	pBitmap ->LoadBitmap ( IDB_CLOSE_W ) ;
	pOldBitmap = memDC.SelectObject ( pBitmap ) ;
	dc.BitBlt ( m_rect[9].TopLeft().x, m_rect[9].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ;
	memDC.SelectObject ( pOldBitmap ) ;
	delete pBitmap ;


	//分配bitmap对象内存
	pBitmap = new CBitmap ;
	pBitmap ->LoadBitmap ( IDB_CANCEL_W ) ;
	pOldBitmap = memDC.SelectObject ( pBitmap ) ;
	dc.BitBlt ( m_rect[10].TopLeft().x, m_rect[10].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ;
	memDC.SelectObject ( pOldBitmap ) ;
	//释放bitmap对象内存
	delete pBitmap ;
	
	//分配bitmap对象内存
	pBitmap = new CBitmap ;
	pBitmap ->LoadBitmap ( IDB_volume ) ;
	pOldBitmap = memDC.SelectObject ( pBitmap ) ;
	dc.BitBlt ( m_rect[11].TopLeft().x, m_rect[11].TopLeft().y, 111, 111, &memDC, 0, 0, SRCCOPY ) ;
	memDC.SelectObject ( pOldBitmap ) ;
	//释放bitmap对象内存
	delete pBitmap ;

	memDC.DeleteDC ()  ;
}

HBRUSH CPLAYMP3Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{

	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
	
	// TODO: Change any attributes of the DC here
	if(nCtlColor == CTLCOLOR_LISTBOX)
	{
	//	pDC->SetBkMode(TRANSPARENT);
		pDC->SetTextColor(RGB(255,255,255));
		pDC->SetBkColor(RGB(0,0,0));
		m_brMine = ::CreateSolidBrush(RGB(0,0,0));
		return m_brMine;
	}
	if(nCtlColor == CTLCOLOR_EDIT)
	{
	//	pDC->SetBkMode(TRANSPARENT);
		pDC->SetTextColor(RGB(250,200,150));
		pDC->SetBkColor(RGB(99,99,99));
		m_brMine = ::CreateSolidBrush(RGB(99,99,99));
		return m_brMine;
	}

	if(nCtlColor == CTLCOLOR_STATIC )
	{
	//	pDC->SetBkMode(TRANSPARENT);
		pDC->SetTextColor(RGB(255,255,255));
		pDC->SetBkColor(RGB(99,99,99));
		m_brMine = ::CreateSolidBrush(RGB(99,99,99));
		return m_brMine;
	}
	// TODO: Return a different brush if the default is not desired
	return hbr;

}

void CPLAYMP3Dlg::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	
	CDialog::OnKeyDown(nChar, nRepCnt, nFlags);
}

void CPLAYMP3Dlg::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default


	for ( int i = 0 ; i < 12 ; i ++ ) 
	{		
		if (  m_rect[i].PtInRect (point)   )
		{									
		
	
				CDC* pDC = GetDC () ;
				CDC  memDC ;
				memDC.CreateCompatibleDC ( pDC ) ;
				
				CBitmap   bmp1 ;
				switch ( i )
				{
				case 0:
					{			
						bmp1.LoadBitmap ( IDB_UP_B ) ;
						CBitmap* pOldBitmap = memDC.SelectObject ( &bmp1 ) ;
						pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), 
							m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ;
						memDC.SelectObject ( pOldBitmap ) ;
						break ;
					}
				case 1:			
					{				
						bmp1.LoadBitmap ( IDB_DOWN_B) ;
						CBitmap* pOldBitmap = memDC.SelectObject ( &bmp1 ) ;
						pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), 
							m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ;
						memDC.SelectObject ( pOldBitmap ) ;
						break ;
					}
				case 2:
					{							
						bmp1.LoadBitmap ( IDB_ADD_B ) ;
						CBitmap* pOldBitmap = memDC.SelectObject ( &bmp1 ) ;
						pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), 
							m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ;
						memDC.SelectObject ( pOldBitmap ) ;
						break ;
					}
				case 3:
					{
						bmp1.LoadBitmap ( IDB_SUB_B) ;
						CBitmap* pOldBitmap = memDC.SelectObject ( &bmp1 ) ;
						pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), 
							m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ;
						memDC.SelectObject ( pOldBitmap ) ;
						break ;
					}
				case 4:
						break ;
				case 5:
					{
						bmp1.LoadBitmap ( IDB_STOP_B ) ;
						CBitmap* pOldBitmap = memDC.SelectObject ( &bmp1 ) ;
						pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), 
							m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ;
						memDC.SelectObject ( pOldBitmap ) ;
						break ;
					}
				case 6:
					{
						bmp1.LoadBitmap ( IDB_LEFT_B ) ;
						CBitmap* pOldBitmap = memDC.SelectObject ( &bmp1 ) ;
						pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), 
							m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ;
						memDC.SelectObject ( pOldBitmap ) ;
						break ;
					}
				case 7:
					{
						bmp1.LoadBitmap ( IDB_RIGHT_B ) ;
						CBitmap* pOldBitmap = memDC.SelectObject ( &bmp1 ) ;
						pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), 
							m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ;
						memDC.SelectObject ( pOldBitmap ) ;
						break ;
					}
		
				case 8:
					{
						bmp1.LoadBitmap ( IDB_ROUND_B ) ;
						CBitmap* pOldBitmap = memDC.SelectObject ( &bmp1 ) ;
						pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), 
							m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ;
						memDC.SelectObject ( pOldBitmap ) ;
						break ;
					}
				case 9:
					{
						bmp1.LoadBitmap ( IDB_CLOSE_B ) ;
						CBitmap* pOldBitmap = memDC.SelectObject ( &bmp1 ) ;
						pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), 
							m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ;
						memDC.SelectObject ( pOldBitmap ) ;
						break ;
					}
				case 10:
					{
						bmp1.LoadBitmap ( IDB_CANCEL_B ) ;
						CBitmap* pOldBitmap = memDC.SelectObject ( &bmp1 ) ;
						pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), 
							m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ;
						memDC.SelectObject ( pOldBitmap ) ;
						break ;
					}
				
				}
				
				memDC.DeleteDC () ;
				ReleaseDC ( pDC ) ;
				
		}
	}

}

void CPLAYMP3Dlg::OnLButtonUp(UINT nFlags, CPoint point) 
{

	if(b_beginPlay)//开始播放后才可能按进度条。
		if (point.x > 151 && point.x < 270 && point.y > 200 &&point.y < 220)
		{
			double duration = 1.;
			mFilterGraph->GetDuration(&duration);
			if (point.x < 151+15)
			{
				double pos = duration * (point.x - 151) / 101;  //-15,是为了,到按纽中间
				mFilterGraph->SetCurrentPosition(pos);
			}
			else
			{
				double pos = duration * (point.x - 151 - 15) / 101;  //-15,是为了,到按纽中间
				mFilterGraph->SetCurrentPosition(pos);

			}
			
		}
		
	CopyBMP(IDB_UP_W,0);
	CopyBMP(IDB_DOWN_W,1);
	CopyBMP(IDB_ADD_W,2);
	CopyBMP(IDB_SUB_W,3);
//	CopyBMP(IDB_PLAYMP3_B,4);
	CopyBMP(IDB_STOP_W,5);
	CopyBMP(IDB_LEFT_W,6);
	CopyBMP(IDB_RIGHT_W,7);
	CopyBMP(IDB_ROUND_W,8);
	CopyBMP(IDB_CLOSE_W,9);
	CopyBMP(IDB_CANCEL_W,10);

	for ( int i = 0 ; i < 12 ; i ++ ) 
	{		
		if ( m_rect[i].PtInRect (point)   )
		{
				switch (i)
				{
					
				case 0:
					Btn_Up();
					break ;
				case 1:
					Btn_Down();
					break;
				case 2:
					Btn_Add();
					break ;
				case 3:	
					Btn_Sub();
					break ;
				case 4:		 
					Btn_Play();
					break ;
				case 5:		
					Btn_Stop();
					break ;
				case 6:			
					Btn_Left();
					break ;
				case 7:		
					Btn_Right();
						break ;
				case 8:		 
					Btn_Round();
					break ;
				case 9:		 
					Btn_Close();
					break ;
				case 10:
					Btn_Cancel();
					break ;
				case 11:
					Btn_NoVolume();
					break;
				}
		}
		
	}


}

void CPLAYMP3Dlg::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	
	DrawInterface(dc);

	if (b_mp3info &&(m_ListMp3.GetCount() > 0))
	{

		//设字体大小
		CFont font;
		LOGFONT lf;
		memset(&lf, 0, sizeof(LOGFONT));
		lf.lfHeight = 18;
		lf.lfWeight = FW_BOLD;//粗体
	//	lf.lfItalic = TRUE;//斜体

		dc.SetTextColor(RGB(255,255,255));
		lstrcpy(lf.lfFaceName, _T("Arial"));
	    VERIFY(font.CreateFontIndirect(&lf));
	    CFont* def_font = dc.SelectObject(&font);
		CString _str_temp_stater = "";
		dc.SetBkMode(TRANSPARENT);//透明
		
		

		_name1 = _name2 = "";

		_name1.Format(L"正在播放: %s",mp3Title);
		_name2.Format(L"演唱: %s",mp3Artist);

		//显示歌曲信息时,如果长度大于,20时。左对齐。反。之中间对齐
		if (GetCStringLen(_name1) > 23) 
		{
//			m_Playing.SetMargins()
			m_Playing.SetWindowText(_name1);
		   //dc.DrawText(_name1,CRect(103,53,291,70),ETO_CLIPPED| DT_LEFT);
		}
		else
			m_Playing.SetWindowText(_name1);
			//dc.DrawText(_name1,CRect(103,53,291,70),ETO_CLIPPED| DT_CENTER);
	
		if (GetCStringLen(_name2) > 23) 
		{
			m_Nameing.SetWindowText(_name2);
			//dc.DrawText(_name2,CRect(102,77,294,96),ETO_CLIPPED| DT_LEFT);
		}
		else
			m_Nameing.SetWindowText(_name2);
			//dc.DrawText(_name2,CRect(102,77,294,96),ETO_CLIPPED| DT_CENTER);
		//显示。状态情况
		dc.SetTextColor(RGB(255,255,255));


	}


}

BOOL CPLAYMP3Dlg::OnEraseBkgnd(CDC* pDC) 
{
	// TODO: Add your message handler code here and/or call default
	
	BITMAP bmpInfo;
	m_BackScreenBitmap.GetBitmap(&bmpInfo);
	
	// Create an in-memory DC compatible with the
	// display DC we're using to paint
	CDC dcMemory;
	dcMemory.CreateCompatibleDC(pDC);
	
	
	// Select the bitmap into the in-memory DC
	CBitmap* pOldBitmap = dcMemory.SelectObject(&m_BackScreenBitmap);
	
	// Find a centerpoint for the bitmap in the client area
	CRect rect;
	GetClientRect(&rect);
	
	// Copy the bits from the in-memory DC into the on-
	// screen DC to actually do the painting. Use the centerpoint
	// we computed for the target offset.
	pDC->BitBlt(0, 0, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory, 
		0, 0, SRCCOPY);
	
	dcMemory.SelectObject(pOldBitmap);
	return TRUE;
}

void CPLAYMP3Dlg::CopyBMP(int m_map, int i)
{
	CDC* pDC = GetDC () ;
	CDC  memDC ;
	memDC.CreateCompatibleDC ( pDC ) ;
	CBitmap bmp,bmp1 ;
	CBitmap* pOldBitmap ;
	bmp1.LoadBitmap ( m_map) ;
	pOldBitmap = memDC.SelectObject ( &bmp1 ) ;
	pDC->BitBlt ( m_rect[i].TopLeft().x, m_rect[i].TopLeft().y, m_rect[i].Width(), 
	m_rect[i].Height(), &memDC, 0, 0, SRCCOPY ) ;
	memDC.SelectObject ( pOldBitmap ) ;
	
	memDC.DeleteDC () ;
	ReleaseDC ( pDC ) ;	
}

void CPLAYMP3Dlg::SetToolRectangle()
{


	m_rect[0].SetRect(41,26,41+68,26+26);//up
	m_rect[1].SetRect(41,218,41+68,218+27);//down
	m_rect[2].SetRect(277,225,277+32,225+32);//+
	m_rect[3].SetRect(312,225,312+32,225+32);//-
	m_rect[4].SetRect(139,225,139+27,225+27);//spause play
	m_rect[5].SetRect(173,225,173+27,225+27);//stop
	m_rect[6].SetRect(207,225,207+27,225+27);//left
	m_rect[7].SetRect(244,225,244+27,225+27);//right
	m_rect[8].SetRect(382,224,382+27,224+27); //round
	m_rect[9].SetRect(388,25,388+21,25+20);//close
	m_rect[10].SetRect(436,221,436+33,221+33);//cancel
	m_rect[11].SetRect(290,201,290+21,201+20);//vol




}


void CPLAYMP3Dlg::Btn_Up()
{
	if (bei ==0 ) return;
	bei --;
	
	int 	n_height = bei * 5;

	m_ListMp3.SetTopIndex(n_height);

}

void CPLAYMP3Dlg::Btn_Down()
{
	int yu;

	int lllll = m_ListMp3.GetCount() ;

	yu = (m_ListMp3.GetCount()/5) * 5    + 1;

	if (bei == (m_ListMp3.GetCount()/5)) 
	{
		return;
	}

	int n_height = 0;
	n_height = (++bei) * 5 ;

	

	if (n_height > m_ListMp3.GetCount() )
	{
		m_ListMp3.SetTopIndex(yu);
	}	
	else
		m_ListMp3.SetTopIndex(n_height);


}

⌨️ 快捷键说明

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