软件开发平台实验报告

课程设计报告

课程名称: 软件开发平台与工具 任课教师: 姓 名: 学 号:

1. 引言

1.1. 课程设计项目

1.2. 背景简介 从编程之初,便免不了和方法,类,接口之类的东西打交道。久而久之,自然会对此进行总结,由此而产生了开发平台。而今中国的程序员之中,有很大一部分都是编一些企业MIS、政府MIS之类的程序。其主要工作就是对数据进行一下增删改查的操作,对MIS系统做一些基础的管理而已。软件开发平台有两种平台模式:一种是传统的C/S架构模式,一种是现在流行的B/S架构模式。B/S架构模式是随着互联网的流行,自然又要求以互联网为基础,把这些都网络化,以实现网络资源共享,而不是传统的单机模式。这便激发了软件开发者的创造力,形成了软件开发平台的B/S架构模式(web开发平台)。对于web开发平台,我的个人理解是:

1.以web2.0为基础,基于互联网的B/S架构的软件。它本身也是一个软件,只不过不是最终的软件产品,而是用于二次开发的软件。

2.用于实现各类业务系统,如CRM、MIS、ERP、HIS、OA等等的开发。web开发平台本身就是一个二次开发平台,他不同于诸如eclipse等这样的开发工具,需要写大量的代码来完成各个业务模块,二次开发平台只需要设计好自己的数据结构,进行一些简单的配置、拖拉等操作就可以完成业务系统的开发。

3.能够快速的实现各种报表包括复杂的图表报表的设计制作,传统的编码式开发需要自己去编写想要的各种报表,而运用开发平台就简单多了,可以很轻松的配置出各种报表。

使用web开发平台的目的是为了实现资源共享、节约开发成本、提高开发效率、缩短开发周期。而如今的开发平台大都采用非编码的方式或者是极少编码的方式,这样正好达到了目的。有的甚至可以减少80%的代码量,可见效率会提高多少。

从国内代表性的软件开发平台中[1],我们可以看出这一类产品的大致脉络,亚思捷的TNT平台:TNT平台的核心优势在于低成本的个性化,他可以同时向客户提供T——业务系统模板,即OA、CRM、文档管理、信息门户、在线考试等标准化的应用系统;N——开源组件包,即上述应用系统的源代码;T——开

发工具,即基于微软Jupiter平台的快速开发工具,开发者可以通过界面属性设定的方法来完成对业务系统的快速开发,自动化生成C#和JAVA的二种语言的系统。显然,TNT中的两个“T”是业务的重点,而杀手锏则是低价。

其他厂家的软件开发平台与上述三种均大同小异,都是提供“标准化+行业化+个性化”的应用模式。

从中我们看出,这些软件开发平台确实都非常具有我们在上文中提到的技术共性,另外我们还都具有一个共同点,那就是他们既提供软件开发平台,又提供基于该平台生成的各种应用系统,两种产品相辅相成。这种模式也是软件开发平台销售的主流模式。

1.3.相关概念 Unified Modeling Language (UML)又称统一建模语言或标准建模语言,是始于19xx年一个OMG标准,它是一个支持模型化和软件系统开发的图形化语言,为软件开发的所有阶段提供模型化和可视化支持,包括由需求分析到规格,到构造和配置。 面向对象的分析与设计(OOA&D,OOAD)方法的发展在80年代末至90年代中出现了一个高潮,UML是这个高潮的产物。它不仅统一了Booch、Rumbaugh和Jacobson的表示方法,而且对其作了进一步的发展,并最终统一为大众所接受的标准建模语言。

UML是一种定义良好、易于表达、功能强大且普遍适用的建模语言。它融入了软件工程领域的新思想、新方法和新技术。它的作用域不限于支持面向对象的分析与设计,还支持从需求分析开始的软件开发的全过程。

1.4.编写目的

