MFC课程设计报告

时间:2024.4.29

计算机科学与工程学院

项目报告

设计名称:  Windows程序设计》综合项目  

设计题目:        音频播放器的制作         

学生学号:          xxxxxxxxxx            

专业班级:     xxxxxxxxxxxxxxxxxx    

学生姓名:            xxxxxxxx             

学生成绩:                                

指导教师(职称):      xxxxxxxxxxxxxx    

课题工作时间:         xxxxxxxxxxxxxxxx   


目录

摘  要... I

Abstract. II

第一章  课题背景和概述... 1

1.1  课题背景... 1

1.1.1 音频播放器简介... 1

1.1.2 目的和意义... 1

1.2  课题概述... 1

1.2.1 功能简介... 1

1.2.2 主要工作和理论依据... 1

第二章  设计简介及设计方案论述... 3

2.1 需求分析... 3

2.2 系统功能及结构简介... 3

2.2.1 系统功能... 3

2.2.2 系统结构... 3

第三章  详细设计... 4

3.1 界面设计... 4

3.1.1 播放器界面设计... 4

3.1.2 按钮上的位图显示... 5

3.2 各模块功能设计... 6

3.2.1 各按钮功能的实现... 6

3.2.2 最小化到托盘... 7

3.2.3 进度条显示... 7

第四章  设计结果及分析... 8

4.1 运行结果显示... 8

4.1.1打开文件并播放... 8

4.1.2 最小化... 8

4.1.3 歌词显示... 9

4.2 结果分析和不足... 9

总   结... 10

致   谢... 11

参考文献... 12

附   录... 13

摘  要

音频播放器,是目前用户选择播放任意格式的音频文件的软件,如酷狗、QQ音乐等。一般的音频播放器,都可以支持MP3、wave、AU、VOC等文件格式的播放。

在此次设计的音频播放其中,可以实现对音频文件的打开、播放、暂停、停止、上一曲/下一曲、歌词显示等操作。对于播放器的界面,可以最小化,并显示到托盘。处于最小化的状态下,依然可以对正在播放的文件进行上述操作。在此播放器中,最具特点的是在各个操作按钮以及整个界面上添加了位图和能将窗口最小化。播放器窗口的建立,也有区别与传统的有菜单显示的窗口。最小化到托盘后,仍可以进行操作,也可以选择退出。对于实现播放、停止、上一曲/下一曲、添加文件,都是利用CMidi这个类来存放实现这些功能的函数。需要的时候调用就可以。为了是界面更美观,让人看起来更舒服,加入了位图背景。目前还没有实现用户根据自己的喜好来更改背景图案。

通过这次课程设计,更加巩固了我们所学的知识。

关键词:音频播放器;功能实现;窗口界面;程序代码

Abstract

Audio player is the software that users choose to play any format of audio files, such as cool dogs, QQ music and so on.General audio player can support MP3, wave, AU, VOC file format playback.

In the design of the audio plays which can be achieved on an audio file to open, play, pause, stop, previous song/next song, lyrics display and so on. Interface of the player can be minimized, and displayed to the tray. In minimized state, can these operations to the file while it is playing. In this player, most features are in each action button and the interface, add the bitmap and can minimize the window. Establishment of the player window, there are differences and traditional menu display window. Minimize to the tray, you can still operate, you can also choose to exit. For achieving the play, stop, previous song/next song, and adding files, are using CMidi class to hold these features function. Need to call when you can. In order to interface more beautiful is, people seem more comfortable, has joined a bitmap background. There is no user according to their own preferences to change the background pattern.

Through this curriculum design, further consolidate our knowledge.

 Keywords: Audio player; Features; Window interface code


第一章  课题背景和概述

1.1  课题背景

1.1.1 音频播放器简介

音频播放器(audio player)是一种可储存、组织与播放音讯档案格式的装置。常被称为“MP3播放器”(因为MP3格式的普遍性),它可以播放很多其他的格式,如WMA,AAC,WAV等。一些格式会跟有限制性的技术 DRM合并, 比如Janus和FairPlay, 一般是一些付费下载网站的一部分。其它一些格式则是完全的专利自由或者在另外一些方面开放,比如Ogg Vorbis,FLAC,Speex (Ogg开放多媒体工程的所有部分),以及Module file格式。

1.1.2 目的和意义

