定义全局变量

OPENFILENAME ofn;
TCHAR szFile[MAX_PATH];
int play = 0;

处理过程

void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
{
 ZeroMemory(&ofn, sizeof(ofn));
 ofn.lStructSize = sizeof(ofn);
 ofn.lpstrFile = szFile;
 //ofn.lpstrFile[0] = TEXT('\0');
 ofn.nMaxFile = sizeof(szFile);
 ofn.lpstrFilter = TEXT("*.wav\0*.wav\0");
 ofn.nFilterIndex = 1;
 ofn.lpstrFileTitle = NULL;
 ofn.nMaxFileTitle = 0;
 ofn.lpstrInitialDir = NULL;
 ofn.Flags = OFN_EXPLORER | OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    switch(id)
    {
     case IDC_BTNOPEN:
    if(GetOpenFileName(&ofn))
    {
     SetDlgItemText(hwnd, IDC_EDTPATH, szFile);
     SetDlgItemText(hwnd, IDC_EDTSTATIC, TEXT("
已打开"));
     play = 1;
    }
     break;
     case IDC_BTNPLAY:
      if(play)
      {
       //PlaySound(szFile, hAppInstance, SND_FILENAME | SND_ASYNC);
       PlaySound(szFile, NULL, SND_FILENAME | SND_ASYNC);
       SetDlgItemText(hwnd, IDC_EDTSTATIC, TEXT("
播放"));
      }
     break;
     case IDC_BTNSTOP:
      if(play)
      {
       //PlaySound(szFile, hAppInstance, SND_FILENAME | SND_ASYNC);
       PlaySound(NULL, NULL, SND_FILENAME | SND_SYNC);
       SetDlgItemText(hwnd, IDC_EDTSTATIC, TEXT("
停止"));
      }
     break;
        default:break;
    }
}

Windows程序主要是OS与函数以及函数与函数的相互调用,因此在写WavPlayer对话框版时,要注意到变量的作用域以及全局变量的定义。在Main_OnCommand里定义变量打开wav文件后,按播放,ofnszFileplay又被初始化,导致无法播放。

全局变量的定义是在一个.cpp的文件中定义,再在一个.h的文件中使用关键字extern进行声明,其他需要使用该全局变量的文件#include该头文件即可。

GetWindowLong从窗口句柄取得执行实体句柄:HINSTANCE ai = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);

PlaySound用于播放嵌入式wav资源文件时,其中要用到第二个参数hmodPlaySound(TEXT("IDW_MUSIC"),appInstance,SND_RESOURCE|SND_ASYNC| SND_LOOP);

问题:

ofn.lpstrFile[0] = TEXT('\0');这句是将ofn.lpstrFile所指字符串置零,起到初始化的作用。在VC6.0里,通过调试查看其和szFile的值是正确的路径。
但在用C-Free写的这个程序里,发现X盘路径是“\000:……”,显示出来确实是“X:……”,但是用在PlaySound里却无法播放wav文件。
去掉了ofn.lpstrFile[0] = TEXT('\0');就可以了。为什么呢?

 

 

WavPlayer对话框版