经过本学期对软件开发平台与工具的学习,对其进行初步的掌握,通过课程设计(音乐播放器)编程,对所学内容进行实际应用并发现学习中存在的问题,也是对自己学习工作的检验和测试,在撰写报告的过程中能够更深刻的了解软件开发平台与工具的理念通过这份文档来记录实践过程中遇到的问题以及改善的方法。现在对整个过程加以认识、记录和总结,留下经验,汲取教训。为以后的其他工作积攒经验,为以后遇到相同的问题和从事类似项目奠定坚实的基础,以便以后有资可寻、有底可查,增长个人见识。

2部分产品代码解析

2.1简介 本音乐播放器使用visual C++6.0自带的Active Movie Control Object控件,来建立自己的多媒体播放器。并以千千静听为模板,实现播放器最小化托盘的功能。

Active Movie Control Object

微软公司推出的ActiveMovie控件用于多媒体程序设计的控件,该控件提供非常完善的音频和视频媒体文件的播放功能。其能支持多种文件格式:例如最常见的WAV文件、AVI文件、MPEG压缩格式的VCD视频文件等,它都可以正常地进行播放。这个控件可根据文件的后缀名自动判别设备的类型,滞后能完成相应的控制。因为本实例需要提供多媒体支持,所以使用Active Movie控件是很好的一个选择。

事实上,很多优秀的多媒体应用程序,其内部的多媒体播放就是利用Active Movie控件来实现。通过这个控件用户只需要精心地设计应用程序的用户界面,就可以开发出功能齐全、外观漂亮、具有相当水准的媒体播放器。

1. Active Movie的注册方法

现在使用的VC++6.0自带Active Movie控件版本一般都是Active Movie3。用户注册这个控件之前,再VC++6.0集成开发环境中是无法找到Active Movie3控件的。所以应首先注册这个控件。步骤及方法为:

(1) 单击“开始”|“运行”按钮。

(2) 在弹出的对话框中输入“regsvr32 msdxm.ocx”。

(3) 在VC++6.0的集成开发环境候中的菜单栏下执行如下操作“”

Project->Add to Project->Components and Controls->Registered ActiveX Controls”将弹出空间添加对话框,选择其中的

ActiveMovieControl Object,Inser,单击OK按钮。

(4) 将空间拖放到对话框上。

2. ActiveMovie的属性及方法

(1) ActiveMovie的特有属性

CurrentState:指示控件的状态(stopped、paused、running) DisplayMode:显示模式(时间方式、帧方式)

FileName:指定该控件要操作的源文件的完整名字

Rate:指示媒体流的回放率

ReadyState:指示控件状态,是否已经装入源文件

SelectionStart:指示播放媒体流的开始位置

SelectionEnd:指示播放媒体流的结束位置

CurrentPosition:指示播放媒体流的当前位置

Volume:设置音量

(2) ActiveMovie的方法

ActiveMovie控件常用的方法有RUN/STOP/PAUSE这3个。分别控制流媒体的播放、停止和暂停。使用时直接调用它们即可。其他与通用方法如Drag、Move、SetFocus等,该控件也支持。此外ActiveMovie还有一些特有事件的处理方法。

DisplayModeChange:当DisplayMode属性值发生变化时触发 OpenComplete:当源文件完全载入时触发

PositionChange:当流媒体的当前位置改变时触发

ReadyStateChange:当控件的ReadyState属性值改变时触发 StateChange:当播放器的状态改变时触发

Error:处理控件的出错事件

此外ActiveMovie控件还有一些属性操作方法,通过这些方法获取或者设置ActiveMovie控件的各个属性值。ActiveMovie获取属性值的方法如下:

GetCurrentPosition:获取播放器的播放进度

GetAuthor:获取作者信息

GetBalance:获取声音平衡值

GetFileName:获取操作的源文件的完整名字

GetDisplayMode:获取当期显示模式

GetRate:获取媒体流的回放率

GetVolume:获取当前音量

