MCI播放mp3音频文件例程

上传人:仙*** 文档编号:68472940 上传时间:2022-04-02 格式:DOC 页数:39 大小:90KB
收藏 版权申诉 举报 下载
MCI播放mp3音频文件例程_第1页
第1页 / 共39页
MCI播放mp3音频文件例程_第2页
第2页 / 共39页
MCI播放mp3音频文件例程_第3页
第3页 / 共39页
资源描述:

《MCI播放mp3音频文件例程》由会员分享,可在线阅读,更多相关《MCI播放mp3音频文件例程(39页珍藏版)》请在装配图网上搜索。

1、MCI播放mp3音频文件例程源文件中需要包含头文件 Mmsystem.h,在Project-Settings-Link-Object/libray module中加入库 Winmm.lib。或添加代码#pragma comment(lib, winmm.lib)MCI_OPEN_PARMS op;void CMCIDlg:OnPlay() / TODO: Add your control notification handler code hereDWORD cdlen;/音频文件长度op.dwCallback=NULL; op.lpstrAlias=NULL; op.lpstrDeviceT

2、ype=_T(MPEGAudio);/设备类型,大多数文件可以这样设置 op.lpstrElementName=_T(D:2.mp3C:Documents and SettingsAll UsersDocumentsMy Music示例音乐);/文件路径 op.wDeviceID=NULL;/打开设备成功以后保存这个设备号备用 UINT rs;/接受函数返回结果 /发送命令打开设备,成功返回0,否则返回错误号,第三个参数这里必须MCI_OPEN_ELEMENT rs=mciSendCommand(NULL,MCI_OPEN,MCI_OPEN_ELEMENT,(DWORD)&op);mciSen

3、dCommand(op.wDeviceID,MCI_PLAY,MCI_NOTIFY,(DWORD)&pp);mciSendCommand(NULL,MCI_SET,MCI_SET_DOOR_OPEN,NULL); cdlen=getinfo(op.wDeviceID,MCI_STATUS_LENGTH);/获取音频文件长度if(rs=0)/设备打开成功就播放文件 MCI_PLAY_PARMS pp; pp.dwCallback=NULL; pp.dwFrom=0;/开始播放的位置 mciSendCommand(op.wDeviceID,MCI_PLAY,MCI_NOTIFY,(DWORD)&p

4、p);/播放文件,如果第三个参数设为MCI_WAIT则程序窗口会被阻塞,为了避免这种情况可以设为MCI_NOTIFY Sleep(cdlen);/根据文件长度等待,与MCI_WAIT效果一样,cdlen参数可以控制播放时间OnStop();/关闭音频文件DWORD CMCIDlg:getinfo(UINT wDeviceID,DWORD item)MCI_STATUS_PARMS mcistatusparms;mcistatusparms.dwCallback=(DWORD)GetSafeHwnd();mcistatusparms.dwItem=item;mcistatusparms.dwRe

5、turn=0;mciSendCommand(wDeviceID,MCI_STATUS,MCI_STATUS_ITEM,(DWORD)&mcistatusparms);return mcistatusparms.dwReturn;void CMCIDlg:OnStop() / TODO: Add your control notification handler code here/在WM_CLOSE消息处理过程中发送MCI_CLOSE命令关闭设备MCI_GENERIC_PARMS gp; gp.dwCallback=NULL; mciSendCommand(op.wDeviceID,MCI_C

6、LOSE,MCI_WAIT,(DWORD)&gp);=加入音乐是增强应用程序功能的所有方法中最简单的一个。几乎每个计算机游戏或多媒体程序都以某种MIDI或CD音乐为背景。音乐可以使用户心情愉快;在合适的场合播放恰当的音乐能够使程序员和他的VC+程序焕发光彩。第一部分 MIDI的播放乐器数字化接口(MIDI)是由音乐界的一些大公司(包括生产电子音乐合成器的公司)制订的一项协议,后来被计算机产业所采用并成为多媒体音乐文件的标准格式。MIDI文件一般较小,对硬件设备的要求高。一、 原理虽然MicroSoft支持MIDI文件,然而Visual C+或MFC并没有创建任何组件来实现这种支持,但是Micr

