// BadApple1.cpp : 定义控制台应用程序的入口点。

//


#include "stdafx.h"

#include<iostream>

#include<string.h>

#include<time.h>

#include<windows.h>

#include <mmsystem.h>

#pragma comment(lib,"winmm.lib")

using namespace std;


void playMusic()

{

MCIERROR mciError;

wchar_t  buf[50];

mciError = mciSendString(TEXT("open BadApple.mp3 alias mysong"),NULL,0,NULL);

if(mciError)

{

mciGetErrorString(mciError,buf,50);

//MessageBox(buf);

return ;

}

mciSendString(TEXT("play mySong"),NULL,0,NULL);

}


void gotoxy (int x, int y)

{

COORD coord; // coordinates

coord.X = x; coord.Y = y; // X and Y coordinates

SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord); // moves to the coordinates

}


void PrintChar(char *ch,UINT count,UINT x,UINT y)  //在坐标(x,y)处输出字符串ch,ch里有count个字符

{

HANDLE h=GetStdHandle(STD_OUTPUT_HANDLE);

COORD pos;

ULONG unuse;

pos.X=x;

pos.Y=y;

CONSOLE_SCREEN_BUFFER_INFO bInfo; // 窗口缓冲区信息

GetConsoleScreenBufferInfo(h, &bInfo );

WriteConsoleOutputCharacterA(h,ch,count,pos,&unuse);

}


class BadApple

{

public:

BadApple();

void recursur();

void display();

FILE *fp;

private:

int frame,caf;

clock_t stime,ftime;

char buf[1920],seat[20];

};


BadApple::BadApple()

{

frame=0;

caf=33;

stime=clock();

stime=clock();

}


void BadApple::recursur()

{

HANDLE hout;

COORD coord;

coord.X = 0;

coord.Y = 0;

hout = GetStdHandle(STD_OUTPUT_HANDLE);

SetConsoleCursorPosition(hout,coord);

}


void BadApple::display()

{

playMusic();

fp = fopen("AscPic.txt", "r");

int count =0 ;

char Line[162];

while (!feof(fp))

{

caf =26;

for(int loop = 0; loop < 61; loop++)

{

if(fgets(Line, 162, fp) == NULL)

{

break;

}

Line[161] = '\0';

PrintChar(Line,161,0,loop);

}

Sleep(caf);

count++;

}


}


int _tmain(int argc, _TCHAR* argv[])

{

system("color F0");

system("mode con cols=162 lines=58");

cout<<"-----Bad Apple字符画播放器-----"<<endl<<"\t按Enter键播放\t"<<endl;

getchar();

system("cls");

BadApple A;

A.display();

system("cls");

cout<<"-----感谢你的观看!-----"<<endl<<"作者:chuan 修改者:Alice.小杰"<<endl<<"\t按Enter键退出\t"<<endl;

getchar();

}



参考人家写的badApple,其实主要控制字符的输出,还有控制声音的播放。



控制mp3的播放:

MCI ApI 头文件#include <mmsystem.h>

MCIERROR mciSendString(

      LPCTSTR lpszCommand,    //MCI命令字符串

      LPTSTR lpszReturnString, //存放反馈信息的缓冲区

      UINT  cchReturn,     //缓冲区的长度

      HANDLE hwndCallback    //回调窗口的句柄,一般为NULL

    );

//靠发送命令来播放如:mciSendString(TEXT("open BadApple.mp3 alias mysong"),NULL,0,NULL);


GetStdHandle()返回标准的输入、输出或错误的设备的句柄,也就是获得输入、输出/错误的屏幕缓冲区的句柄。

STD_INPUT_HANDLE 标准输入的句柄 
STD_OUTPUT_HANDLE 标准输出的句柄 

STD_ERROR_HANDLE 标准错误的句柄

一些接口:

FillConsoleOutputAttribute API 将属性写入屏幕缓冲区 
FillConsoleOutputCharacter API 将字符写入屏幕缓冲区 
FlushConsoleInputBuffer API 清除控制台输入缓冲区 
FlushFileBuffers API 清除文件缓冲区 
FreeConsole API 释放控制台 
FreeDDElParam API 释放DDE消息IPARAM 
GetConsoleCP API 为控制台输入获取代码页 
GetConsoleCursorInfo API 返回光标大小 
GetConsoleMode API 返回控制台输入输出模式 
GetConsoleOutputCP API 为控制台输出获取代码页 
GetConsoleScreenBufferInfo API 返回屏幕缓冲区信息 
GetConsoleTitle API 返回控制台窗口标题 
GetCurrentProcess API 返回当前进程的句柄 
GetCurrentProcessId API 返回当前进程ID值 
GetCurrentThread API 返回当前线索的句柄 
GetCurrentThreadId API 返回当前线索ID值 
GetCursor API 返回当前光标的句柄 
GetCursorPos API 返回当前光标的位置 
GetDlgItem API 返回对话框控件句柄 
GetForegroundWindow API 返回前景窗口句柄 
GetFocus API 返回当前焦点窗口句柄 
GetKeyboardType API 返回键盘信息 
GetNumberOfConsoleInputEvents API 返回控制台队列事件数 
GetTextCharsetInfo API 返回当前字体设置信息 
GetTextColor API 返回当前文本色彩 
GetTextFace API 返回当前字体的字样 
GetTextMetrics API 返回当前字体的公制 
SetConsoleActiveScreenBuffer API 改变显示屏幕缓冲区 
SetConsoleCP API 设置控制台输入代码页 
SetConsoleCtrlHandler API 设置控制台进程的单个句柄 
SetConsoleCursorInfo API 设置控制台光标大小 
SetConsoleCursorPosition API 设置控制台光标位置 
SetConsoleMode API 设置控制台输入输出模式 
SetConsoleOutputCP API 设置控制台输出代码页 
SetConsoleScreenBufferSize API 改变屏幕缓冲区大小 
SetConsoleTextAttribute API 设置屏幕文本属性 
SetConsoleTitle API 设置控制台窗口标题字符串 
SetConsoleWindowInfo API 设置控制台窗口大小


system("cls");控制清屏。

如果改变光标坐标,会有闪屏的情况。其次要控制帧数,主要靠sleep来控制,每一祯有控制好字符串的显示。