2.2音乐播放器最小化到托盘的实现方法

当前流行的播放器大大多都支持最小化到托盘事件ain.suoyi本播放器也仿照这些播放器实现这个功能。

1.最小化到托盘的基础

把应用程序最小化到托盘的基本原理就是将应用程序的主窗体隐藏,然后在托盘中绘制应用程序的图标。

Shell_NotifyIcon()函数负责向系统传递消息,以添加、修改或删除托盘区的图标。它的原型如下:

WINSHELLAPI BOOL WINAPI Shell_NotifyIcon(

DWORD dwMessage,

PNOTIFYICONDATA pnid

);

该函数返回的是一个布鲁尔值,失败则返回0,返回非0则成功。函数有以下两个参数。

(1)dwMessage:标示该函数的应用功能,是添加、删除,还是修改图标。如果是添加,则它的值为NIM__ADD;如删除则是NIM_DELETE;而修改则是NIM_MODIFY。

(2)pnid:程序最小化到托盘的图标信息结构体

2.实现最小化托盘

最小化按钮及Hide按钮处理函数OnHide(),将播放器最小化到托盘。

void CMusicPlayerDlg::OnHide()

{

NOTIFYICONDATA nid;

nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);

nid.hWnd=this->m_hWnd;

nid.uID=IDR_MAINFRAME;

nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;

nid.uCallbackMessage=WM_MUSICPLAYER;//自定义的消息名

nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME));

strcpy(nid.szTip,"MusicPlayer");//信息提示条为“计划任务提醒” Shell_NotifyIcon(NIM_ADD,&nid);//在托盘区添加图标

ShowWindow(SW_HIDE);//隐藏主窗口

}

最小化到托盘的图标ID为IDR_MAINFRAME。它的消息为WM_MUSICPLAYEAR。当鼠标移过图标时提示信息为“MusicPlayer”

3.处理托盘图标消息

添加最小化到托盘图标发送的自定义消息WIN_MUSICPLAYER的映射。

ON_MESSAGE(WM_MSICPLAYER,OnShowMusicPlayer) 添加它的处理函数为OnShowMusicPlayer(),代码如下:

LRESULT CMusicPlayerDlg::OnShowMusicPlayer(WPARAM wParam, LPARAM lParam)

{

if(wParam!=IDR_MAINFRAME)

return 1;

switch(lParam)

{

case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭”

{

窗口(已

menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this);

//资源回收 HMENU hmenu=menu.Detach(); menu.DestroyMenu(); //隐藏),将程序结束。 menu.AppendMenu(MF_STRING,MY_OPEN,"Open"); menu.AppendMenu(MF_STRING,MY_PLAY,"Play"); menu.AppendMenu(MF_STRING,MY_PAUSE,"Pause"); menu.AppendMenu(MF_STRING,MY_STOP,"Stop"); menu.AppendMenu(MF_STRING,MY_QUITE,"Close"); //确定弹出式菜单的位置 LPPOINT lpoint=new tagPOINT; ::GetCursorPos(lpoint);//得到鼠标位置 CMenu menu; menu.CreatePopupMenu();//声明一个弹出式菜单 //增加菜单项“关闭”,点击则发送消息WM_DESTROY给主

} delete lpoint;

break;

case WM_LBUTTONDBLCLK://双击左键的处理

{

}

break;

}

return 0;

}

this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿

3总结 软件开发平台是一种软件开发工具,以通用技术架构为基础,集成常用建模 工具、二次开发包、基础解决方案等而成。软件开发工具是很方便地把一种编程 语言代码化并编译执行的工具。现在的软件开发工具逐渐显出智能化、网络化、 一体化、标准化的趋势。对于很多企业来说,软件开发平台只被定义为信息化工 具,但成功进行过企业信息化建设的 CIO 们会对软件开发平台有着更为正确的 理解,那就是软件开发平台不仅是信息化工具,更是管理思想的沉淀。