通过独立设计完成制作一个播放器软件,更加理解了MFC单文档和多文档程序的构成框架,以及各个类之间数据传递的关系。同时,对鼠标和键盘的多消息响应有了进一步的认识。在设计制作的过程中,C++语言是基础,在熟悉MFC Windows 程序设计的同时,也复习了C++程序语言设计。

1.2  课题概述

1.2.1 功能简介

本次设计完成的播放器软件,能够支持播放多种格式的音频文件,常见的如MP3,WMA,AAC,WAV等。对正在播放的歌曲,可以进行暂停、停止的操作,也可以任意添加歌曲并选择播放。此播放器也可以最小化和最小化到托盘,方便用户在播放音乐的时候,免受打扰。也可以在最小化到托盘的状态下,退出播放器。本次课程设计,主要是检验这一学期,我们通过对MFC Windows应用程序设计这门课学习,能够把所学的知识应用到实际的能力。

1.2.2 主要工作和理论依据

MFC类库将所有图形用户界面的元素如窗口、菜单和按钮等都以类的形式进行了封装,MFC AppWizard向导根据继承性利用MFC派生出自己的类,并对Windows应用程序进行了分解,利用MFC派生类对应用程序重新进行组装,同时还规定了应用程序中各个MFC派生类对象之间的相互联系,实现了标准Windows应用程序的功能,这就是向导生成的所谓MFC应用程序框架。每个MFC类都包括了一些函数,函数放到类中,符合C++编程方法。这些函数,必须通过类定义对象才能使用。

在本次设计中,首先,理清课程设计和编写程序的思路,明确程序中所要用到的函数,并做好了解。然后,再利用C++类的继承与派生原理来构造所需要的类,编写实现每项功能的详细代码。利用MFC提供的菜单资源来创建菜单,通过类向导建立类,函数,或者消息响应,来实现播放器的各种功能。采用不同的Windows提供的坐标系统和对话框资源,并利用设备环境来绘制和更新图形,使播放器的界面更加美观,实现较好的人机交互界面。

第二章  设计简介及设计方案论述

2.1 需求分析

随着社会的发展,有越来越多的人接触电脑,也有越来越多的人喜欢在上网、工作的时候,播放一点音乐,娱乐一下,缓解一下。所以,应运而生的是音频播放器软件,能够为用户播放常见的格式音频文件。并且,在使用的过程中,也尽可能设计出一些人性化的设计。比如,能最小化到托盘并可以进行操作。良好的人机交互界面,也能给人以美好的感官享受。

2.2 系统功能及结构简介

2.2.1 系统功能

此音频播放器可以播放多格式的音频文件。在播放的时候,需要打开本地的音乐文件,选择想要打开的文件,点击播放便可以播放。

在播放的过程中,如果有事离开想要停止播放,可以点击暂停按钮,等到需要的时候,仍然可以点击播放,继续播放。如果需要退出,点击关闭按钮即可。如果是出于最小化到托盘的状态,点击右键选择退出即可。如果想换首歌,点击下一首或者上一首的按钮便可以了。

对于想详细了解歌曲歌词内容,点击界面上的“歌词按钮”,便可以显示歌词。

为了能够让在进行其它操作的用户不受打扰,可以将此播放器最小化到托盘。与此同时,用户依然能够通过点击鼠标右键进行相关的操作。

2.2.2 系统结构

此播放器编写的时候,利用的是MFC单文档程序的构成框架,然后再利用Windows提供的资源,运用控件,自己制作了对话框和人机交互界面。在制作界面的同时,也制作了各个按钮,并完成各个按钮的消息响应,便完成响应函数实现了功能。

第三章  详细设计

3.1 界面设计

3.1.1 播放器界面设计

此播放器的界面是利用控件和位图的结合制作出来了。

打开VC C++6.0新建一个工程,选择单文档。便生成了一个窗口。然后打开ResouceView,点开Dialog,插入Dialog,利用控件,绘制各个按钮。为了使各个按钮更加美观,使用位图,用自己收集的图片将各个按钮覆盖,最后添加消息响应函数,实现各个功能。

为了使所引入的位图能够和所绘制的窗口能完全吻合,在OnPaint()函数中,调用StretchBlt()函数,让其从源矩形中复制一个位图到目标矩形,必要时按目前目标设备设置的模式进行图像的拉伸或压缩。

