www.pudn.com > MCIWnd_MediaPlayer.rar > MediaPlayerDlg.cpp
// MediaPlayerDlg.cpp : 实现文件
//
#include "stdafx.h"
#include "MediaPlayer.h"
#include "MediaPlayerDlg.h"
#include ".\mediaplayerdlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// 用于应用程序“关于”菜单项的 CAboutDlg 对话框
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// 对话框数据
enum { IDD = IDD_ABOUTBOX };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
END_MESSAGE_MAP()
// CMediaPlayerDlg 对话框
CMediaPlayerDlg::CMediaPlayerDlg(CWnd* pParent /*=NULL*/)
: CDialog(CMediaPlayerDlg::IDD, pParent)
, menuHeight(0)
, borderWidth(0)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
memDC.m_hDC=NULL;
}
void CMediaPlayerDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST2, fileList);
DDX_Control(pDX, IDC_STATE, m_state);
DDX_Control(pDX, IDC_VOL, m_vol);
DDX_Control(pDX, IDC_PLAY, m_play);
DDX_Control(pDX, IDC_STOP, m_stop);
DDX_Control(pDX, IDC_FORM, m_form);
DDX_Control(pDX, IDC_NEXT, m_next);
DDX_Control(pDX, IDC_PCITURE1, m_picture);
}
BEGIN_MESSAGE_MAP(CMediaPlayerDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP
ON_WM_TIMER()
ON_WM_SIZE()
ON_WM_SIZING()
ON_BN_CLICKED(IDC_PLAY, OnBnClickedPlay)
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_STATE, OnNMReleasedcaptureState)
ON_MESSAGE(WM_CHANGEPOS,ShowPos)
ON_MESSAGE(WM_FINISH,Finish)
ON_MESSAGE(WM_NEXT,Next)
ON_BN_CLICKED(IDC_STOP, OnBnClickedStop)
ON_WM_CONTEXTMENU()
ON_NOTIFY(NM_RELEASEDCAPTURE, IDC_VOL, OnNMReleasedcaptureVol)
ON_COMMAND(ID_RATE, OnRate)
ON_COMMAND(ID_OPEN, OnOpen)
ON_COMMAND(ID_EXIT, OnExit)
ON_LBN_DBLCLK(IDC_LIST2, OnLbnDblclkList2)
ON_BN_CLICKED(IDC_NEXT, OnBnClickedNext)
ON_BN_CLICKED(IDC_FORM, OnBnClickedForm)
ON_STN_CLICKED(IDC_PCITURE1, OnStnClickedPciture1)
ON_WM_ERASEBKGND()
ON_WM_MOUSEMOVE()
ON_WM_CTLCOLOR()
ON_COMMAND(ID_SKIN, OnSkin)
ON_COMMAND(ID_DEL, OnDel)
ON_COMMAND(ID_ADD, OnAdd)
END_MESSAGE_MAP()
// CMediaPlayerDlg 消息处理程序
BOOL CMediaPlayerDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// 将\“关于...\”菜单项添加到系统菜单中。
// IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标
CRect rect1,rect2;
this->GetClientRect(rect1);
this->GetWindowRect(rect2);
menuHeight=rect2.Height()-rect1.Height();
borderWidth=rect2.Width()-rect1.Width();
CMyPlayer::RegisterWndClass(AfxGetInstanceHandle());
SetTimer(1,500,NULL);
//m_state.SetRange(0,100);
// TODO: 在此添加额外的初始化代码
//SetTimer(1,1000,NULL);
//player.Init(this);
//player.Init(m_hWnd);
//player.OpenFile("发牌.wmv");
m_player.Create(_T("CMyPlayer"),"MyPlayer",WS_CHILD|WS_VISIBLE,CRect(0,0,rect1.Width()-ListWidth,rect1.Height()-BottomMarg),this,1001);
//m_player.Max();
skin="背景.bmp";
LayOut();
SetButtonState();
//
m_play.SetActiveTextColor(RGB(255,0,0));
m_play.SetNormalTextColor(RGB(255,255,0));
m_play.SetMouseDownTextColor(RGB(0,0,255));
m_stop.SetActiveTextColor(RGB(255,0,0));
m_stop.SetNormalTextColor(RGB(255,255,0));
m_stop.SetMouseDownTextColor(RGB(0,0,255));
m_form.SetActiveTextColor(RGB(255,0,0));
m_form.SetNormalTextColor(RGB(255,255,0));
m_form.SetMouseDownTextColor(RGB(0,0,255));
m_next.SetActiveTextColor(RGB(255,0,0));
m_next.SetNormalTextColor(RGB(255,255,0));
m_next.SetMouseDownTextColor(RGB(0,0,255));
//fileList.Invalidate();
HBITMAP hBmp=(HBITMAP)LoadImage(NULL,skin,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
//fileList.m_bmp.Attach(hBmp);
//fileList.Refresh();
fileList.SetColor(RGB(255,255,0),RGB(255,255,255));
fileList.Invalidate();
return TRUE; // 除非设置了控件的焦点,否则返回 TRUE
}
void CMediaPlayerDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// 如果向对话框添加最小化按钮,则需要下面的代码
// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,
// 这将由框架自动完成。
void CMediaPlayerDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文
SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0);
// 使图标在工作矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
/*CClientDC dc(this);
CRect rect;
this->GetClientRect(rect);
HBITMAP hBmp=(HBITMAP)LoadImage(NULL,skin,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
CDC memDC;
CBitmap bitmap;
BITMAP bmp;
bitmap.Attach(hBmp);
//bitmap.LoadBitmap(IDB_BITMAP_BACK);
bitmap.GetObject (sizeof(BITMAP),&bmp);
memDC.CreateCompatibleDC (&dc);
memDC.SelectObject (bitmap);
//pDC->BitBlt (0,0,bmp.bmWidth ,bmp.bmHeight ,&memDC,0,0,SRCCOPY);
dc.SetStretchBltMode(STRETCH_DELETESCANS);
dc.StretchBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);*/
}
//player.Draw();
}
//当用户拖动最小化窗口时系统调用此函数取得光标显示。
HCURSOR CMediaPlayerDlg::OnQueryDragIcon()
{
return static_cast(m_hIcon);
}
LRESULT CMediaPlayerDlg::OnMyMessage(WPARAM lParam,LPARAM wParam)
{
//OnPaint();
//this->Invalidate();
//this->UpdateWindow();
//RedrawWindow(0,0,RDW_INVALIDATE | RDW_UPDATENOW|RDW_FRAME);
//WM_SYNCPAINT
//Invalidate();
//WM_NCPAINT
//SendMessage(WM_SYNCPAINT);
//this->OnNcPaint();
return LRESULT();
}
void CMediaPlayerDlg::OnTimer(UINT nIDEvent)
{
//m_state.SetPos(m_player.state.cur);
CDialog::OnTimer(nIDEvent);
}
void CMediaPlayerDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
LayOut();
}
void CMediaPlayerDlg::OnSizing(UINT fwSide, LPRECT pRect)
{
/*if(()||())
return;*/
if(pRect->right-pRect->leftright=pRect->left+RightMarg+borderWidth;
if(pRect->bottom-pRect->topbottom=pRect->top+BottomMarg+menuHeight;
CDialog::OnSizing(fwSide, pRect);
}
void CMediaPlayerDlg::LayOut(void)
{
CRect rect;
GetClientRect(rect);
if(menuHeight==0)
return;
m_player.MoveWindow(0,0,rect.Width()-ListWidth,rect.Height()-BottomMarg);
if(rect.Height()>=BottomMarg)//还有地方显示列表(高度)
{
fileList.MoveWindow(rect.Width()-ListWidth,0,ListWidth,rect.Height()-BottomMarg);
}
int modify=3;
m_play.MoveWindow(ButtonLeft,rect.Height()-ButtonHeight-modify,ButtonWidth,ButtonHeight);
m_stop.MoveWindow(ButtonLeft+ButtonWidth*1+ButtonBetween*1,rect.Height()-ButtonHeight-modify,ButtonWidth,ButtonHeight);
m_form.MoveWindow(ButtonLeft+ButtonWidth*2+ButtonBetween*2,rect.Height()-ButtonHeight-modify,ButtonWidth,ButtonHeight);
m_next.MoveWindow(ButtonLeft+ButtonWidth*3+ButtonBetween*3,rect.Height()-ButtonHeight-modify,ButtonWidth,ButtonHeight);
m_vol.MoveWindow(ButtonLeft+ButtonWidth*4+ButtonBetween*4,rect.Height()-ButtonHeight-modify,77,26);
m_state.MoveWindow(ButtonLeft,rect.Height()-ButtonHeight-26-modify,rect.Width(),26);
m_picture.MoveWindow(rect.Width()-20,rect.Height()-20-modify,20,20);
m_play.ReSet();
m_form.ReSet();
m_next.ReSet();
m_stop.ReSet();
m_state.DrawTransparent(1);
m_vol.DrawTransparent(1);
Invalidate();
}
void CMediaPlayerDlg::OnBnClickedPlay()
{
if(fileList.GetCount()==0)
return;
if(m_player.state.ps==Stopped||m_player.state.ps==Pausing)
{
if(m_player.state.ps==Pausing)
m_player.PlayFromState();
else
{
int i=fileList.GetCurSel();
m_player.Play(m_playList.GetCur(i));
m_vol.SetRange(0,1000);
m_state.SetRange(0,m_player.state.total);
}
m_play.SetWindowText("暂停");
}
else if(m_player.state.ps==Playing)
{
m_player.Pause();
m_play.SetWindowText("播放");
}
SetButtonState();
}
void CMediaPlayerDlg::OnNMReleasedcaptureState(NMHDR *pNMHDR, LRESULT *pResult)
{
// TODO: 在此添加控件通知处理程序代码
m_player.state.cur=m_state.GetPos();
if(m_player.state.ps==Playing)
m_player.PlayFromState();
*pResult = 0;
}
LRESULT CMediaPlayerDlg::ShowPos(WPARAM wParam, LPARAM lParam)
{
if(!m_state.m_busy)
m_state.SetPos(wParam);
return LRESULT();
}
LRESULT CMediaPlayerDlg::Next(WPARAM wParam, LPARAM lParam)
{
int ti= fileList.GetCurSel();
if(m_player.state.order==0)
{
ti=ti+1;
ti%=fileList.GetCount();
fileList.SetCurSel(ti);
}
else if(m_player.state.order==1)
{
ti=rand()%fileList.GetCount();
fileList.SetCurSel(ti);
}
this->OnBnClickedPlay();
return LRESULT();
}
LRESULT CMediaPlayerDlg::Finish(WPARAM wParam, LPARAM lParam)
{
if(m_player.state.order==2)
{
m_player.state.cur=0;
m_player.PlayFromState();
}
else
{
Next(0,0);
}
SetButtonState();
return LRESULT();
}
void CMediaPlayerDlg::OnBnClickedStop()
{
m_player.Stop();
m_play.SetWindowText("播放");
SetButtonState();
}
void CMediaPlayerDlg::SetButtonState(void)
{
if(m_player.state.ps==Stopped)
{
m_stop.EnableWindow(false);
m_play.SetWindowText("播放");
}
else
m_stop.EnableWindow(true);
LONG tl=m_player.GetVolume();
m_vol.SetPos(tl);
if(fileList.GetCount()>0)
{
m_form.EnableWindow();
m_next.EnableWindow();
}
else
{
m_form.EnableWindow(false);
m_next.EnableWindow(false);
}
}
void CMediaPlayerDlg::OnContextMenu(CWnd* pWnd, CPoint point)
{
CMenu menu;
menu.LoadMenu(IDR_MAIN_MENU);
if(m_player.KeepRate)
menu.GetSubMenu(0)->AppendMenu(MF_CHECKED|MF_STRING,ID_RATE,"保持纵横比");
else
menu.GetSubMenu(0)->AppendMenu(MF_STRING,ID_RATE,"保持纵横比");
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTBUTTON|TPM_RIGHTBUTTON,point.x,point.y,this);
/*menu.CreatePopupMenu();
if(m_player.KeepRate)
menu.AppendMenu(MF_CHECKED|MF_STRING,ID_RATE,"保持纵横比");
else
menu.AppendMenu(MF_STRING,ID_RATE,"保持纵横比");
menu.TrackPopupMenu(TPM_LEFTBUTTON|TPM_RIGHTBUTTON,point.x,point.y,pWnd);*/
}
void CMediaPlayerDlg::OnNMReleasedcaptureVol(NMHDR *pNMHDR, LRESULT *pResult)
{
LONG tl=m_vol.GetPos();
TRACE("select pos is:%d\n",m_vol.GetPos());
LONG it=m_player.SetVolumn(tl);
it=m_player.GetVolume();
*pResult = 0;
}
void CMediaPlayerDlg::OnRate()
{
m_player.KeepRate=1-m_player.KeepRate;
m_player.ModifyWindow();
}
void CMediaPlayerDlg::OnOpen()
{
char* pc = new char[NAMEBUF];
static char szFilter[]="Audio(*.mp3;*.wav;*.mid)|*.mp3;*.wav;*.mid|Video(*.avi;*.mpg;*.wmv)|*.avi;*.mpg;*.wmv;|Picture(*.bmp;*.jpg;*.gif)|*.bmp;*.jpg;*.gif|AllSupport|*.mp3;*.wav;*.mid;*.avi;*.mpg;*.wmv;*.bmp;*.jpg;*.gif||";
CFileDialog dlg(true,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT| OFN_ENABLESIZING,szFilter);
dlg.m_ofn.lpstrFile =pc;
dlg.m_ofn.nMaxFile = NAMEBUF;
dlg.m_ofn.lpstrFile[0] = NULL;
if(dlg.DoModal()==IDOK)
{
m_playList.Reset();
POSITION ps=dlg.GetStartPosition();
if(ps==NULL)
return;
CString ts;
int count;
while(ps!=NULL)
{
count=m_playList.AddFile(dlg.GetNextPathName(ps));
}
//TRACE("%d\n",count);
fileList.ResetContent();
POSITION pt=m_playList.fileList.GetHeadPosition();
while(pt!=NULL)
{
fileList.AddString(((PlayNode)m_playList.fileList.GetNext(pt)).fileName);
}
fileList.SetCurSel(0);
}
delete [] pc;
}
void CMediaPlayerDlg::OnExit()
{
m_player.DestroyWindow();
OnOK();
}
void CMediaPlayerDlg::OnLbnDblclkList2()
{
OnBnClickedStop();
OnBnClickedPlay();
}
void CMediaPlayerDlg::OnBnClickedNext()
{
OnBnClickedStop();
Next(0,0);
/*int i=fileList.GetCurSel();
m_player.PlayNew(m_playList.GetCur(i));
m_vol.SetRange(0,1000);
m_state.SetRange(0,m_player.state.total);*/
SetButtonState();
}
void CMediaPlayerDlg::OnBnClickedForm()
{
int ti= fileList.GetCurSel();
if(m_player.state.order==0)
{
ti=ti-1;
if(ti<0)
ti=fileList.GetCount()-1;
else
ti%=fileList.GetCount();
fileList.SetCurSel(ti);
}
else if(m_player.state.order==1)
{
ti=rand()%fileList.GetCount();
fileList.SetCurSel(ti);
}
OnBnClickedStop();
OnBnClickedPlay();
}
void CMediaPlayerDlg::OnStnClickedPciture1()
{
m_player.state.order+=1;
m_player.state.order%=3;
static_bmp.DeleteObject();
switch(m_player.state.order)
{
case 0:
static_bmp.LoadBitmap(IDB_BITMAP1);
break;
case 1:
static_bmp.LoadBitmap(IDB_BITMAP2);
break;
case 2:
static_bmp.LoadBitmap(IDB_BITMAP3);
break;
}
m_picture.SetBitmap((HBITMAP)static_bmp);
}
BOOL CMediaPlayerDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
/* CRect rect;
this->GetClientRect(rect);
HBITMAP hBmp=(HBITMAP)LoadImage(NULL,skin,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
CDC memDC;
CBitmap bitmap;
BITMAP bmp;
bitmap.Attach(hBmp);
bitmap.GetObject (sizeof(BITMAP),&bmp);
memDC.CreateCompatibleDC (pDC);
memDC.SelectObject (bitmap);
pDC->SetStretchBltMode(STRETCH_DELETESCANS);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
return 1;*/
CRect rect;
this->GetClientRect(rect);
if(memDC.m_hDC==NULL){
memDC.CreateCompatibleDC (pDC);
HBITMAP hBmp=(HBITMAP)LoadImage(NULL,skin,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
if(hBmp==NULL)
return CDialog::OnEraseBkgnd(pDC);
bitmap.Attach(hBmp);
bitmap.GetObject (sizeof(BITMAP),&bmp);
memDC.SelectObject (bitmap);
}
pDC->SetStretchBltMode(STRETCH_DELETESCANS);
pDC->StretchBlt(0,0,rect.Width(),rect.Height(),&memDC,0,0,bmp.bmWidth,bmp.bmHeight,SRCCOPY);
return 1;
//return CDialog::OnEraseBkgnd(pDC);
}
void CMediaPlayerDlg::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
//m_play.AutoLoad(IDC_PLAY,this);
CDialog::OnMouseMove(nFlags, point);
}
HBRUSH CMediaPlayerDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}
void CMediaPlayerDlg::OnSkin()
{
static char szFilter[]="BMP(*.bmp)|*.bmp|";
CFileDialog dlg(true,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT| OFN_ENABLESIZING,szFilter);
if(dlg.DoModal()==IDOK)
{
//CDC *pDC=GetDC();
skin=dlg.GetPathName();
HBITMAP hBmp=(HBITMAP)LoadImage(NULL,skin,IMAGE_BITMAP,0,0,LR_CREATEDIBSECTION|LR_DEFAULTSIZE|LR_LOADFROMFILE);
bitmap.DeleteObject();
bitmap.Attach(hBmp);
bitmap.GetObject (sizeof(BITMAP),&bmp);
memDC.SelectObject (bitmap);
m_play.ReSet();
m_form.ReSet();
m_next.ReSet();
m_stop.ReSet();
//this->RedrawWindow();
//m_vol.DrawTransparent(0);
//m_state.DrawTransparent(0);
//
m_state.DrawTransparent(1);
m_vol.DrawTransparent(1);
fileList.ReSet();
Invalidate();
//this->UpdateWindow();
//this->Invalidate();m_play.Refresh();
}
}
void CMediaPlayerDlg::OnDel()
{
int i=fileList.GetCurSel();
if(i<0)
return;
else
{
m_playList.Del(i);
fileList.DeleteString(i);
}
}
void CMediaPlayerDlg::OnAdd()
{
char* pc = new char[NAMEBUF];
static char szFilter[]="Audio(*.mp3;*.wav;*.mid)|*.mp3;*.wav;*.mid|Video(*.avi;*.mpg;*.wmv)|*.avi;*.mpg;*.wmv;|Picture(*.bmp;*.jpg;*.gif)|*.bmp;*.jpg;*.gif|AllSupport|*.mp3;*.wav;*.mid;*.avi;*.mpg;*.wmv;*.bmp;*.jpg;*.gif||";
CFileDialog dlg(true,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT|OFN_ALLOWMULTISELECT| OFN_ENABLESIZING,szFilter);
dlg.m_ofn.lpstrFile =pc;
dlg.m_ofn.nMaxFile = NAMEBUF;
dlg.m_ofn.lpstrFile[0] = NULL;
if(dlg.DoModal()==IDOK)
{
//m_playList.Reset();
POSITION ps=dlg.GetStartPosition();
if(ps==NULL)
return;
CString ts;
int count;
while(ps!=NULL)
{
count=m_playList.AddFile(dlg.GetNextPathName(ps));
}
TRACE("%d\n",count);
fileList.ResetContent();
POSITION pt=m_playList.fileList.GetHeadPosition();
while(pt!=NULL)
{
fileList.AddString(((PlayNode)m_playList.fileList.GetNext(pt)).fileName);
}
fileList.SetCurSel(0);
}
delete [] pc;
}