随着在企业中发挥出的作用被逐步肯定, 目前软件开发平台在国内信息化领 域也占据着越来越重要的位置, 其应用已经成为一种趋势。 相对于传统开发模式, 许多软件开发平台具有很多显著优势,包括优化产品基础架构,提升软件开发质 量;减少编码率,提高开发效率,提升开发的灵活性;可以充分关注客户需求, 实现按需定制;实现配置组件的标准化,提升产品稳定性和兼容性;提升企业开 发能力, 降低后期维护的时间和成本等, 可以使开发者有更多时间关注客户需求, 在项目的需求、设计、开发、测试、部署、维护等各个阶段均可提供强大的支持。 这些都使得,软件开发平台在企业眼中成为非常给力的信息化工具。

软件开发特别是大型软件是一项浩大的工程,需要几个人、十几个人、几十 个人甚至几百个人合作开发几个月、十几个月甚至几年。要保证系统的协调性、 统一性和连续性,就需要在开发之前制定严格、详细的开发规范。开发规范的制

定需要花费一定的时间和精力,但是"磨刀不误砍柴功",它相当于把今后开发过程 中开发人员都要遇到的问题提前做了一个考虑。有了开发规范,在后续的开发过 程中,设计人员就不必每次考虑如何为一个字段命名,编程人员也不必去想某个程 序的结构和布局应当 怎样,测试人员也有了判断程序对错的标准。开发规范在项 目开发工作中起着事前约定的作用,需要所有开发人员共同遵守。它约束开发人 员的行为和设计、编程风格,使不同子系统和模块的设计、编程人员达成默契,以 便形成整个系统的和谐步调和统一风格,也便于今后的系统维护和扩展工作。

通过这学期的学习,使我们对软件开发平台与工具有了更深入的了解。小组 分工式的作业给我们提供了很好的交流学习氛围,让大家能够在交流中学习,在 学习中互相了解。但由于自己的水平和经验不足,还存在着一定的问题。还要继 续努力,争取获得更大成绩。

4产品完整代码

// MusicPlayerDlg.cpp : implementation file

//

#include "stdafx.h"

#include "MusicPlayer.h"

#include "MusicPlayerDlg.h"

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

#define WM_MUSICPLAYER (WM_USER + 102)

/////////////////////////////////////////////////////////////////////////////

// CAboutDlg dialog used for App About

class CAboutDlg : public CDialog

{

public:

CAboutDlg();

// Dialog Data

//{{AFX_DATA(CAboutDlg)

enum { IDD = IDD_ABOUTBOX };

//}}AFX_DATA

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CAboutDlg)

protected:

virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL

// Implementation

protected:

//{{AFX_MSG(CAboutDlg)

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)

{

//{{AFX_DATA_INIT(CAboutDlg)

//}}AFX_DATA_INIT

}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)

{

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CAboutDlg)

//}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)

//{{AFX_MSG_MAP(CAboutDlg)

// No message handlers

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

///////////////////////////////////////////////////////////////////////////// // CMusicPlayerDlg dialog

CMusicPlayerDlg::CMusicPlayerDlg(CWnd* pParent /*=NULL*/)

: CDialog(CMusicPlayerDlg::IDD, pParent)

{

//{{AFX_DATA_INIT(CMusicPlayerDlg)

//}}AFX_DATA_INIT

// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_bOpen = false;

m_bRepeat = false;

m_changed = 0;

m_titleRect.left = 0;

m_time = 0;

m_curPos = 0;

m_state = 3;

m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);

}

void CMusicPlayerDlg::DoDataExchange(CDataExchange* pDX) {

CDialog::DoDataExchange(pDX);

//{{AFX_DATA_MAP(CMusicPlayerDlg)

DDX_Control(pDX, IDC_SLIDER2, m_voice);

DDX_Control(pDX, IDC_SLIDER1, m_ctlSlider);

DDX_Control(pDX, IDC_ACTIVEMOVIECONTROL1, m_ActiveMovie); //}}AFX_DATA_MAP

}