7、oSoft API提供了三种不同的方法来实现MIDI的播放:MCI(The Media Control Interface)。这是最基本的方法,本文将详细讨论这种方法。流缓冲器。这种格式允许应用程序为MIDI数据分配缓冲器。在需要精确控制MIDI播放的时候,流缓冲器将很有用处。低级MIDI设备。需要完全控制MIDI数据的应用程序可以使用这种方法。MCI可以通过mciSendCommand()和mciSendString()来完成,本文仅使用mciSendCommand()函数。原型:DWORD mciSendCommand(UINT wDeviceID,UINT wMessage,DWORD

8、dwParam1,DWORD dwParam2);参数: wDeviceID:接受消息的设备IDwMessage:MCI命令消息dwParam1:命令的标志位dwParam2:所使用参数块的指针返值:调用成功,返回零;否则,返回双字中的低字存放有错误信息。二MIDI的播放控制1 打开设备MCI_OPEN_PARMS OpenParms;OpenParms.lpstrDeviceType =(LPCSTR) MCI_DEVTYPE_SEQUENCER;/MIDI类型OpenParms.lpstrElementName = (LPCSTR) Filename;OpenParms.wDeviceID

9、 = 0;mciSendCommand (NULL, MCI_OPEN,MCI_WAIT | MCI_OPEN_TYPE |MCI_OPEN_TYPE_ID | MCI_OPEN_ELEMENT,(DWORD)(LPVOID) &OpenParms)MCI设备ID指明打开了哪个设备,当发送了MCI_OPEN命令时,这个值在参数块中返回应被保存备用。2 关闭设备mciSendCommand (m_wDeviceID, MCI_CLOSE, NULL, NULL);3 播放MCI_PLAY_PARMS PlayParms;PlayParms.dwFrom = 0;/ 指定从什么地方(时间)播放mc

10、iSendCommand (m_wDeviceID, MCI_PLAY,MCI_FROM, (DWORD)(LPVOID)&PlayParms);4 暂停MCI_PLAY_PARMS PlayParms;mciSendCommand (m_wDeviceID, MCI_PAUSE, 0,(DWORD)(LPVOID) &PlayParms);5 停止mciSendCommand (m_wDeviceID, MCI_STOP, NULL, NULL);6 跳跃* 跳转到任意地方MCI_SEEK_PARMS SeekParms;SeekParms.dwTo = (nMinute * 60 + nS

11、econd) * 1000;/跳转的目标时间,时间单位为毫秒mciSendCommand (m_wDeviceID, MCI_SEEK, MCI_TO| MCI_WAIT,(DWORD)(LPVOID)&SeekParms);* 跳到文件头mciSendCommand (m_wDeviceID, MCI_SEEK,MCI_SEEK_TO_START, NULL);* 跳到文件尾mciSendCommand (m_wDeviceID, MCI_SEEK,MCI_SEEK_TO_END, NULL);7 查询当前信息MCI_STATUS_PARMS StatusParms;StatusParms.

12、dwItem = MCI_SEQ_STATUS_DIVTYPE;mciSendCommand (m_wDeviceID, MCI_STATUS,MCI_WAIT | MCI_STATUS_ITEM,(DWORD)(LPVOID) &StatusParms);返回信息存放于StatusParms.dwReturn中。MCI_STATUS标志MCI_STATUS_LENGTH 获得文件长度MCI_STATUS_MODE 获得文件播放的当前状态MCI_STATUS_POSITION 获得文件播放的当前位置MCI_STATUS_TIME_FORMAT 获得当前的时间格式MCI_SEQ_STATUS_D

13、IVTYPE 判断文件是PPQN类型还是SMPTE类型MCI_SEQ_STATUS_TEMPO 获得当前播放速度,PQRN类型,此值为节拍/分,SMPTE类型,此值为祯/秒8 设置时间格式及播放速度MCI_SET_PARMS SetParms;SetParms.dwTimeFormat = MCI_FORMAT_MILLISECONDS;/设置时间单位为毫秒mciSendCommand (m_wDeviceID,MCI_SET, MCI_SET_TIME_FORMAT,(DWORD)(LPVOID) &SetParms);MCI_SEQ_SET_TEMPO 设置播放速度,PQRN类型,此值为节