图3-1 按钮绘制

最后生成的界面比较美观,给人的感觉很好

图3-3 播放器界面

3.1.2 按钮上的位图显示

为对话框添加9个按钮(Button),在Styles标签中选中Bitmap属性。将它们的ID分别为IDC_Play,IDC_Stop_BUTTON,IDC_Next_BUTTON,IDC_Pre_BUTTON,IDC_Add_Song, IDC_Delet_Song,IDC_GC_BUTTON,IDC_MinWindow,ID_CloseWindow以实现对文件的各项操作。将5幅准备好的位图加入资源,其ID分别设为IDC_Play,IDC_Stop_BUTTON,IDC_Next_BUTTON,IDC_Pre_BUTTON,IDC_Add_Song,IDC_Delet_Song,IDC_GC_BUTTON,IDC_MinWindow,ID_CloseWindow,分别和5个按钮相对应。然后,在ClassWizard里为每个按钮分别添加一个CBitmapButton型的变量,分别命名为m_BitmapBtn_Delete;m_BitmapBtn_Stop;m_BitmapBtn_MinWindow;m_BitmapBtn_MaxWindow;m_BitmapBtn_CloseWindow;m_BitmapBtn_NextSong;m_BitmapBtn_UpSong;m_BitmapBtn_paly;m_BitmapBtn_Add;m_BitmapBtn_GC;以对按钮进行操作。

图3-2 各个成员函数和成员变量

3.2 各模块功能设计

3.2.1 各按钮功能的实现

(1)处理“打开”按钮

单击“打开”按钮后,在OnAddSong()函数中,首先对文件类型进行过滤,调用OpenFiles()函数打开对话框选择一个音频文件,通过InitPath()函数获取文件路径,通过InitPath()函数获取文件名后,调用SaveList()函数在Static Text控件上显示你所选择的歌曲文件名,然后再单击播放按钮,便可以播放歌曲。

(2) 处理“播放”按钮

单击“播放”按钮后,在OnPlay()函数中,通过调用Midi类中的Open()函数获取刚才选择的文件路径以及文件名,调用该类的Midi类中的Play()函数播放歌曲,此时调用DisplayInfo()函数在Static Text控件上显示正在播放的歌曲,进行歌曲的播放,然后利用GetDlgItem()函数设置“播放”按钮不可用。

(3) 处理“停止”按钮

单击“停止”按钮后,在OnStopBUTTON()函数中,首先通过调用Midi类的Stop()函数停止正在播放的歌曲,此时的歌曲处于暂停时的进度上,利用GetDlgItem()函数设置“播放”按钮可用。

(5)处理“上一曲/下一曲”按钮

单击“上一曲”按钮时,在OnNextBUTTON()函数中,通过调用Midi类中的Next()函数,停止当前播放放的歌曲,并播放当前列表中的下一曲。“下一曲”按钮的处理与“上一曲”类似。

(6)处理“最小化”按钮

单击“最小化”按钮时,在OnMinWindow()函数中,通过调用ToTray()函数,将当前显示的窗口最小化,并显示在任务栏,在此情况下,仍就可以进行上述操作。

(7)处理“歌词”按钮

单击“歌词”按钮时,会在原有的窗口之外再弹出一个窗口,以此来显示歌词。这需要在这整个工程中新建一个GECI类,来绘制显示歌词的窗口。整个绘制的过程,与界面的设计是相类似的。

(8) 处理“关闭”按钮

单击“关闭”按钮后,在OnCloseWindow()函数中,调用CDialog类的OnOK()函数将退出对话框,结束程序的运行。

3.2.2 最小化到托盘

单击“最小化”按钮时,在OnMinWindow()函数中,通过调用ToTray()函数,当先窗口会被最小化至托盘。在这个过程中,ToTray()函数只能实现最小化,并不能实现在最小化的情况下进行操作。

在最小化至托盘后,要进行操作,就定义了一个OnShowTask(WPARAM wParam,LPARAM lParam)的函数,利用if、switch语句进行判断。首先要通过鼠标的行为来获取最小化之后图标的ID。得到响应后,单击右键,显示弹出式menu。menu.AppendMenu(MF_STRING,IDC_Next_BUTTON,"下一曲"); 

menu.AppendMenu(MF_STRING,IDC_Pre_BUTTON,"上一曲");