BEGIN_MESSAGE_MAP(CMusicPlayerDlg, CDialog)

//{{AFX_MSG_MAP(CMusicPlayerDlg)

ON_WM_SYSCOMMAND()

ON_WM_PAINT()

ON_WM_QUERYDRAGICON()

ON_WM_CTLCOLOR()

ON_BN_CLICKED(MY_OPEN, OnOpen)

ON_BN_CLICKED(MY_PLAY, OnPlay)

ON_BN_CLICKED(MY_PAUSE, OnPause)

ON_BN_CLICKED(MY_STOP, OnStop)

ON_BN_CLICKED(MY_REPEAT, OnRepeat)

ON_BN_CLICKED(MY_HIDE, OnHide)

ON_BN_CLICKED(MY_EXIT, OnExit)

ON_BN_CLICKED(MY_QUITE, OnExit)

ON_BN_CLICKED(MY_MIN, OnHide)

ON_WM_LBUTTONDOWN()

ON_WM_TIMER()

ON_WM_CANCELMODE()

ON_WM_VSCROLL()

//}}AFX_MSG_MAP

ON_MESSAGE(WM_MUSICPLAYER, OnShowMusicPlayer) END_MESSAGE_MAP()

///////////////////////////////////////////////////////////////////////////// // CMusicPlayerDlg message handlers

BOOL CMusicPlayerDlg::OnInitDialog()

{

CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. 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); } } // 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_bmBack.DeleteObject(); m_brBack.DeleteObject(); m_bmBack.LoadBitmap(IDB_BACK); m_brBack.CreatePatternBrush(&m_bmBack); // TODO: Add extra initialization here HRGN c; HRGN r1; int x,y,i = 0; x = 37; y = 115; COLORREF ForeColor,hoverColor,downColor; ForeColor = RGB(50, 50, 50); hoverColor = RGB(120, 120, 120); downColor = RGB(180, 180, 120); HRGN min; min = CreateRectRgn(0,0,20,15); m_Min.Create("_", WS_CHILD | WS_VISIBLE, CPoint(320, 7), min, this, MY_MIN,

1,ForeColor,downColor ,hoverColor , GetSysColor(COLOR_BTNFACE));

m_Max.Create("||", WS_CHILD | WS_VISIBLE | WS_DISABLED, CPoint(346, 7), min, this, MY_MAX, 1,ForeColor,downColor ,hoverColor , GetSysColor(COLOR_BTNFACE));

m_Quite.Create("X", WS_CHILD | WS_VISIBLE, CPoint(372, 7), min, this, MY_QUITE, 1,ForeColor,downColor ,hoverColor , GetSysColor(COLOR_BTNFACE));

c = CreateRectRgn(8, 0, 55, 31);

r1 = CreateEllipticRgn(48, 8, 15 + 48, 15 + 8);

CombineRgn(c, c, r1, RGN_OR);

m_Open.Create("Open", WS_CHILD | WS_VISIBLE, CPoint(x + 48*(i++), y), c, this, MY_OPEN, 1,ForeColor,downColor ,hoverColor , GetSysColor(COLOR_BTNFACE));

r1 = CreateEllipticRgn(0, 8, 15, 15 + 8);

CombineRgn(c, c, r1, RGN_DIFF);

m_Play.Create("Play", WS_CHILD | WS_VISIBLE, CPoint(x + 48*(i++), y), c, this, MY_PLAY, 1, ForeColor, downColor ,hoverColor, GetSysColor(COLOR_BTNFACE));

m_Pause.Create("Pause", WS_CHILD | WS_VISIBLE, CPoint(x + 48*(i++), y ), c, this, MY_PAUSE, 1, ForeColor, downColor ,hoverColor, GetSysColor(COLOR_BTNFACE));

