标题: [已解决] 江湖求救啊!请问,播放音乐的变量怎么制作? [打印本页]
作者: zzz19760225 时间: 2024-9-2 17:51 标题: [已解决] 江湖求救啊!请问,播放音乐的变量怎么制作?
本帖最后由 zzz19760225 于 2024-9-5 20:09 编辑
win10+vc6.0(不会整vc2013)
模仿Five66的#if#else#endif,到音乐mp3卡住了。
编译通过,但是莫得声音了!- Deleting intermediate files and output files for project 'a3b5 - Win32 Debug'.
- --------------------Configuration: a3b5 - Win32 Debug--------------------
- Compiling...
- a3b5.cpp
- Linking...
-
- a3b5.exe - 0 error(s), 0 warning(s)
复制代码
开始用的
mciSendString("close 1.mp3", NULL, 0, NULL);
mciSendString("play 1.mp3", NULL, 0, NULL);
是可以关闭和播放的。- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- #include <windows.h>
- #include <graphics.h>
- #include <stdio.h>
- #include <string.h>
- #include <mmsystem.h>
-
- #ifdef _MSC_VER
- #pragma warning(disable:4996)
- #endif
-
- int main (){
-
- #ifdef UNICODE
- wchar_t str[1024]={0};
- #else
- char str[1024]={0};
- #endif
-
- initgraph(1200, 700);
- int a = 0;
-
- while (!kbhit())
- {
-
- #ifdef UNICODE
- swprintf(str,111,L"哈哈%d.mp3",a);
- #else
- sprintf(str,"哈哈%d.mp3",a);
- #endif
-
- MOUSEMSG msg = GetMouseMsg();
- if (msg.uMsg == WM_LBUTTONDOWN) { a=a+1;
- mciSendString("close str", NULL, 0, NULL);
- mciSendString("play str", NULL, 0, NULL); }
-
- if (msg.uMsg == WM_RBUTTONDOWN) { a=a-1;
- mciSendString("close str", NULL, 0, NULL);
- mciSendString("play str", NULL, 0, NULL); }
-
- #ifdef UNICODE
- swprintf(str,111,L"%d.jpg",a);
- #else
- sprintf(str,"%d.jpg",a);
- #endif
-
- IMAGE img;
- loadimage(&img,str,1200,500);
- putimage(0, 0, &img);
-
- #ifdef UNICODE
- swprintf(str,111,L"%d.txt",a);
- #else
- sprintf(str,"%d.txt",a);
- #endif
-
- FILE *file = fopen(str, "r");// 打开并读取文本文件
- if (file) {
- char buffer[1024];
- int y = 600; // 假设图片下方开始显示文本,上下600位置写字
- char *line;
- while (fgets(buffer, sizeof(buffer), file))
- {// 逐行读取文件内容并显示
- line = strdup(buffer); // 复制行以便修改
- outtextxy(20, y, line); // 显示文本,假设从(20, y)开始
- free(line); // 释放行内存
- y += 20; // 下一行的y坐标
- }
- fclose(file); // 关闭文件
- }
-
- }
- Sleep(3300);
-
- closegraph();
- return 0;
- }
复制代码
求大侠出手。先谢了
把str和a组合起来也不行
mciSendString("play stra", NULL, 0, NULL);
作者: Five66 时间: 2024-9-4 22:54
啊,那又不会自动展开或插值
mciSendString("play stra", NULL, 0, NULL);中的play stra就只是play stra,意思是播放stra这个文件
这里想要用变量挺麻烦的,而且要是还要兼顾ansi和unicode的话,倒是c++的string貌似可以直接相加(像这样:"play "+str)
总之试试参考下面的- #pragma comment(lib,"winmm.lib")
- #pragma comment(lib,"user32.lib")
-
- TCHAR *szBuffer=(TCHAR *)calloc(1024,sizeof(TCHAR));
-
- wsprintf(szBuffer,TEXT("%s 哈哈%d.mp3"),TEXT("close"),a);
- mciSendString(szBuffer, NULL, 0, NULL);
-
- wsprintf(szBuffer,TEXT("%s 哈哈%d.mp3"),TEXT("play"),a);
- mciSendString(szBuffer, NULL, 0, NULL); }
复制代码
作者: zzz19760225 时间: 2024-9-5 15:14
本帖最后由 zzz19760225 于 2024-9-6 10:45 编辑
可以播放了,这就可以类似一个基本的简单电*影*了。- #include <stdio.h>
- #include <stdlib.h>
- #include <conio.h>
- #include <windows.h>
- #include <graphics.h>
- #include <stdio.h>
- #include <string.h>
- #include <mmsystem.h>
- #pragma comment(lib,"winmm.lib")
- #pragma comment(lib,"user32.lib")
-
- #ifdef _MSC_VER
- #pragma warning(disable:4996)
- #endif
-
- int main (){
-
- #ifdef UNICODE
- wchar_t str[1024]={0};
- #else
- char str[1024]={0};
- #endif
-
- TCHAR *szBuffer=(TCHAR *)calloc(1024,sizeof(TCHAR));
- initgraph(1200, 700);
- int a = 0;
-
- while (!kbhit())
- {
-
- MOUSEMSG msg = GetMouseMsg();
- if (msg.uMsg == WM_LBUTTONDOWN) {
- wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
- mciSendString(szBuffer, NULL, 0, NULL);
- a=a+1; }
-
- if (msg.uMsg == WM_RBUTTONDOWN) {
- wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
- mciSendString(szBuffer, NULL, 0, NULL);
- a=a-1; }
-
- wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("play"),a);
- mciSendString(szBuffer, NULL, 0, NULL);
-
- #ifdef UNICODE
- swprintf(str,111,L"%d.jpg",a);
- #else
- sprintf(str,"%d.jpg",a);
- #endif
-
- IMAGE img;
- loadimage(&img,str,1200,500);
- putimage(0, 0, &img);
-
- #ifdef UNICODE
- swprintf(str,111,L"%d.txt",a);
- #else
- sprintf(str,"%d.txt",a);
- #endif
-
- FILE *file = fopen(str, "r");// 打开并读取文本文件
- if (file) {
- char buffer[1024];
- int y = 600; // 假设图片下方开始显示文本,上下600位置写字
- char *line;
- while (fgets(buffer, sizeof(buffer), file))
- {// 逐行读取文件内容并显示
- line = strdup(buffer); // 复制行以便修改
- outtextxy(20, y, line); // 显示文本,假设从(20, y)开始
- free(line); // 释放行内存
- y += 20; // 下一行的y坐标
- }
- fclose(file); // 关闭文件
- }
-
- }
- Sleep(3300);
-
- closegraph();
- return 0;
- }
复制代码
单独开和关都可以,但是组合起来,预备的两个音乐会点击混合在一起播放,也就是需要的单独一个播放,属于关闭的逻辑线有问题,得用另外一个变量再慢慢磨一下。
现在得去买菜去。
谢谢老师的代码- MOUSEMSG msg = GetMouseMsg();
- if (msg.uMsg == WM_LBUTTONDOWN) { a=a+1; }
- if (msg.uMsg == WM_RBUTTONDOWN) { a=a-1; }
-
- wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
- wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("play"),a);
- mciSendString(szBuffer, NULL, 0, NULL);
复制代码
换成- MOUSEMSG msg = GetMouseMsg();
- if (msg.uMsg == WM_LBUTTONDOWN) {
- wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
- mciSendString(szBuffer, NULL, 0, NULL);
- a=a+1; }
-
- if (msg.uMsg == WM_RBUTTONDOWN) {
- wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
- mciSendString(szBuffer, NULL, 0, NULL);
- a=a-1; }
-
- wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("play"),a);
- mciSendString(szBuffer, NULL, 0, NULL);
复制代码
就可以关了再开的换歌曲了。问题结束,再次感谢。
(下面应该是概念里的无限数量组合,根据信息产品单元的数量来,组合出假设的无限,方便自由聚散收放.)
作者: Five66 时间: 2024-9-5 23:45
回复 3# zzz19760225
变量szBuffer是动态分配的,用完后free一下或许会更好点
还有,反正都用了微软msvc专属的东西了
可以将
#ifdef UNICODE
wchar_t str[1024]={0};
#else
char str[1024]={0};
#endif
换成
TCHAR str[1024]={0};
如果不用UNICODE的话,也可以直接换成 char str[1024]={0};
同样的,可以将
#ifdef UNICODE
swprintf(str,111,L"%d.jpg",a);
#else
sprintf(str,"%d.jpg",a);
#endif
和
#ifdef UNICODE
swprintf(str,111,L"%d.txt",a);
#else
sprintf(str,"%d.txt",a);
#endif
换成
wsprintf(str,TEXT("%d.jpg"),a);
和
wsprintf(str,TEXT("%d.txt"),a);
不用UNICODE的话,就直接用sprintf(str,"%d.jpg",a);和sprintf(str,"%d.txt",a);
作者: zzz19760225 时间: 2024-9-6 10:44
一:
#ifdef UNICODE
wchar_t str[1024]={0};
#else
char str[1024]={0};
#endif- #include <conio.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <windows.h>
- #include <graphics.h>
-
- #include <mmsystem.h>
- #pragma comment(lib,"winmm.lib")
- #pragma comment(lib,"user32.lib")
-
- #ifdef _MSC_VER
- #pragma warning(disable:4996)
- #endif
-
- int main (){
-
- #ifdef UNICODE
- wchar_t str[1024]={0};
- #else
- char str[1024]={0};
- #endif
-
- TCHAR *szBuffer=(TCHAR *)calloc(1024,sizeof(TCHAR));
- initgraph(1200, 700);
- int a = 0;
-
- while (!kbhit())
- {
- MOUSEMSG msg = GetMouseMsg();
- if (msg.uMsg == WM_LBUTTONDOWN) {
- wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
- mciSendString(szBuffer, NULL, 0, NULL);
- a=a+1; }
-
- if (msg.uMsg == WM_RBUTTONDOWN) {
- wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
- mciSendString(szBuffer, NULL, 0, NULL);
- a=a-1; }
-
- wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("play"),a);
- mciSendString(szBuffer, NULL, 0, NULL);
-
- #ifdef UNICODE
- swprintf(str,111,L"%d.jpg",a);
- #else
- sprintf(str,"%d.jpg",a);
- #endif
-
- IMAGE img;
- loadimage(&img,str,1200,500);
- putimage(0, 0, &img);
-
- #ifdef UNICODE
- swprintf(str,111,L"%d.txt",a);
- #else
- sprintf(str,"%d.txt",a);
- #endif
-
- FILE *file = fopen(str, "r");// 打开并读取文本文件
- if (file)
- {
- char buffer[1024];
- int y = 600; // 假设图片下方开始显示文本,上下600位置写字
- char *line;
- while (fgets(buffer, sizeof(buffer), file))
- {// 逐行读取文件内容并显示
- line = strdup(buffer); // 复制行以便修改
- outtextxy(20, y, line); // 显示文本,假设从(20, y)开始
- free(line);
- y += 20; // 下一行的y坐标
- }
- fclose(file); // 关闭文件
- }
-
- }
-
- if(szBuffer != NULL) {free(szBuffer);szBuffer=NULL;}
- closegraph();
-
- return 0;
- }
复制代码
二:
TCHAR str[1024]={0};- #include <conio.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <windows.h>
- #include <graphics.h>
-
- #include <mmsystem.h>
- #pragma comment(lib,"winmm.lib")
- #pragma comment(lib,"user32.lib")
-
- #ifdef _MSC_VER
- #pragma warning(disable:4996)
- #endif
-
- int main (){
-
- TCHAR str[1024]={0};
-
- TCHAR *szBuffer=(TCHAR *)calloc(1024,sizeof(TCHAR));
- initgraph(1200, 700);
- int a = 0;
-
- while (!kbhit())
- {
- MOUSEMSG msg = GetMouseMsg();
- if (msg.uMsg == WM_LBUTTONDOWN) {
- wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
- mciSendString(szBuffer, NULL, 0, NULL);
- a=a+1; }
-
- if (msg.uMsg == WM_RBUTTONDOWN) {
- wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
- mciSendString(szBuffer, NULL, 0, NULL);
- a=a-1; }
-
- wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("play"),a);
- mciSendString(szBuffer, NULL, 0, NULL);
-
- wsprintf(str,TEXT("%d.jpg"),a);
-
- IMAGE img;
- loadimage(&img,str,1200,500);
- putimage(0, 0, &img);
-
- wsprintf(str,TEXT("%d.txt"),a);
-
- FILE *file = fopen(str, "r");// 打开并读取文本文件
- if (file)
- {
- char buffer[1024];
- int y = 600; // 假设图片下方开始显示文本,上下600位置写字
- char *line;
- while (fgets(buffer, sizeof(buffer), file))
- {// 逐行读取文件内容并显示
- line = strdup(buffer); // 复制行以便修改
- outtextxy(20, y, line); // 显示文本,假设从(20, y)开始
- free(line);
- y += 20; // 下一行的y坐标
- }
- fclose(file); // 关闭文件
- }
-
- }
-
- if(szBuffer != NULL) {free(szBuffer);szBuffer=NULL;}
- closegraph();
-
- return 0;
- }
复制代码
三:
char str[1024]={0};- #include <conio.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <windows.h>
- #include <graphics.h>
-
- #include <mmsystem.h>
- #pragma comment(lib,"winmm.lib")
- #pragma comment(lib,"user32.lib")
-
- #ifdef _MSC_VER
- #pragma warning(disable:4996)
- #endif
-
- int main (){
-
- char str[1024]={0};
-
- TCHAR *szBuffer=(TCHAR *)calloc(1024,sizeof(TCHAR));
- initgraph(1200, 700);
- int a = 0;
-
- while (!kbhit())
- {
- MOUSEMSG msg = GetMouseMsg();
- if (msg.uMsg == WM_LBUTTONDOWN) {
- wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
- mciSendString(szBuffer, NULL, 0, NULL);
- a=a+1; }
-
- if (msg.uMsg == WM_RBUTTONDOWN) {
- wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("close"),a);
- mciSendString(szBuffer, NULL, 0, NULL);
- a=a-1; }
-
- wsprintf(szBuffer,TEXT("%s %d.mp3"),TEXT("play"),a);
- mciSendString(szBuffer, NULL, 0, NULL);
-
- sprintf(str,"%d.jpg",a);
-
- IMAGE img;
- loadimage(&img,str,1200,500);
- putimage(0, 0, &img);
-
- sprintf(str,"%d.txt",a);
-
- FILE *file = fopen(str, "r");// 打开并读取文本文件
- if (file)
- {
- char buffer[1024];
- int y = 600; // 假设图片下方开始显示文本,上下600位置写字
- char *line;
- while (fgets(buffer, sizeof(buffer), file))
- {// 逐行读取文件内容并显示
- line = strdup(buffer); // 复制行以便修改
- outtextxy(20, y, line); // 显示文本,假设从(20, y)开始
- free(line);
- y += 20; // 下一行的y坐标
- }
- fclose(file); // 关闭文件
- }
-
- }
-
- if(szBuffer != NULL) {free(szBuffer);szBuffer=NULL;}
- closegraph();
-
- return 0;
- }
复制代码
三个都可以编译运行,大赞。
原本想把文本的星号*,看要不要也通用模式用一遍。
行 line
char *line=NULL;
替换 char *line;
if(line != NULL) {free(line);line=NULL;}
替换 free(line);
文本 file
FILE *file =NULL;
file = fopen(str, "r");
if(file != NULL) {free(file);file=NULL;}
替换 FILE *file = fopen(str, "r");
但是不是编译就是exe执行时各种问题,放whlie外面最后清理和whlie里面都不行,就算了。
就最后结束的部分 if(szBuffer != NULL) {free(szBuffer);szBuffer=NULL;}
// 或者直接 free(szBuffer) //
作者: Five66 时间: 2024-9-6 13:55
回复 5# zzz19760225
line那个应该没问题,问题是那个file,因为file还没有使用就free了(也不知道能不能free)
还有line是在if (file) {}之间声明的 ,是个自动变量(局部变量),因此if (file) {}之外是看不见的
同理file是第一个while的自动变量(局部变量)
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |