定义全局变量
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文件后,按播放,ofn、szFile、play又被初始化,导致无法播放。
全局变量的定义是在一个.cpp的文件中定义,再在一个.h的文件中使用关键字extern进行声明,其他需要使用该全局变量的文件#include该头文件即可。
用GetWindowLong从窗口句柄取得执行实体句柄:HINSTANCE ai = (HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
PlaySound用于播放嵌入式wav资源文件时,其中要用到第二个参数hmod:PlaySound(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’);就可以了。为什么呢?