14、拍/分,SMPTE类型,此值为祯/秒第二部分 WAV文件的播放一、原理MicroSoft API提供了三种不同的方法来实现WAV的播放:PlaySound()函数。它可以通过单行编码来播放Wave格式的声音。此函数有两个限制:必须将声音数据完整地载入物理内存;数据格式必须被所配置的某一音频驱动器支持。根据经验,PlaySound()适用于100K以下的文件。MCI(The Media Control Interface),与上一章播放MIDI文件相似,可以播放100K 以上的文件。低级Wave音频设备。用这些设备可以运行完全控制Wave数据的应用文件。二、 WAV文件播放控制因为同样使用MCI

15、,与上一章相同,只列出不同的部分。1 打开设备将MIDI的MCI_DEVTYPE_SEQUENCER 改为waveaudio2 录音MCI_RECORD_PARMS RecordParms;mciSendCommand (m_wDeviceID, MCI_RECORD,NULL, (DWORD)(LPVOID)&RecordParms);3 保存录音MCI_SAVE_PARMS SaveParms;SaveParms.lpfilename = (LPCSTR) Filename;mciSendCommand (m_wDeviceID, MCI_SAVE,MCI_SAVE_FILE | MCI_

16、WAIT,(DWORD)(LPVOID) &SaveParms);第三部分 CD的播放CD的独特优势在于,它由作曲家设计,并由音乐厂家生产。不同的计算机播放MIDI 文件时,声音效果也不一样,但是CD的声音效果总是相同的。高品质的音频对计算机用 户产生的效果会使你感到吃惊。我们依然采用MCI播放CD,大部分的播放控制与前两部分相同,只列出不同的部分1 开光驱门mciSendCommand (m_wDeviceID, MCI_SET,MCI_SET_DOOR_OPEN, NULL);2 关光驱门mciSendCommand (m_wDeviceID, MCI_SET,MCI_SET_DOOR_C

17、LOSED, NULL);3 打开设备将MIDI的MCI_DEVTYPE_SEQUENCER 改为MCI_DEVTYPE_CD_AUDIO4 播放指定播放起点必须经过MCI_MAKE_TMSF(Track,Minute,Second,Frame)转化5 查询当前信息MCI_STATUS_CURRENT_TRACK 得到当前曲目MCI_STATUS_LENGTH 得到CD或指定曲目长度MCI_STATUS_MODE 得到驱动器的当前状态MCI_STATUS_NUMBER_OF_TRACKS 得到CD曲目的数目MCI_STATUS_POSITION 得到当前格式下的位置MCI_STATUS_REA

18、DY 检查设备是否就绪MCI_STATUS_TIME_FORMAT 得到当前时间格式MCI_STATUS_MEDIA_PRESENT 检查以确认CD是否在驱动器内MCI_CDA_STATUS_TYPE_TRACK 检查已确认某曲目是否为音频曲目注意:使用MCI_STATUS_LENGTH参数查询CD 及曲目长度,返回值通过调用MCI_MSF_MINUTE(),MCI_MSF_SECOND()转换为分、秒。MCI_STATUS_POSITION参数返回值调用MCI_TMSF_TRACK(), MCI_TMSF_MINUTE(), MCI_TMSF_SECOND(),MCI_TMSF_FRAME才

19、能得到当前的位置的道、分、秒、帧。6 跳跃跳转的目标必须经过MCI_MAKE_TMSF(Track,Minute,Second,Frame)转化最好将上述三种格式分开建类,或做成动态连接库。在 Project- Setting- Link- Object/library modules中加入winmm.lib,源程序中包含。MCI调用简单,功能强大,可以满足日常多媒体编程的基本需要。但是,MCI一次只能播放一个文件,使用DirectSound技术可以实现八个以上WAV文件的同时播放。=使用MCI API,源文件中需要包含头文件 Mmsystem.h,在Project-Settings-Link