m_Stop.Create("Stop",WS_CHILD |WS_VISIBLE, CPoint(x + 48*(i++), y ), c, this, MY_STOP, 1, ForeColor, downColor ,hoverColor, GetSysColor(COLOR_BTNFACE));

m_Repeat.Create("Repeat", WS_CHILD |WS_VISIBLE, CPoint(x + 48*(i++), y), c, this, MY_REPEAT, 1, ForeColor, downColor ,hoverColor, GetSysColor(COLOR_BTNFACE));

m_Hide.Create("Hide", WS_CHILD |WS_VISIBLE, CPoint(x + 48*(i++), y), c, this, MY_HIDE, 1, ForeColor, downColor ,hoverColor, GetSysColor(COLOR_BTNFACE));

c = CreateRectRgn(8, 0, 63, 31);

r1 = CreateEllipticRgn(0, 8, 15, 15 + 8);

CombineRgn(c, c, r1, RGN_DIFF);

m_Exit.Create("Exit", WS_CHILD |WS_VISIBLE, CPoint(x + 48*(i++), y ), c, this, MY_EXIT, 1, ForeColor, downColor ,hoverColor, GetSysColor(COLOR_BTNFACE));

DeleteObject(c);

DeleteObject(r1);

m_ctlSlider.SetRange(0,1000);

m_voice.SetRange(0,10);

m_voice.SetPos(7);

SetWindowText("TT-Play");

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

}

void CMusicPlayerDlg::OnSysCommand(UINT nID, LPARAM lParam)

{

if ((nID & 0xFFF0) == IDM_ABOUTBOX)

{

CAboutDlg dlgAbout;

dlgAbout.DoModal();

}

else

{

CDialog::OnSysCommand(nID, lParam);

}

}

// If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework.

void CMusicPlayerDlg::OnPaint()

{

CPaintDC dc(this); // device context for painting

if(m_bOpen)

{

CSize size;

CDC memDC,maskDC;

CString str;

COLORREF fileColor,timeColor,infoColor;

size = dc.GetTextExtent(m_strMusic);

fileColor = RGB(156,196,94);

timeColor = RGB(255,0,0);

infoColor = RGB(105,121,148);

m_titleRect.left -= 1;

if(m_titleRect.left < -size.cx)

{

m_titleRect.left = size.cx;

m_changed = 0;

Invalidate();

}

m_titleRect.top = 0;

m_titleRect.right = size.cx;

m_titleRect.bottom = size.cy;

memDC.CreateCompatibleDC(&dc);

maskDC.CreateCompatibleDC(&dc);

CBitmap bkbmp;

bkbmp.CreateCompatibleBitmap(&dc,size.cx,size.cy);

memDC.SelectObject(&bkbmp);

maskDC.SelectObject(&bkbmp);

memDC.SetTextColor(RGB(50,250,160));

memDC.DrawText(m_strMusic, &m_titleRect, DT_BOTTOM);

maskDC.SetTextColor(RGB(0,0,0));

maskDC.DrawText(m_strMusic, &m_titleRect, DT_BOTTOM);

dc.SetBkMode(TRANSPARENT);

dc.SetTextColor(fileColor);

if(m_titleRect.left >= 0)

{

dc.BitBlt(30 + m_titleRect.left,30,size.cx m_titleRect.left ,size.cy,&maskDC,m_titleRect.left,0,MERGEPAINT);

dc.BitBlt(30 + m_titleRect.left,30,size.cx m_titleRect.left,size.cy,&memDC,m_titleRect.left,0,SRCAND);

}

else

{

dc.BitBlt(30,30,size.cx + m_titleRect.left,size.cy,&maskDC,0,0,MERGEPAINT); dc.BitBlt(30,30,size.cx + m_titleRect.left,size.cy,&memDC,0,0,SRCAND); }

dc.SetTextColor(infoColor);

if(m_bRepeat)

{

switch(m_state)

{

case 1:

str.Format("状态: 播放 - Repeat");

break;

case 2:

str.Format("状态: 暂停 - Repeat");

break;

case 3:

str.Format("状态: 播放 - Repeat");

break;

}

}

else

{ switch(m_state)

{

case 1:

str.Format("状态: 播放 - No Repeat");

break; - -

case 2: str.Format("状态: 暂停 - No Repeat"); break; case 3:

str.Format("状态: 停止 - No Repeat");

break;

}

}

dc.TextOut(30,48,str);

dc.SetTextColor(fileColor);

str.Format("%s - %s", m_Author,m_title);

dc.TextOut(30,65,str);

dc.SetTextColor(timeColor);

str.Format("%02d:%02d:%02d/%02d:%02d:%02d",

int(m_curPos) / 360,int(m_curPos) / 60,

int(m_curPos )% 60, int(m_time) / 360,

int(m_time) / 60, int(m_time) % 60);

dc.TextOut(260,50,str);

}

}