menu.AppendMenu(MF_STRING,IDC_Stop_BUTTON,"停  止");

menu.AppendMenu(MF_STRING,IDC_Play,"播放|暂停");

menu.AppendMenu(MF_STRING,WM_DESTROY,"退  出");

由此来确定弹出式菜单的位置。点击后,鼠标得到响应,并执行操作。如果想恢复到原来的窗口,双击最小化后任务栏内的图标显示,鼠标由WM_LBUTTONDBLCLK实现双击响应后,便会回到原来的窗口。在此同时,通过调用DeleteTray()函数,来删除任务栏里最小化后的图标。

3.2.3 进度条显示

进度条在前进的过程中,其总长度应该为歌曲长度。如果想要在一首歌播放完毕后,进度条加好走完,必须先利用GetMediaLength(nLength, bProgress)函数获取歌曲长度,然后利用UpdatePlayTime(BOOL bProgress)函数不断更新歌曲播放的时间,最后通过OnTimer()来实现。

第四章  设计结果及分析

4.1 运行结果显示

4.1.1打开文件并播放

点击“添加”按钮,选择想要播放的歌曲,所选择的文件会显示在“播放列表”中。想要播放哪一首,点击播放即可。

图4-1 打开文件并播放

在播放的过程中,依旧存在一些问题。比如,不能通过双击歌曲来达到播放的目的。如果想完成“上一曲/下一曲”的操作,在添加歌曲文件的时候,必须是一次性的添加多首歌曲。如果每次只添加一首,添加多次,便不能完成歌曲之间的更换。

4.1.2 最小化

当需要最小化是,点击最小化按钮,窗口将自动最小化到托盘。

图4-3 最小化到托盘

最小化时,单击右键会出现如图所示的菜单。单击菜单中的选项,也可以完成操作。

4.1.3 歌词显示

点击“歌词”按钮时,会弹出另一个窗口来显示歌词。由于没有导入歌词文本,所以歌词内容无法显示。

图4-4 歌词显示

4.2 结果分析和不足

虽然说这次的设计结果,从表面上看来,基本功能是实现了。但依旧还是存在很多不足。最突出的就是进度条的问题。

进度条在前进的过程中,其总长度应该为歌曲长度。如果想要在一首歌播放完毕后,进度条加好走完,必须先利用GetMediaLength(nLength, bProgress)函数获取歌曲长度,然后利用UpdatePlayTime(BOOL bProgress)函数不断更新歌曲播放的时间,最后通过OnTimer()来实现。

但是在设计的过程中,编译和连接都没有错误,却不能运行处预料的结果,还有明显的错误。在网上查阅资料的过程中,也没有找到解决的办法。

总   结

这一次的课程设计,对我个人来说是相当有难度的。在设计的过程中,有很多问题不是很清楚,所以走起来就很困难。有时候在遇到问题的时候,基本知识都了解,但是不知道怎么把他们整合起来,知识没有形成系统,都是很零散的东西。而且,由于以前的基础知识不够牢固,是的我在这次课程设计中感到更加的困难。

在设计的过程中,每走一步就会发现,思路想出来很容易,但涉及到实现的时候,总是有点手足无措。对于我的这次课程设计,里面还有很多要改进的地方。在播放器的界面上虽然有音量的调节,但是没有有真正的实现;歌词的具体内容额没有关联上来。

当然一个程序的顺利出炉,少不了的就是反复的调试和更改。在调试的过程中,总会发现很多错误,在解决这些错误的同时,开始很模糊的概念,就会越来越清晰。其实有很多错误都是很类似的,只要解决了一个,其他的也就迎刃而解了。

其实,这一个程序的完成,并不是我一个人的功劳。有很多不懂的地方就会向别人请教,同学之间的相互帮助,确实能够解决很多问题。

致   谢

特别感谢MFCWindows应用程序设计老师的悉心指教和帮助,特别是在上课时候的细心讲解和实验过程中详细的演示,让我更加清楚的了解了各个知识点的运用。

通过这一次的课程设计,让我学到了更多的知识,也把以前掌握不熟练的知识,能更加灵活地运用了。

谢谢!

参考文献

[1]姬涛、周启生,《计算机程序设计基础(上册)》[Z],北京:中国传媒大学出版社,2010

[2]谭浩强,《C程序设计教程》[Z],北京:清华大学出版社,2007