20、-Object/libray module中加入库 Winmm.lib。、MCI简介MCI(Media Control Interface,媒体控制接口)向Windows程序提供了在高层次上控制媒体设备接口的能力。程序不必关心具体设备,就可以对激光唱机(CD)、视盘机、波形音频设备、视频播放设备和MIDI设备等媒体设备进行控制。对于程序员来说,可以把MCI理解为设备面板上的一排按键,通过选择不同的按键(发送不同的MCI命令)可以让设备完成各种功能,而不必关心设备内部实现。比如,对于play,视盘机和CD机有不同的反应(一个是播放视频,一个播放音频),而对用户来说却只需要按同一按钮。应用程序通过

21、向MCI发送命令来控制媒体设备。MCI命令接口分命令字符串和命令消息两种,两者具有相同的功能。命令字符串具有使用简单的特点,但是它的执行效率不如命令消息。所有的MCI命令字符串都是通过多媒体API函数mciSendString传递给MCI的,该函数的声明为:MCIERROR mciSendString(LPCTSTR lpszCommand, /MCI命令字符串LPTSTRlpszReturnString,/存放反馈信息的缓冲区UINTcchReturn, /缓冲区的长度HANDLEhwndCallback /回调窗口的句柄,一般为NULL); /若成功则返回0,否则返回错误码。该函数返回的错

22、误码可以用mciGetErrorString函数进行分析,该函数的声明为:BOOL mciGetErrorString(DWORDfdwError,/函数mciSendString返回的错误码LPTSTR lpszErrorText, /接收描述错误的字符串的缓冲区UINT cchErrorText /缓冲区的长度);下面是使用mciSendString函数的一个简单例子:char buf50;MCIERROR mciError;mciError=mciSendString(open cdaudio,buf,strlen(buf),NULL);if(mciError)mciGetErrorSt

23、ring(mciError,buf,strlen(buf);AfxMessageBox(buf);return;open cdaudio命令打开CD播放器,如果出错(如驱动器内没有CD)则返回错误码,此时可以用mciGetErrorString函数取得错误信息字符串。、MCI设备open是MCI打开设备的命令,cdaudio是MCI设备名。MCI的设备类型如下:animation动画设备cdaudioCD播放器dat数字音频磁带机digitalvideo 某一窗口中的数字视频(不基于GDI)other未定义的MCI设备overlay重叠设备(窗口中的模拟视频)scanner图象扫描仪seque

24、ncerMIDI序列器videodisc视盘机waveaudio播放数字波形文件的音频设备设备名是在注册表或SYSTEM.INI的mci部分定义的,典型的mci段如下:mcicdaudio=mcicda.drvsequencer=mciseq.drvwaveaudio=mciwave.drvavivideo=mciavi.drvvideodisc=mcipionr.drv等号的左边是设备名,右边是对应的MCI驱动程序。当安装了新的MCI驱动程序时,系统要用不同的设备名来区分。、MCI命令使用MCI设备一般包括打开、使用和关闭三个过程,常用的MCI命令有:open打开设备close 关闭设备pl

25、ay开始设备播放stop停止设备的播放或记录record开始记录save保存设备内容pause 暂停设备的播放或记录resume恢复暂停播放或记录的设备seek改变媒体的当前位置capacility查询设备能力info查询设备的信息status查询设备状态信息MCI的大部分命令可以控制不同的媒体设备,但其中record和save命令并不是所有MCI设备都可以使用。MCI命令的使用是很随意的,只要先打开,最后关闭,中间可以随意调用各种命令。(1) open打开设备MCI设备使用前必须先打开,当然,使用后也必须要关闭,以免影响他人的使用。open device_name type device_t

26、ype alias device_aliasdevice_name 要使用的设备名,通常是文件名。type device_type设备类型,例如waveaudio或sequencer,可省略。alias device_alias设备别名,指定后可在其他命令中代替设备名。(2) play开始设备播放MCI设备打开后即可以播放,可使用设备名或别名。play device_alias from pos1 to pos2 wait repeat若省略from则从当前磁道开始播放,若省略to则播放到结束。若指明wait则等到播放完毕命令才返回。若指明repeat则会不停的重复播放。若同时指明wait和r

27、epeat则命令不会返回,本线程产生堵塞,通常会引起程序失去响应。(3) 播放CDvoid CTttView:OnOpenCD()mciSendString(open cdaudio,NULL,0,NULL);mciSendString(play cdaudio,NULL,0,NULL););void CTttView:OnStopCD()mciSendString(stop cdaudio,NULL,0,NULL);mciSendString(close cdaudio,NULL,0,NULL););还可以:pause cdaudio 暂停播放。resume cdaudio继续被暂停的播放。