// The system calls this to obtain the cursor to display while the user drags // the minimized window.

HCURSOR CMusicPlayerDlg::OnQueryDragIcon()

{

return (HCURSOR) m_hIcon;

}

HBRUSH CMusicPlayerDlg::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_DLG)

return m_brBack;

// TODO: Return a different brush if the default is not desired

return hbr;

}

void CMusicPlayerDlg::OnOpen()

{

char szFileFilter[] = "Mp3 File(*.mp3)|*.mp3|"

"Wma File(*.wma)|*.wma|" "Video File(*.dat)|*.dat|" "Wave File(*.wav)|*.wav|" "AVI File(*.avi)|*.avi|" "Movie File(*.mov)|*.mov|" "Media File(*.mmm)|*.mmm|" "Mid File(*.mid;*,rmi)|*.mid;*.rmi|" "MPEG File(*.mpeg)|*.mpeg|"

"All File(*.*)|*.*||";//文件类型过滤 CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,szFileFilter); if(dlg.DoModal()==IDOK)

{

CString PathName=dlg.GetPathName();

PathName.MakeUpper();

m_ActiveMovie.SetFileName(PathName);

m_strMusic = dlg.GetFileName();

//m_ActiveMovie.get

m_bOpen = true;

OnPlay();

m_state = 3;

Invalidate();

}

}

void CMusicPlayerDlg::OnPlay()

{

m_ActiveMovie.Run();//播放文件

SetTimer(0,20,NULL);//设置定时器

m_Author = m_ActiveMovie.GetAuthor();

m_title = m_ActiveMovie.GetTitle();

m_copyRight = m_ActiveMovie.GetCopyright();

m_description = m_ActiveMovie.GetDescription();

double a = m_ActiveMovie.GetSelectionEnd();

double b = m_ActiveMovie.GetSelectionStart();

//Duration

m_time = m_ActiveMovie.GetDuration();

m_ctlSlider.SetRange(b,a);

long Volume=m_ActiveMovie.GetVolume();

m_voice.SetPos(Volume /(-150));

m_state = 1;

Invalidate();

}

void CMusicPlayerDlg::OnPause()

{

m_ActiveMovie.Pause();

m_state = 2;

Invalidate();

}

void CMusicPlayerDlg::OnStop()

{

m_ActiveMovie.Stop();

m_state = 3;

Invalidate();

}

void CMusicPlayerDlg::OnRepeat()

{

m_bRepeat = 1 - m_bRepeat;

Invalidate();

}

void CMusicPlayerDlg::OnHide()

{

NOTIFYICONDATA nid;

nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);

nid.hWnd=this->m_hWnd;

nid.uID=IDR_MAINFRAME;

nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;

nid.uCallbackMessage=WM_MUSICPLAYER;//自定义的消息名称

nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); strcpy(nid.szTip,"MusicPlayer");//信息提示条为“计划任务提醒”

Shell_NotifyIcon(NIM_ADD,&nid);//在托盘区添加图标

