打开文件函数

打开文件对话框的使用

首先#include <commdlg.h>

case IDC_OK:  //点确定选择

{OPENFILENAME ofn;


char szFile[MAX_PATH];


ZeroMemory(&ofn,sizeof(ofn));///memset结构体清零  ZeroMemory是memst取零 的特殊情况

 


ofn.lStructSize = sizeof(ofn);


ofn.lpstrFile = szFile;


ofn.lpstrFile[0] = TEXT('/0');


ofn.nMaxFile = sizeof(szFile);


ofn.lpstrFilter = TEXT("ALL/0*.*/0Text/0*.TXT/0"); 过滤器


ofn.nFilterIndex = 1;


ofn.lpstrFileTitle = NULL;


ofn.nMaxFileTitle = 0;


ofn.lpstrInitialDir = NULL;

ofn.hwndOwner = hwnd;//自学能力、探索能力、猜测能力


ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;


if (GetOpenFileName(&ofn))


{

FILE*fp=fopen(szFile,"r")

 

char line [256];

fgets(line,sizeof(line),fp);

fcloae(fp);

SetDlgItemText(hwnd,IDC_EDIT1,line);
}

 参数太多只能搞Struct。下面将对这段代码作解释:

1)、ZeroMemory的含义见上边

2char szFile[MAX_PATH];//定义一个长度为MAX_PATHchar数组。

MAX_PATH是系统定义的一个宏,260Windows操作系统文件路径的最大长度。

3ofn.lpstrFile = szFile;
//szFile是一个字符数组,那么szFile这个名字就代表这个字符数组的首地址

4)文件类型过滤器

*.*就表示所有文件

*.txt就表示所有文本文件

abc*.*就表示所有以abc开头的文件

abc*.txt就表示所有以abc开头的文本文件(txt

ofn.lpstrFilter = TEXT("ALL/0*.*/0Text/0*.TXT/0");用“/0”分割出几个段,每两段是一组过滤器,每组的第一个段代表过滤器的显示的值,而第二段表示真正的过滤器

5ofn.nFilterIndex = 2;默认选择第几个过滤器,是1开始的,不是0.这也是试验出来的。

6windows的一个惯例:结构体的指针类型别名一般是LP+结构体的名字

GetOpenFileName(&ofn)而不是GetOpenFileName(ofn),因为GetOpenFileName函数要的是OPENFILENAME的指针

7)用户关闭对话框,GetOpenFileName函数返回,返回值是BOOL,等于TRUE表示用户选择了文件,如果等于FALSE就表示用户选择了【取消】按钮

1GetOpenFileName

(2)课上练习:打开对话框,用户选择一个音乐文件,然后用MCIsendString播放,注意ShortPath的问题。如何让音乐文件跟着文件走,GetModuleFileNameGetCurrentDirectory

3)打开多个文件:

增加OFN_ALLOWMULTISELECT选项后测试一下

加在ofn.Flags(if上面) 后面 ofn.Flags = OFN_EXPLORER |OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST|OFN_ALLOWMULTISELECT;

发现如果选择一个文件后显示的还是这个文件的路径,可是如果选择多个文件显示的就只有目录的路径,怎么回事?

调试一下,看看szFile在内存中的样子。调试的是发现内存中的样子是目录的路径然后加上各个文件名,中间用“/0”分割,现在明白为啥值显示目录的路径了吗?

大家明白这一点就可以了,有兴趣的可以课后来做多文件选择的处理。做播放器的时候经常需要这个功能,也就是播放列表。有一篇文章可以参考一下:

下面的代码演示了如何得到GetOpenFileName允许多选的情况下选择的文件名
#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
 OPENFILENAME ofn;
 TCHAR szOpenFileNames[80*MAX_PATH];
 TCHAR szPath[MAX_PATH];
 TCHAR szFileName[80*MAX_PATH];
 TCHAR* p;
 int nLen = 0;
 ZeroMemory( &ofn, sizeof(ofn) );
 ofn.Flags = OFN_EXPLORER | OFN_ALLOWMULTISELECT;
 ofn.lStructSize = sizeof(ofn);
 ofn.lpstrFile = szOpenFileNames;
 ofn.nMaxFile = sizeof(szOpenFileNames);
 ofn.lpstrFile[0] = '/0';
 ofn.lpstrFilter = TEXT("All Files(*.*)/0*.*/0");
 if( GetOpenFileName( &ofn ) )
 {  
  //把第一个文件名前的复制到szPath,即:
  //如果只选了一个文件,就复制到最后一个'/'
  //如果选了多个文件,就复制到第一个NULL字符
  lstrcpyn(szPath, szOpenFileNames, ofn.nFileOffset );
  //当只选了一个文件时,下面这个NULL字符是必需的.
  //这里不区别对待选了一个和多个文件的情况
  szPath[ ofn.nFileOffset ] = '/0';
  nLen = lstrlen(szPath);
  
  if( szPath[nLen-1] != '//' )   //如果选了多个文件,则必须加上'//'
  {
   lstrcat(szPath, TEXT("//"));
  }
  
  p = szOpenFileNames + ofn.nFileOffset; //把指针移到第一个文件
  
  ZeroMemory(szFileName, sizeof(szFileName));
  while( *p )
  {   
   lstrcat(szFileName, szPath);  //给文件名加上路径  
   lstrcat(szFileName, p);    //加上文件名  
   lstrcat(szFileName, TEXT("/n")); //换行   
   p += lstrlen(p) +1;     //移至下一个文件
  }
  MessageBox(NULL, szFileName, TEXT("MultiSelect"), MB_OK);
 }