[3]任哲,《MFC Windows应用程序设计(第二版)》[Z],北京:清华大学出版社,2007

附   录

1.1 Cmidi类中的函数

// Midi.cpp

#include "stdafx.h"

#include "Midi.h"

CMidi::CMidi()

{

              m_totalFiles=0;

              fr=0;

              cdfrom=0;

              m_MusicFilePath="";             

              PlayingFalg=false;

              Ispause=false;

}

CMidi::~CMidi()

{

}

//------------播放---------------------

bool CMidi::Play()

{

   if(PlayingFalg) //正在播放则暂停

              Pause() ;

              else

              {

                            if(Ispause)

                            {

                                          mciSendCommand(m_count,MCI_RESUME,0,NULL);

                                          PlayingFalg=true;

                                          Ispause=false;

                            }

                            else

                            {

                            PlayingFalg=true;//标志为正在播放

                            MCI_OPEN_PARMS mciopenparms;//打开

                            MCI_PLAY_PARMS mciplayparms;//播放

                            //以下用fr做下标,能在停止再播放时恢复上次的位置

                            mciopenparms.lpstrElementName=m_FileList[fr];//播放路径

                            mciopenparms.lpstrDeviceType=NULL;//文件类型为NULL,就可以支持全部类型

                            mciSendCommand(0,MCI_OPEN,MCI_DEVTYPE_WAVEFORM_AUDIO,

                                          (DWORD)(LPVOID)&mciopenparms);//向MCI设备发送命令消息

                            m_count=mciopenparms.wDeviceID;

                            mciplayparms.dwCallback=NULL;//窗口拥有者句柄

                            cdlen=getinfo(MCI_STATUS_LENGTH);//得到曲目长度                                                                                                                                                                                                                                                      

                            cdto=MCI_MAKE_HMS(MCI_HMS_HOUR(cdlen),MCI_HMS_MINUTE(cdlen),

                                          MCI_HMS_SECOND(cdlen));//根据长度计算出时、分、秒

                            mciplayparms.dwFrom=MCI_MAKE_HMS(0,0,0);//表示从哪儿开始播放吧

                            mciplayparms.dwTo=cdto;//表示放到哪儿为止

                            mciSendCommand(m_count,MCI_PLAY,MCI_TO|MCI_FROM,

                            (DWORD)(LPVOID)& mciplayparms);        //发送播放消息

                                         

                            }

              }

              return true;

}

//---------------获取歌曲信息(长度,已播放长度)------

DWORD CMidi::getinfo(DWORD item)

{

              MCI_STATUS_PARMS mcistatusparms;

              mcistatusparms.dwCallback=NULL;

/*          //接受传入的命令参数,这是关键。命令参数如下:

   获取歌曲长度: MCI_STATUS_LENGTH

   获取当前已播放的长度:MCI_STATUS_POSITION

*/

              mcistatusparms.dwItem=item;//接受命令参数的地方

              mcistatusparms.dwReturn=0;//返回值

              mciSendCommand(m_count,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)&mcistatusparms);

              return mcistatusparms.dwReturn;

}

//-------------------停止-------------------

void CMidi::Stop()

{

              PlayingFalg=false;//关闭正在播放标志

              cdfrom=MCI_MAKE_HMS(0,0,0);//播放位置归文件开头

              mciSendCommand(m_count,MCI_CLOSE,0,NULL);//发出关闭消息

              m_count=0;

}

//-------------------下一首----------------

void CMidi::Next()

{

              if(fr>=0)

              {

                         fr++;

                            if(fr>=m_totalFiles)

                            {

                                          //让fr指向下一个音乐文件,fr是从0下标开始

                                          //m_totalFiles为总文件数

                                          fr=0;    

                            }

                            Stop();

                            Play();              

              }

}

//----------上一首------------------

void CMidi::Per()

{

              if(fr>=0)

              {

                            fr--;

                            if(fr==-1)

                            {//指向最后一首歌,但fr是从0下标开始的,而m_totalFiles是从1开始

                            fr=m_totalFiles-1;      

                            }

                            Stop();

                            Play();//播放fr指向的位置   

                 }

}

//----------保存曲目列表-----------------

bool CMidi::SaveList()