ShowWindow(SW_HIDE);//隐藏主窗口

}

void CMusicPlayerDlg::OnExit()

{

// TODO: Add your control notification handler code here

NOTIFYICONDATA nid;

nid.cbSize=(DWORD)sizeof(NOTIFYICONDATA);

nid.hWnd=this->m_hWnd;

nid.uID=IDR_MAINFRAME;

nid.uFlags=NIF_ICON|NIF_MESSAGE|NIF_TIP ;

nid.uCallbackMessage=WM_MUSICPLAYER;//自定义的消息名称

nid.hIcon=LoadIcon(AfxGetInstanceHandle(),MAKEINTRESOURCE(IDR_MAINFRAME)); strcpy(nid.szTip,"MusicPlayer");//信息提示条为“计划任务提醒”

Shell_NotifyIcon(NIM_DELETE,&nid);//在托盘区添加图标

ShowWindow(SW_HIDE);//隐藏主窗口

OnOK();

}

void CMusicPlayerDlg::OnLButtonDown(UINT nFlags, CPoint point)

{

// TODO: Add your message handler code here and/or call default

if (point.y < 26)

PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y)); CDialog::OnLButtonDown(nFlags, point);

}

void CMusicPlayerDlg::OnTimer(UINT nIDEvent)

{

m_changed++;

m_curPos = m_ActiveMovie.GetCurrentPosition();

m_ctlSlider.SetPos(m_curPos);

CRect rect;

rect.left = 30;

rect.top = 30;

rect.right = 398;

rect.bottom = 50;

CRgn rgn1,rgn2;

rgn1.CreateRectRgnIndirect(&rect);

rgn2.CreateRectRgn(260,50,350,65);

rgn1.CombineRgn(&rgn1,&rgn2,RGN_OR);

InvalidateRgn(&rgn1,2);

if(m_curPos ==0 && m_bRepeat)

m_ActiveMovie.Run();

else if(m_curPos ==0 )

m_state = 3;

CDialog::OnTimer(nIDEvent);

}

void CMusicPlayerDlg::OnCancelMode()

{

CDialog::OnCancelMode();

}

void CMusicPlayerDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) {

// TODO: Add your message handler code here and/or call default

int value = m_voice.GetPos();

m_ActiveMovie.SetVolume( -1 * value * 150);

CDialog::OnVScroll(nSBCode, nPos, pScrollBar);

}

LRESULT CMusicPlayerDlg::OnShowMusicPlayer(WPARAM wParam, LPARAM lParam) {

if(wParam!=IDR_MAINFRAME)

return 1;

switch(lParam)

{

case WM_RBUTTONUP://右键起来时弹出快捷菜单,这里只有一个“关闭” {

LPPOINT lpoint=new tagPOINT;

::GetCursorPos(lpoint);//得到鼠标位置

CMenu menu;

menu.CreatePopupMenu();//声明一个弹出式菜单

//增加菜单项“关闭”,点击则发送消息WM_DESTROY给主窗口(已 //隐藏),将程序结束。

menu.AppendMenu(MF_STRING,MY_OPEN,"Open");

menu.AppendMenu(MF_STRING,MY_PLAY,"Play");

menu.AppendMenu(MF_STRING,MY_PAUSE,"Pause");

menu.AppendMenu(MF_STRING,MY_STOP,"Stop");

menu.AppendMenu(MF_STRING,MY_QUITE,"Close");

//确定弹出式菜单的位置

menu.TrackPopupMenu(TPM_LEFTALIGN,lpoint->x,lpoint->y,this); //资源回收

HMENU hmenu=menu.Detach();

menu.DestroyMenu();

delete lpoint;

}

break;

case WM_LBUTTONDBLCLK://双击左键的处理

{

this->ShowWindow(SW_SHOW);//简单的显示主窗口完事儿

}

break;

}

return 0; }

相关推荐