28、seek cdaudio to 移动到指定磁道。set cdaudio door open/closed弹出或缩进CD盘。(4) 播放多媒体文件void CTttView:OnMyMenu()mciSendString(open myfoldertada.wav alias aa,NULL,0,NULL);或mciSendString(open myfolderflourish.mid alias aa,NULL,0,NULL);或mciSendString(open myfolderclock.avi alias aa,NULL,0,NULL);mciSendString(play aa w

29、ait,NULL,0,NULL);mciSendString(close aa,NULL,0,m_hWnd););(5) 录制声音void CTttView:OnStartRecord()mciSendString(open new type waveaudio alias aa,NULL,0,NULL);mciSendString(record aa,NULL,0,NULL););void CTttView:OnStopRecord()mciSendString(save aa c:aaa.wav wait,NULL,0,NULL);mciSendString(close aa,NULL,0

30、,NULL););、MCI命令消息到目前为止,我们使用的都是MCI命令字符串。可以发现,命令字符串具有简单易学的优点,但这种接口与C/C+的风格相去甚远,如果程序要查询和设置大量数据,那么用字符串的形式将很不方便。MCI的命令消息接口提供了C语言接口,它速度更快,并且更能符合C/C+程序员的需要。所有MCI命令消息都是通过mciSendCommand函数发送的,函数声明为:MCIERROR mciSendCommand(MCIDEVICEID wIDDevice, /设备的ID,在打开设备时不用该参数UINTuMsg, /命令消息DWORD fdwCommand, /命令消息的标志DWORD

31、dwParam /指向包含命令消息参数的结构); /若成功则返回0,否则返回错误码命令消息uMsg与命令字符串是对应的,例如,open与MCI_OPEN完成的是一样的功能。变量wDeviceID用来保存设备的ID,系统用ID来标识不同的设备,以保证命令发给正确的对象。void CTttView:OnMyMenu()MCI_OPEN_PARMS mciOpen;UINT wDeviceID;mciOpen.lpstrDeviceType = avivideo;mciOpen.lpstrElementName = myfolderclock.avi;mciSendCommand(0, MCI_OP

32、EN, MCI_OPEN_ELEMENT, (DWORD)&mciOpen);wDeviceID=mciOpen.wDeviceID;MCI_PLAY_PARMS mciPlay;mciSendCommand(wDeviceID, MCI_PLAY, MCI_WAIT, (DWORD)&mciPlay););可以看出,用命令消息比用命令字符串要复杂的多,但它的执行效率高。使用下面的函数:GetPrivateProfileStringGetPrivateProfileInt我的INI文件名叫system.ini 内容ServerServerIP=10.38.163.11Port=3002char

33、 ipstr20;/存储IP地址GetPrivateProfileString(Server,ServerIP,NULL,ipstr,20,d:testsystem.ini);/第一个参数表示根节点,第二个参数表示子节点,第三个参数表示如果找不到,默认ipstr返回NULL,第四个参数存储返回结果,本例子ipstr就得到10.38.163.11的地址,第五个参数表示读的长度,最后一个参数是INI文件的路径和文件名int port;port = GetPrivateProfileInt(Server,Port,0,d:testsystem.ini);/参看上面的说明以及INI文件该方法是使用的L