{

              CFile fileList;//文件对象

              if(!fileList.Open(m_MusicFilePath,CFile::modeCreate|CFile::modeWrite))

                            return FALSE;//打开文件,不存在则创建,写文件

              char fileName[256];

              for(int i=0;i<m_totalFiles;i++)

              {//m_totalFiles为打开对话框中获取的歌曲总数

                            strcpy(fileName,m_FileList[i]);//取出一条曲目路径

                            fileList.Write(fileName,strlen(fileName));//写入文件

                            fileList.Write("\r\n",2);//写入一行结束和换行符

              }

              fileList.Write("----",4);//写入文件最后标志

              fileList.Close();//关闭文件

              return TRUE;

}

//----------读取曲目路径列表-----------------

bool CMidi::OpenList()

{

              CFile fileList;

              if(!fileList.Open(m_MusicFilePath,CFile::modeNoTruncate|CFile::modeRead))

                            return FALSE;//以只读模式打开,不覆盖原有文件,m_MusicFilePath为列表文件的路径           

              char ch;

              while(1)

              {

                            CString fileName;

                            fileList.Read(&ch,1);//读入一个字符

                            if(ch=='-') break;  //如文件是最后返回,-是文件最后的标志

                            fileName+=ch;//否则存入

                            while(1)

                            {//读入一行

                                          fileList.Read(&ch,1);

                                          if(ch=='\r')

                                          {//这儿可以判断是一行了

                                                        m_totalFiles++;//曲目首数计数

                                                        fileList.Read(&ch,1);

                                                        break;

                                          }

                                          fileName+=ch;

                            }

        //下面这句把路径加入列表中,用字符串数组代替

                            //m_totalFiles前面已经加一了,所以这儿要少一个

                            m_FileList[m_totalFiles-1]=fileName;

             

              }

              fileList.Close();

              return TRUE;

}

//----------打开对话框,获取曲目列表-----------------

bool CMidi::OpenFiles()

{

             

              CFileDialog f(true);//打开对话框对象

              f.m_ofn.Flags |=512;//OFN_ALLOWMULTISELECT;目录列表方式

              f.m_ofn.lpstrFilter="所有媒体类型\0*.*\0\0";

           if(f.DoModal()!=IDOK)

                            return FALSE;//用户单击了“取消”

              POSITION pos=f.GetStartPosition();//获取第一个文件位置

              int i=0;

              while(pos)

              {

                            m_FileList[i]=f.GetNextPathName(pos);//读取文件到曲目路径列表        

                            i++;

              }

              m_totalFiles=i;//保存曲目总数

              Stop();

              if(PlayingFalg)

                            Stop();

              //Play();//播放打开的文件

              return TRUE;

}

//-------------------获得播放列表文件的路径------------

bool CMidi::InitPath()

{//初始化路径,取得播放曲目列表文件的全路径

              TCHAR path[256];//保存文件路径

              GetModuleFileName(NULL,path,sizeof(path)) ;//获取当前程序路径

              TCHAR * p = _tcsrchr(path,_T('\\')) ;//查找最后一个'\\'字符

              if(p)      lstrcpy(p,_T("\\MPlayer.mdr"));//替换成要查找的完整路径

              m_MusicFilePath=path;//保存到路径变量中,以便用它来打开列表文件

              return true;

}

//----------------------循环播放------------------

void CMidi::OnTimer()

{//循环播放

              if(getinfo(MCI_STATUS_POSITION)==cdlen)

    {//如当前播放的长度等于歌曲的长度,说明已经播放完毕

                            Next();//指向下一首

              }

}

//----------------------暂停播放------------------

void CMidi::Pause() 

{

         PlayingFalg=false;//关闭正在播放标志

         mciSendCommand(m_count,MCI_PAUSE,0,NULL);

         Ispause=true;

}

1.2 最小化的相关操作

/////////////////////////////////////最小化到托盘开始///////////////////

void CMy2009Dlg::ToTray()

{

              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_SHOWTASK;//自定义的消息名称

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

              strcpy(nid.szTip,"v2009音频播放器"); //信息提示条

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

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

}

/////////////////////////////////////最小化到托盘结束///////////////////

//wParam接收的是图标的ID,而lParam接收的是鼠标的行为