==============================================
欢迎交流,欢迎评论,欢迎指正

2GetSaveFileName
    保存文件对话框

只要把函数GetOpenFileName换成GetSaveFileNameOFN本来是OpenFileName的简写,它SaveFileName也跑来凑热闹,吼吼。如果需要保存文件覆盖提示怎么办呢?看看OFN有选项吗?

OFN_OVERWRITEPROMPT

3.Mcisendstring函数播放音乐,配合GetOpenFileName实现播放器

mciSendString(“play ***”,"",0,NULL);(可单独应用)

 

头文件"mmsystem.h"

 

Mcisendstring更多用法(暂停、继续、录音、播放进度控制)参考

MCI函数中,有些只适用于一种接口方式,有些则两种接口都可以用。mciSendString只适用于命令串接口方式(命令串中不区分大小写)。

  mciSendString(发送命令串),函数原型为:

  MCIERROR mciSendString( // 出错返回非零值(错误代码)

  // 可用mciGetErrorString获得错误的文本描述

  LPCTSTR lpszCommand, // 指向以null结尾的命令字符串:”命令 设备[ 参数]”

  LPTSTR lpszReturnString,// 指向接收返回信息的缓冲区,为NULL时不返回信息

  UINT cchReturn, // 上述缓冲区的大小

  HANDLE hwndCallback // 在命令串中含notify时,它指定一个回调窗口的句柄

  // 一般为NULL

  );

  如:mciSendString(L"open sample.wav type waveaudio alias wave", NULL, 0, NULL);

  MCI函数中还有一个只适用于命令串接口的函数为mciExcute,mciExcute(执行)是mciSendString的简化形式:

  BOOL mciExcute(LPCTSTR lpszCommand); // 成功返回TRUE

  该函数只有Win16支持,Win32不支持,可自写一函数实现:

  BOOL mciExcute(LPCTSTR lpszCommand) {

  if (mciSendString(lpszCommand, NULL, 0, NULL)) return FALSE;

  return TRUE;

  }

  如:mciExcute(L"open sample.wav type waveaudio alias wave");

  mciSendString是用来播放多媒体文件的API指令,可以播放MPEG,AVI,WAV,MP3,等等,下面我们来介绍一

  下它的使用方法:

  一,打开多媒体文件。

  首先在Dialog上面放一个Picture控件,MCISendString就在这个Picture控件的平面上播放多媒体文件,

  设Picture控件的ID为IDC_STATIC1:

  CStatic *pStatic=(CStatic*)GetDlgItem(IDC_STATIC1);HWND h=pStatic->GetSafeHwnd();

  CString open1;

  char buf[256];

  open1.Format("open f:""mpeg""mpeg1.avi type MPEGVideo Alias movie parent %u Style %u notify", h,WS_CHILD);

  mciSendString(open1.GetBuffer(open1.GetLength()),buf,sizeof(buf),NULL);

  这样F盘下面的mpeg目录下的mpeg1.avi就打开了,其中的type MPEGVideo是指打开MPEG,AVI等类型,如果不加

  type MPEGVideo这一句,就是打开WAV,MP3等,Alias movie定义了mpeg1.avi的别名为movie,以后可以通过操

  做movie就可以操作mpeg1.avi。

  二,播放多媒体文件。

  上面我们已经打开了f:"mpeg"mpeg1.avi,现在我们来播放它:

  mciSendString("play movie",buf,sizeof(buf),NULL);

  如果想全屏播放:

  mciSendString("play movie fullscreen",buf,sizeof(buf),NULL);

  三,暂停播放。

  mciSendString("pause movie",buf,sizeof(buf),NULL);

  四,停止播放。

  mciSendString("close movie",buf,sizeof(buf),NULL);

  五,得到所播放文件的长度。

  char sPosition[256];long lLength;

  mciSendString("Status movie length", sPosition, 255,0);lLength=strtol(sPosition, NULL, 10);

  其中lLength就是所播放文件的长度。

  六,得到所播放文件的声音大小。

  char chVolume[256];long lVolume;mciSendString("status movie volume",chVolume,255,0);lVolume=strtol(chVolume,NULL,10);其中lVolume就是所播放文件的声音大小。

  七,到你指定的位置播放。

  CString step1;long lPosition;

  lPosition=100;

  step1.Format("seek movie to %ld",lPosition);

  mciSendString(step1.GetBuffer(step1.GetLength()),buf,sizeof(buf),0);

  其中lPosition就是要到的播放位置,可以由你指定。

  命令串

  1)CD

  wchar_t buf[256];

  MCIERROR err = mciSendString(L"open cdaudio alias cd", NULL, 0, NULL); // 打开CD

  if (err) {

  if (mciGetErrorString(err, buf, 256))

  MessageBox(buf, L"Error"); // 获得并显示错误串

  return;

  }

  mciSendString(L"status cd number of tracks", buf, 256, NULL); // 获得音轨总数

  m_nTracks = wcstol(buf, NULL, 10); // 这里使用了宽字符版的字符串到整数的

  // 转换函数:long wcstol( const wchar_t *nptr, wchar_t **endptr, int base );

  wsprintf(buf, L"play cd from %d to %d", m_nFrom, m_nTo);

  mciSendString(buf, NULL, 0, NULL); // 从音轨m_nFrom头播放到音轨m_nTo–1尾

  其他常用命令:

  mciSendString(L"set cd time format tmsf", NULL,0,NULL); // 设置时间格式为

  // 轨(<100):分(<100):秒(<60):帧(<75),一秒=75块,一块=98帧

  mciSendString(L"set cd door open", NULL, 0, NULL); // 打开光驱

  mciSendString(L"set cd door closed", NULL, 0, NULL); // 关闭光驱

  mciSendString(L"pause cd", NULL, 0, NULL); // 暂停播放

  mciSendString(L"resume cd", NULL, 0, NULL); // 恢复播放

  mciSendString(L"stop cd", NULL, 0, NULL); // 停止播放

  mciSendString(L"close cd", NULL, 0, NULL); // 关闭CD设备

  mciSendString(L"status cd length", buf, 256, NULL); // 获得整个CD的音轨总长度

  mciSendString(L"status cd length track 5", buf, 256, NULL); // 获得第5个音轨的长度

  mciSendString(L"status cd current track", buf, 256, NULL); // 获得当前音轨号

  注意:

  "play cd from m_nFrom to m_nTo"是完整形式,它还有其他形式:

  "play cd from m_nFrom"从m_nFrom播放到盘尾

  "play cd to m_nTo"从当前位置播放到指定音轨

  "play cd" 从当前位置播放到盘尾

  例如播放最后一首歌:"play cd from m_nLast"

  2)WAV

  wchar_t buf[256];

  wsprintf(buf, L"open /"%s/" alias sound type waveaudio", pDoc->strFilePath);

  MCIERROR err = mciSendString(buf, NULL, 0, NULL);

  if (err) {

  if (mciGetErrorString(err, buf, 256)) MessageBox(buf, L“Error”);

  return;

  }

  // t1和t2为用户指定的起止时间(单位为秒,浮点变量)

  DWORD start = (DWORD)(t1 * 1000 + 0.5), end = (DWORD)(t2 * 1000 + 0.5);

  wsprintf(buf, L"play sound from %ld to %ld", start, end);

  mciSendString(buf, NULL, 0, NULL);

  其他常用命令:

  mciSendString(L"status sound length", buf, 256, NULL);

  mciSendString(L"pause sound", NULL, 0, NULL);

  mciSendString(L"play sound", NULL, 0, NULL); // 从当前位置播放到文件尾

mciSendString应用举例

————————————————————————————————

先加头文件#include<mmsystem.h>

switch(id)

{   case  IDC_OK:

    {mciSendString ("play  音乐路径",0,NULL);

     }

}

——————————————

GetShortPathName   将长路径变为短路径

应用举例

switch(id)

{   case  IDC_OK:

    {TCHAR shortPath[MAX_PATH];

   GetShortPathNAME(路径, shortPath,sizeof(shortPath));

TCHAR cmd[MAX_PATH+10];//(+play)

wspfintf(cmd,"play%s" ,shortPath);

       mciSendString ("play  音乐路径",0,NULL);

     }

}

注意路径/应用转义符 D://……//

————————————————

 

  mciSendString(L"stop sound", NULL, 0, NULL);

  mciSendString(L"close sound", NULL, 0, NULL);

 

http://msdn.microsoft.com/en-us/library/dd743572(VS.85).aspx

作业:自己动手写播放器

更多控件用法 http://msdn.microsoft.com/en-us/library/bb773169(VS.85).aspx VC就是全部、VC不是唯一:C-FreePelles CDev C++CodeBlocksC-Free使用演示(VistaWin7上资源编辑器可能有问题)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值