34、evenshtein算法的一个实现。简单介绍下Levenshtein Distance(LD):LD 可能衡量两字符串的相似性。它们的距离就是一个字符串转换成那一个字符串过程中的添加、删除、修改数值。 举例: 如果str1=test,str2=test,那么LD(str1,str2) = 0。没有经过转换。 如果str1=test,str2=tent,那么LD(str1,str2) = 1。str1的s转换n,转换了一个字符,所以是1。如果它们的距离越大,说明它们越是不同。 Levenshtein distance最先是由俄国科学家Vladimir Levenshtein在1965年发明,用他

35、的名字命名。不会拼读,可以叫它edit distance(编辑距离)。 Levenshtein distance可以用来: Spell checking(拼写检查) Speech recognition(语句识别) DNA analysis(DNA分析) Plagiarism detection(抄袭检测)LD用m*n的矩阵存储距离值。算法大概过程:1. str1或str2的长度为0返回另一个字符串的长度。2. 初始化(n+1)*(m+1)的矩阵d,并让第一行和列的值从0开始增长。3. 扫描两字符串(n*m级的),如果:str1i = str2j,用temp记录它,为0。否则temp记为1。然

36、后在矩阵dij赋于di-1j+1 、dij-1+1、di-1j-1+temp三者的最小值。4. 扫描完后,返回矩阵的最后一个值即dnm最后返回的是它们的距离。怎么根据这个距离求出相似度呢?因为它们的最大距离就是两字符串长度的最大值。对字符串不是很敏感。现我把相似度计算公式定为1-它们的距离/字符串长度最大值。public static float similarity(String str1, String str2) /计算两个字符串的长度。int len1 = str1.length();int len2 = str2.length();/建立数组,比字符长度大一个空间int dif =

37、new intlen1 + 1len2 + 1;/赋初值,步骤B。for (int a = 0; a = len1; a+) difa0 = a;for (int a = 0; a = len2; a+) dif0a = a;/计算两个字符是否一样,计算左上的值int temp;for (int i = 1; i = len1; i+) for (int j = 1; j i) min = i;return min;1PDF_showvoid PDF_show(PDF *p, const char *text)void PDF_show2(PDF *p, const char *text, i

38、nt len)在当前坐标用当前字体及字体大小输出文本。PDF_show将认为字符串是以空字符结尾(NULL);若字符串有可能含有空字符(如多字节字符串),用PDF_show2。 2PDF_show_xyvoid PDF_show_xy(PDF *p, const char *text, double x, double y)void PDF_show_xy2(PDF *p, const char *text, int len, double x, double y)在给出的坐标用当前字体及字体大小输出文本。PDF_show_xy将认为字符串是以空字符结尾(NULL);若字符串有可能含有空字符(

39、如多字节字符串),用PDF_show_xy2。3PDF_continue_textvoid PDF_continue_text(PDF *p, const char *text)void PDF_continue_text2(PDF *p, const char *text, int len)在下一行用当前字体及字体大小输出文本。PDF_continue_xy将认为字符串是以空字符结尾(NULL);若字符串有可能含有空字符(如多字节字符串),用PDF_continue_xy2。4PDF_fit_textlinevoid PDF_fit_textline(PDF*p, const char *t

40、ext, int len, double x, double y, const char *optlist)在给出的坐标根据选择项输出一行文本。若字符串是以空字符结尾(NULL),len为0;否则,给出具体字节数。5PDF_fit_textflowint PDF_create_textflow(PDF *p, const char *text, int len, const char *optlist)建立文本流对象,并预处理文本为下面的文本格式化做准备。若字符串是以空字符结尾(NULL),len为0;否则,给出具体字节数。const char *PDF_fit_textflow(PDF *p

41、, int textflow, double llx, double lly, double urx, double ury, const char *optlist)将文本输出到相应的矩形块中。lly, llx, ury, urx, 分别是矩形块左下角及右上角的纵横坐标。void PDF_delete_textflow(PDF *p, int textflow)删除文本流对象及相关数据结构。小结1,2, 3 组函数简洁,直观,易用。4,5组函数可通过对选择项的控制而输出更灵活的文本格式。尤其是第5组函数,是专门为多行文本设计的,可通过选项控制对齐,字间距,边框显示,旋转等。但4,5组函数有个