LRESULT CMy2009Dlg::OnShowTask(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,IDC_Next_BUTTON,"下一曲"); 

                               menu.AppendMenu(MF_STRING,IDC_Pre_BUTTON,"上一曲");

                               menu.AppendMenu(MF_STRING,IDC_Stop_BUTTON,"停  止");

                               menu.AppendMenu(MF_STRING,IDC_Play,"播放|暂停");

                               menu.AppendMenu(MF_STRING,WM_DESTROY,"退  出");

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

                              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);//显示主窗口

                              DeleteTray();   

                        }break; 

                   default: break; 

                   }     return 0;

}

void CMy2009Dlg::DeleteTray()

{

              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_SHOWTASK;//自定义的消息名称

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

              strcpy(nid.szTip,"v2009音频播放器"); //信息提示条为“计划任务提醒”

              Shell_NotifyIcon(NIM_DELETE,&nid); //在托盘区删除图标

}

更多相关推荐:
《C语言程序设计》课程设计报告(小组)

东莞理工学院《C语言程序设计》课程设计题目:图书信息管理系统院系:电子工程学院专业:电子信息工程年级:20##班别:2班指导教师:##组长:##同组成员:##目录一、目的....................…

c语言课程设计报告

C语言程序设计课程设计学生姓名学号系院专业设计论文题目学生选课系统管理完成日期20xx年6月指导教师目录一实验目的二实验内容三总体设计四详细设计五运行结果六课程设计体会一实验目的1通过课程设计加深对结构化程序设...

C语言课程设计报告

河南理工大学计算机科学与技术学院课程设计报告20XX20XX学年第一学期课程名称C语言课程设计设计题目《小学算术运算测试》学生姓名学号专业班级计算机07-2班指导教师20XX年9月12日目录1.设计任务书21.…

C语言课程设计报告范例

C语言课程设计报告设计题目专业班级学号姓名任课老师时间目录一课程设计题目及所涉及知识点二课程设计思路及设计流程图三课程设计中遇到的难点及解决办法四小结五附录原程序2一课程设计题目及所涉及知识点一课程设计题目1基...

厦门理工学院11级C语言C语言程序设计课程设计报告

C语言程序设计课程设计报告20xx20xx学年第1学期题目专业班级姓名学号指导教师成绩计算机科学与技术系20xx年12月31日目录一课程设计的目的与要求1二方案实现与调试221掷骰子游戏222射击游戏323汽车...

C语言程序设计课程设计报告

C语言程序设计课程设计报告20xx20xx学年第1学期专业计算机科学与技术班级姓名学号指导教师成绩计算机科学与技术系20xx年12月31日目录一课程设计的目的与要求3二方案实现与调试321掷骰子游戏322汽车加...

c语言程序贪吃蛇课程设计报告

山东工商学院信电学院自动111班第一组贪吃蛇课程设计报告高级语言程序设计课程设计报告ExperimentDesigningreporter课程名称高级语言程序设计英文名称CProgramExperimentDe...

C语言课程设计报告书样本

海南大学三亚学院C语言程序设计课程设计贪吃蛇算法专业计算机科学与技术班级计科1001姓名杨凯文题目学号指导老师李春林目录C语言程序设计课程设计11程序要求32程序分析与设计33流程图44源程序清单45调试过程1...

C语言课程设计报告—人事管理系统

人事管理系统前言:现代计算机技术的发展为人们的学习、生活、工作提供了很大的帮助,各行各业都需要特定计算系统的运用,我们需要了解这些系统是怎么样为我们服务以及他们是怎样编辑出来的。我们需要学习C语言编程,根据课堂…

C语言课程设计报告(通讯录)

设计说明书通讯录系统起止日期20xx年01月03日至20xx年01月08日学班学成生姓名级号绩XXX指导教师签字计算机与通信学院20xx年01月08日一课题任务设计一个通讯录管理系统课题的主要任务是1对通讯录信...

C语言课程设计报告 扫雷

程序课程设计基础课程设计扫雷游戏院系计算机科学技术学院计算机科学与技术师范班级师计091设计者徐群杨松徐春辉杨雷刘安然学号3224312504指导教师黄绍义20xx年12月25日1目录1概述311研究的背景及意...

简单计算器C语言课程设计报告书

C语言课程设计报告书题目:简单计算器院系:班级:学号:姓名:一、课程设计目的1.巩固和加深C语言课程的基本知识的理解和掌握2.掌握C语言编程和程序调试的基本技能3.利用C语言进行基本的软件设计4.掌握书写程序设…

c语言程序设计课程设计报告(34篇)