42、局限,在字符串是多字节时,它们只能处理Unicode类编码。换而言之,他们不支持cpArray36编码。下面是一个相关的例子-C 源程序(下载源代码中包含了生成的pdf文件 PDFlib_cs3.pdf)。/*/* This example demostrates different ways to output Chinese Simplified text/* under Chinese Simplifed Windows./*/#include #include #include #include pdflib.hint main(void)PDF *p = NULL;int i = 0

43、, j = 0, Left = 50, Top = 800, Right = 545;int Font_E = 0, Font_CS = 0, Font_CS2 = 0, TextFlow = 0;char TextUnicode = x80x7Bx53x4Fx2Dx4Ex87x65;char TextCpArray36 = xBCxF2xCCxE5xD6xD0xCExC4;/* create a new PDFlib object */if (p = PDF_new() = (PDF *) 0)printf(Couldnt create PDFlib object (out of memor

44、y)!n);return(2);PDF_TRY(p) if (PDF_begin_document(p, pdflib_cs3.pdf, 0, ) = -1)printf(Error: %sn, PDF_get_errmsg(p);return(2);PDF_set_info(p, Creator, pdflib_cs3.c);PDF_set_info(p, Author, myi);PDF_set_info(p, Title, Different Ways To Output Chinese Simplify);/* Start a new page. */PDF_begin_page_ex

45、t(p, a4_width, a4_height, );Font_E = PDF_load_font(p, Helvetica-Bold, 0, winansi, );Font_CS = PDF_load_font(p, STSong-Light, 0, UniGB-UCS2-H, );Font_CS2 = PDF_load_font(p, STSong-Light, 0, GB-EUC-H, );/* Using PDF_set_text_pos and PDF_show functions. */PDF_setfont(p, Font_E, 20);PDF_set_text_pos(p,

46、Left, Top);PDF_show(p, Using PDF_set_text_pos and PDF_show to output text:);Top-=30;PDF_set_text_pos(p, Left+20, Top);PDF_show(p, UniGB-UCS2-H encoding:);PDF_setfont(p, Font_CS, 24);Top-=30;PDF_set_text_pos(p, Left+20, Top);PDF_show2(p, TextUnicode, 8);Top-=30;PDF_setfont(p, Font_E, 20);PDF_set_text

47、_pos(p, Left+20, Top);PDF_show(p, GB-EUC-H encoding:);PDF_setfont(p, Font_CS2, 24);Top-=30;PDF_set_text_pos(p, Left+20, Top);PDF_show2(p, TextCpArray36, 8);/* Using PDF_show_xy function. */Top-=50;PDF_setfont(p, Font_E, 20);PDF_show_xy(p, Using PDF_show_xy to output text: , Left, Top);Top-=30;PDF_sh

48、ow_xy(p, UniGB-UCS2-H encoding: , Left+20, Top);PDF_setfont(p, Font_CS, 24);Top-=30;PDF_show_xy2(p, TextUnicode, 8, Left+20, Top);Top-=30;PDF_setfont(p, Font_E, 20);PDF_show_xy(p, GB-EUC-H encoding:, Left+20, Top);Top-=30;PDF_setfont(p, Font_CS2, 24);PDF_show_xy2(p, TextCpArray36, 8, Left+20, Top);/

49、* Using PDF_continue_text function. */Top-=30;PDF_setfont(p, Font_E, 20);PDF_set_text_pos(p, Left, Top);PDF_continue_text(p, Using PDF_continue_text to output text:);Top-=30;PDF_set_text_pos(p, Left+20, Top);PDF_continue_text(p, UniGB-UCS2-H encoding:);PDF_setfont(p, Font_CS, 24);PDF_continue_text2(

50、p, TextUnicode, 8);PDF_setfont(p, Font_E, 20);PDF_continue_text(p, GB-EUC-H encoding:);PDF_setfont(p, Font_CS2, 24);PDF_continue_text2(p, TextCpArray36, 8);/* Using PDF_fit_textline function. */Top-=140;PDF_setfont(p, Font_E, 20);PDF_fit_textline(p, Using PDF_fit_textline to output text:, 0, Left, T

51、op, );Top-=30;PDF_fit_textline(p, UniGB-UCS2-H encoding:, 0, Left+20, Top, );PDF_setfont(p, Font_CS, 24);Top-=30;PDF_fit_textline(p, TextUnicode, 8, Left+20, Top, );/* Using PDF_create_textflow, PDF_fit_textflow and PDF_delete_textflow function. */Top-=30;PDF_setfont(p, Font_E, 20);TextFlow = PDF_cr

52、eate_textflow(p,Using PDF_create_textflow, PDF_fit_textflow and PDF_delete_textflow to output text:,0, fontname=Helvetica-Bold fontsize=20 encoding=winansi);PDF_fit_textflow(p, TextFlow, Left, Top, Right, Top-60, );Top-=60;TextFlow = PDF_create_textflow(p, UniGB-UCS2-H encoding:, 0,fontname=Helvetic

53、a-Bold fontsize=20 encoding=winansi);PDF_fit_textflow(p, TextFlow, Left+20, Top, Right, Top-30, );Top-=30;TextFlow = PDF_create_textflow(p, TextUnicode, 8, fontname=STSong-Lightfontsize=24 encoding=UniGB-UCS2-H textlen=8);PDF_fit_textflow(p, TextFlow, Left+20, Top, Right, Top-30, );PDF_delete_textfl

54、ow(p, TextFlow);/* End of page. */PDF_end_page_ext(p, );PDF_end_document(p, );PDF_CATCH(p) printf(PDFlib exception occurred in pdflib_cs3 sample:n);printf(%d %s: %sn,PDF_get_errnum(p), PDF_get_apiname(p), PDF_get_errmsg(p);PDF_delete(p);return(2);PDF_delete(p);return 0;1.MFC中BROWSEINFO结构中包含有用户选中目录的重

55、要信息。BROWSEINFO结构定义typedef struct_browseinfo HWND hwndOwner;LPCITEMIDLIST pidlRoot;LPSTR pszDisplayName;LPCSTR lpszTitle;UINT ulFlags;BFFCALLBACK lpfn;LPARAM lParam;int iImage;BROWSEINFO,*PBROWSEINFO,*LPBROWSEINFO;成员变量hwndOwner:浏览文件夹对话框的父窗体句柄。pidlRoot:ITEMIDLIST结构的地址,包含浏览时的初始根目录,而且只有被指定的目录和其子目录才显示在浏览

56、文件夹对话框中。该成员变量可以是NULL,在此时桌面目录将被使用。pszDisplayName:用来保存用户选中的目录字符串的内存地址。该缓冲区的大小缺省是定义的MAX_PATH常量宏。lpszTitle:该浏览文件夹对话框对话框的显示文本,用来提示该浏览文件夹对话框的功能、作用和目的。ulFlags:该标志位描述了对话框的选项。它可以为0,也可以是以下常量的任意组合:BIF_BROWSEFORCOMPUTER:返回计算机名。除非用户选中浏览器中的一个计算机名,否则该对话框中的“OK”按钮为灰色。BIF_BROWSEFORPRINTER:返回打印机名。除非选中一个打印机名,否则“OK”按钮为灰

57、色。BIF_BROWSEINCLUDEFILES:浏览器将显示目录,同时也显示文件。BIF_DONTGOBELOWDOMAIN:在树形视窗中,不包含域名底下的网络目录结构。BIF_EDITBOX:浏览对话框中包含一个编辑框,在该编辑框中用户可以输入选中项的名字。BIF_RETURNFSANCESTORS:返回文件系统的一个节点。仅仅当选中的是有意义的节点时,“OK”按钮才可以使用。BIF_RETURNONLYFSDIRS:仅仅返回文件系统的目录。例如:在浏览文件夹对话框中,当选中任意一个目录时,该“OK”按钮可用,而当选中“我的电脑”或“网上邻居”等非有意义的节点时,“OK”按钮为灰色。BIF_STATUSTEXT:在对话框中包含一个状态区域。通过给对话框发送消息使回调函数设置状态文本。BIF_VALIDATE:当没有BIF_EDITBOX

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!