• //---------------------------------------------------------------------------

    #include <vcl.h>
    #pragma hdrstop

    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    bool __fastcall TForm1::RunCmd(AnsiString cmd,TStringList *stringlist)
    {
    TMemoryStream *memstream=new TMemoryStream();
    AnsiString rn="\\r\\n";
    PROCESS_INFORMATION proc;
    STARTUPINFO start;
    SECURITY_ATTRIBUTES sa;
    long ret;
    unsigned long lngBytesread;
    HANDLE hReadPipe,hWritePipe;
    char *strBuff=(char *)malloc(256);
    if(strBuff==NULL)
    {
    return false;
    }
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle=true;
    sa.lpSecurityDescriptor=NULL;
    ret=CreatePipe(&hReadPipe,&hWritePipe,&sa,0);
    if(ret==0)
    {
    //创建管道失败
    ShowMessage("创建管道失败");
    return false;
    }
    memset(&start,0x00,sizeof(STARTUPINFO));
    start.cb=sizeof(STARTUPINFO);
    start.dwFlags=STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
    start.hStdOutput=hWritePipe;
    start.hStdError=hWritePipe;
    bool retc=CreateProcess(NULL,cmd.c_str(),NULL,NULL,true, 0, 0, NULL, &start, &proc);
    if(!retc)
    {
    return false;
    }
    CloseHandle(hWritePipe);
    unsigned long len;
    memstream->Position=0;
    while(true)
    {
    memset(strBuff,0x00,256);
    GetFileSize(hReadPipe,&len);
    ret = ReadFile(hReadPipe, strBuff, 256, &lngBytesread,NULL);
    if(ret==0)
    {
    break;
    }
    else
    {
    memstream->Write(strBuff,lngBytesread);
    }
    }
    CloseHandle(proc.hProcess);
    CloseHandle(proc.hThread);
    CloseHandle(hReadPipe);
    memstream->Position=0;
    free(strBuff);
    stringlist->LoadFromStream(memstream);
    memstream->Clear();
    delete memstream;
    return true;
    }
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
    TStringList *StrList=new TStringList;
    AnsiString strcmd=Edit1->Text;
    RunCmd(strcmd,StrList);
    Memo1->Clear();
    Memo1->Text=StrList->Text;
    }
    //---------------------------------------------------------------------------
  • [face07]基于winamp插件解码模块,皮肤技术还在继续开发,目前已经有基本雏形了



    下载地址:下载媒体播放器内部版
  • 做播放器的话,嘿嘿,当然离不开皮肤技术了。。。

    [face01]实现皮肤技术有很多种方法,最简单的就是用第三方控件或者皮肤类,但别人的东西终究还是别人的东西,要不就是收费,要不就是有很多限制,所以,好东西呢,还是自己造比较好。。[face07]

    自己实现皮肤的话,首先要解决的就是不规则窗体的问题,因为皮肤界面千变万化,所以窗体是必须要适应皮肤变化的,这个实现起来比较容易,用几个API函数就可以实现了
    分别是:
    CreateRect() //当然还有别的API函数,用来创建多边形等,这个是创建矩形区域的
    RgnCombineRgn() //区域运算用的,主要是把不需要的区域删除,留下需要的界面
    SetWindowRgn() //用来重新设置窗体区域

    比如:现在要根据当前Image里的图片创建不规则窗体
    int x,y; HRGN WndRgn,TempRgn;
    WndRgn=CreateRectRgn(0,0,Image1->Width,Image1->Height);
    for(x=0;x<Width;x++)
    for(y=0;y<Height;y++)
    if(Image1->Canvas->Pixels[x][y]==clBlack)
    {
    TempRgn=CreateRectRgn(x,y,x+1,y+1); 创建需要删除的区域,以象素为单位
    CombineRgn(WndRgn,WndRgn,TempRgn,RGN_XOR); 剔除不必要的区域
    DeleteObject(TempRgn);
    }
    SetWindowRgn(Handle,WndRgn,true);

    就这么简单。。。

    至于按钮之类的,原理和这个都一样,不过要先创建一个所以图片,用来确定按钮在界面中的位置
  • 近来想做一个播放器,找了很久一直都找不到理想的解码器,不过最后还是想到winamp的插件。。。
    [face10]既然winamp基于插件来完成解码,那么它就一定有解码器,只要找到它的接口就可以是使用了

    去官方网站下载winamp的SDK,终于得知它的解码工作交给相应的Input插件模块。
    在 Pulgin 文件夹中有很多的 DLL(动态链接库)文件,其中的in_mp3.dll就是mp3的解码插件,这个插件可以解码AAC/Mpeg1/mpeg2/mpeg3的音频,还有一个in_wm.dll自然就是解码WMA的了

    从SDK文档中得知,每种插件都具有固定的数据结构,如Input模块的数据结构(In_Module ),Output模块的(Out_Module ),同时每种插件的dll都具有约定的入口函数,对于Input插件,其入口函数为
    __declspec( dllexport ) In_Module * winampGetInModule2()

    其结构体:
    typedef struct
    {
    int nVer; // 模块版本号
    char *szDesc; //模块描述信息
    HWND hMainWnd; // Winamp的主窗体句柄(由Winamp来填写)
    HINSTANCE hDllInstance; // DLL实例句柄(由Winamp来填写)
    char *szFileExt; // 扩展名过滤器,格式参见GetOpenFileName
    int nIsSeekable; // 是否可索引媒体,是-你可以拖动进度条,否-反之
    int UsesOutputPlug; // 是否使用输出插件?你想在这个模块里搞定一切?

    // 下面都是函数指针,将被Winamp调用
    void (*Config)(HWND hwndParent); // 配置对话框
    void (*About)(HWND hwndParent); // 关于对话框
    void (*Init)(); // 初始化
    void (*Quit)(); // 退出
    // szFile - 传入的文件名,szTitle - 传出的标题,nLen - 转出的时间长度,毫秒。
    // 如果szFile传NULL,则返回当前播放文件的信息
    void (*GetFileInfo)(char *szFile, char *szTitle, int *nLen);
    int (*InfoBox)(char *szFile, HWND hwndParent); // 弹出文件信息对话框
    int (*IsOurFile)(char *szFile); // 检查文件格式
    int (*Play)(char *szFile); // 开始播放文件szFile,返回0正常,-1错误
    void (*Pause)(); // 暂停处理
    void (*UnPause)(); // 取消暂停
    int (*IsPaused)(); // 是否斩停?1是暂停,0不是
    void (*Stop)(); // 停止播放
    int (*GetLength)(); // 取得长度,毫秒单位
    int (*GetOutputTime)(); // 获取当前时间,一般调用out模块的同名函数即可
    void (*SetOutputTime)(int nTime); // 索引到某一时刻
    void (*SetVolume)(int volume); // 音量调节,从0 - 255
    void (*SetPan)(int pan); // 左右声道平衡,从-127 - 127

    //下面的函数多和AVS、可视化效果、均衡器等有关,具体咱们用不到,就暂时不讲了。
    void (*SAVSAInit)(int maxlatency_in_ms, int srate);
    void (*SAVSADeInit)(); // call in Stop()
    void (*SAAddPCMData)(void *PCMData, int nch, int bps, int timestamp);
    int (*SAGetMode)();
    void (*SAAdd)(void *data, int timestamp, int csa);
    void (*VSAAddPCMData)(void *PCMData, int nch, int bps, int timestamp);
    int (*VSAGetMode)(int *specNch, int *waveNch);
    void (*VSAAdd)(void *data, int timestamp);
    void (*VSASetInfo)(int nch, int srate);
    int (*dsp_isactive)();
    int (*dsp_dosamples)(short int *samples, int numsamples, int bps, int nch, int srate);
    void (*EQSet)(int on, char data[10], int preamp);
    void (*SetInfo)(int bitrate, int srate, int stereo, int synched);

    Out_Module *outMod; // 看看,Winamp终于露出马脚了吧?
    } In_Module;


    这样通过这个入口函数,就可以轻易的得到了Input插件的 In_Module结构体,接下来的事情自然也就很容易了,有了这个结构体,插件的所有功能都可以调用了。

    不过单凭这个Input插件还是不能放出声音来的,因为Input插件虽然能完成mp3或者WMA的解码,但却没有把他们输出来,所以,就得自己写输出模块。不过,winamp有个OutPut插件可以完成输出功能,这就是Out_Wave.dll,加上这个插件,那么播放mp3就非常容易了。

    OutPut插件得入口函数
    __declspec( dllexport ) Out_Module * winampGetOutModule()
    其结构体为:Out_Module
    typedef struct
    {
    // 下面有些和In_Module一样,就不赘述了。
    int nVer;
    char *szDesc;
    int nId; // 自己给一个ID,不知道有什么用,反正大于65536就行了。
    HWND hMainWindow;
    HINSTANCE hDllInstance;
    void (*Config)(HWND hwndParent);
    void (*About)(HWND hwndParent);
    void (*Init)();
    void (*Quit)();
    // nSample - 采样率, nChannels - 声道数,1或2
    // nBitPerSamp - 每采样的位率,nBufLen、nPreBufLen - 缓冲长度,咱们用不到
    // 返回大于0正常播放,小于0失败
    int (*Open)(int nSample, int nChannels, int nBitPerSamp, int nBufLen, int nPreBufLen);
    void (*Close)(); // 关闭输出设备
    // pBuf - 内存数据块,nLen - 数据块的长度
    int (*Write)(char *pBuf, int len); // 返回0成功
  • 作为1.12版歌词串串烧的一个模块,主要用来分解LRC格式的歌词,该模块已经完全封装为一个类,方便调用


    下面是LRC格式的描述

    LRC 歌词是一种包含着“[*:*]”形式的“标签(tag)”的、基于纯文本的歌词专用格式。最早由郭祥祥先生(Djohan)提出并在其程序中得到应用。这种歌词文件既可以用来实现卡拉OK功能(需要专门程序),又能以普通的文字处理软件查看、编辑。当然,实际操作时通常是用专门的LRC歌词编辑软件进行高效编辑的。以下具体介绍LRC格式中的“标签”。
    时间标签(Time-tag)
    形式为"[mm:ss]"或"[mm:ss.fff]"(分钟数:秒数)。数字须为非负整数,比如"[12:34.5]"是有效的,而"[0x0C:-34.5]"无效。

    它可以位于某行歌词中的任意位置。一行歌词可以包含多个时间标签(比如歌词中的迭句部分)。根据这些时间标签,用户端程序会按顺序依次高亮显示歌词,从而实现卡拉OK功能。另外,标签无须排序。

    标识标签(ID-tags)

    其格式为"[标识名:值]"。大小写等价。以下是预定义的标签。

    [ar:艺人名]
    [ti:曲名]
    [al:专辑名]
    [by:编者(指编辑LRC歌词的人)]
    [offset:时间补偿值] 其单位是毫秒,正值表示整体提前,负值相反。这是用于总体调整显示快慢的。

    样例

    [ar:unknown]
    [ti:sample]
    [al:none]
    [by:me]
    [01:02.355][00:00]This line should be sung twice
    [00:05.7]And this one... once only.


    开发标准(供程序员阅读参考)

    以下列出了开发支持LRC格式的软件时应遵守的一些标准。

    无论是否在行首,行内凡具有“[*:*]”形式的都应认为是标签。(注意:其中的冒号并非全角字符“:”)
    凡是标签都不应显示。
    凡是标签,且被冒号分隔的两部分都为非负数,则应认为是时间标签。因此,对于非标准形式(非“[mm:ss]”)的时间标签也应能识别(如“[0:0]”)。
    凡是标签,且非时间标签的,应认为是标识标签。
    标识名中大小写等价。
    为了向后兼容,应对未定义的新标签作忽略处理。另应对注释标签([:])后的同一行内容作忽略处理。
    应允许一行中存在多个标签,并能正确处理。
    应能正确处理未排序的标签。
  • Unicode就是宽字符编码,它与ANSI编码最大的不同就是一个ANSI编码的位宽是8位,而Unicode的位宽是16位,比如:一个Unicode编码的字符 ’A’ 其16进制编码为0x0041,而同样的字符用ANSI编码就会表示为0x41;

    转入正题,不去管Unicode的编码方式,只要能把它识别出来就可以了。Windows SDK中提供了一个API函数,可以把ASCII编码转换为Unicode编码,那就是WideCharToMultiByte()函数,所以编码转换工作就全部交给这个函数了

    看一下WideCharToMultiByte()的原型声明:
    int WideCharToMultiByte(

    UINT CodePage, // code page
    DWORD dwFlags, // performance and mapping flags
    LPCWSTR lpWideCharStr, // address of wide-character string
    int cchWideChar, // number of characters in string
    LPSTR lpMultiByteStr, // address of buffer for new string
    int cchMultiByte, // size of buffer
    LPCSTR lpDefaultChar, // address of default for unmappable characters
    LPBOOL lpUsedDefaultChar // address of flag set when default char. used
    );
    第一个参数使用CP_ACP,第二个参数设为0,第三个参数就是要转换的Unicode字符串的指针,第四个参数,Unicode字符串长度,第五个参数转换到ANSI字符串的指针,第六个参数ANSI字符串的长度

    这样就可以把Unicode转换为ANSI编码了,但是还有一个问题,就是如何判断要读入的文件是Unicode编码的还是ANSI编码的?查了一下资料,发现所有Unicode编码的文本文件,其文件头2个字节一定是"0xff","0xfe",这样就好办了,只要先读出这两个字节,然后就可以判断是不是Unicode编码的了。

    if( psFirst[0] == ’\xff’ && psFirst[1] == ’\xfe’ )用这条语句就可以判断了。

    下面给出C++的一段文件读取代码,返回的就是AnsiString的字符串,这样就可以读取Unicode编码和非Unicode编码的文件了
    AnsiString TForm1::ReadUnicodeFromFile(const AnsiString &FileName)
    {
    char psFirst[2];
    AnsiString str;
    int iFileHandle = FileOpen( FileName, fmOpenRead );
    int iFileLength = FileSeek( iFileHandle, 0, 2 );
    FileSeek(iFileHandle, 0, 0);
    FileRead(iFileHandle, psFirst, 2); //读出文件的头2个字节,用来判断是否为Unicode编码
    if( psFirst[0] == ’\xff’ && psFirst[1] == ’\xfe’ )
    {
    wchar_t *wstr=new wchar_t[iFileLength+1];
    FileRead(iFileHandle, wstr, iFileLength);
    FileClose(iFileHandle);
    int nLen = wcslen(wstr)+1;
    char *buf = new char[2*nLen];
    WideCharToMultiByte(CP_ACP, 0, wstr, nLen, buf, 2*nLen, NULL, NULL);
    str = buf;
    delete[] buf;
    }
    else
    {
    char *pszBuffer = new char[iFileLength+1];
    FileSeek(iFileHandle, 0, 0);
    FileRead(iFileHandle, pszBuffer, iFileLength);
    FileClose(iFileHandle);
    str=pszBuffer;
    delete []pszBuffer;
    }
    return str;
    }
  • 歌词串串烧1.15版更新
    下载地址:下载歌词串串烧1.15版
    v1.15 Beta 【2004.04.14】
    1.重写部分代码,使得速度有大幅度提高
    2.修正添加歌手时导致类别无效的错误
    3.修正最简模式的上一首和下一首按钮错误

    v1.13 Beta 【2004.04.12】
    1.修正修改专辑时导致歌词丢失的错误
    2.升级歌词数据库,自带歌词增加到1500首

    v1.12 Beta 【2004.04.07】
    1.支持LRC格式歌词的批量导入
    2.支持自定义类别
    3.支持收藏夹拖放排序
    4.增加歌手拖放分类功能
    5.增加上一首和下一首按钮,大大方便操作
    6.修正删除歌词时却没有删除收藏夹中相应条目的Bug
    7.修正删除专辑时却没有删除收藏夹中相应条目的Bug


  • 终于完成了对ColorWheel的开发,强烈推荐下载,这是我写过最复杂的软件了
    软件功能主要是网页配色、屏幕取色以及色彩管理等等

    软件下载地址:下载ColorWheel

    屏幕截图
  • 新增功能
    1。增加自动提醒功能,在每天开机时,如果有图书已经超期或者将要到期,将会弹出窗口提醒
    每天只提醒一次的哦,以后不管是重启还是重新开机,一天之内不会再提醒了
    当然,你也可以启动程序查看自己的书籍情况

    2。修正了一些Bug,稍微修改了一些界面元素
    下载地址:下载图书助理0.11版

    新功能截图:
  • 刚刚完成的测试版,可能还有一定的bug,正在测试中

    界面已经有了很大的变化哦,下载地址:下载图书助理

    截图






  • 这个是用C语言编写的贪吃蛇游戏哦,原创原创,TurboC下写的,去年的作品,有源代码的哦

    源文件下载:贪吃蛇源文件下载

    可执行文件下载:贪吃蛇游戏下载

    截图



    /**********************************************************/

    /* 本程序在Turbo C 2.0下编译通过 */

    /* */

    /* 文件名: snake.c */

    /**********************************************************/

    /**********************************************************/

    /* 程序中用到的库函数所在头文件应用 #include 命令包含进来 */

    #include<graphics.h>
    #include<bios.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    #include<dos.h>
    #include<conio.h>
    #include<ctype.h>

    /**********************************************************/
    /* 定义符号常量 */

    #define len sizeof(struct snake)
    #define Q (*que)
    #define FILENAME "c:\\person.dat" /*文件保存路径*/

    /**********************************************************/

    /* 定义数据结构*/


    /*蛇节点*/
    struct snake_base
    {
    int x;
    int y;
    };

    /*队列节点 */
    struct snake
    {
    struct snake_base data;
    struct snake *next;
    };

    /*队列 */
    struct queue
    {
    struct snake *front,*rear;
    };

    /*排行榜结构*/
    struct person
    {
    char name[20];
    int score;
    };

    /**********************************************************/

    /* 定义全局变量 */

    struct person per[5];

    /**********************************************************/


    /************************************************************************************/

    /*自定义函数原型说明 */

    void inques(struct queue *que,int x,int y); /*入队函数*/
    void creatque(struct queue Q,int m); /*创建队列*/
    struct snake_base delete(struct queue *que); /*出队函数,返回值为一个蛇节点*/
    void *picture(int type); /*绘制方块函数*/
    void draw(int x,int y,void *p); /*从图形缓存中读出数据,并显示在屏幕上*/
    int search(int x,int y,struct snake *tmpHead); /*判断蛇头是否与蛇身相遇函数*/
    void creat_menu(); /*产生主界面*/
    void ReadFiles(); /*从文件中读取记录信息*/
    void WriteFiles(struct person *); /*将记录写入文件中*/
    void InitScoreFiles(); /*初始化记录文件*/
    void CompareScore(struct person ); /*排行榜按分数进行排序*/
    void pain_board(); /*绘制排行榜函数*/
    void pain_gameover(); /*绘制游戏结束时的图形*/
    void HelpMessage();
    /***********************************************************************************/

    /**********************************************************/

    /*主函数*/
    void main()
    {
    int gm=VGAHI,gd=VGA;
    int mark,level,m,key,hi,lo,h;
    int s1,m1,i,j,k,xn,yn,flag,bl;
    long time;
    unsigned s2;
    void *p1,*p2;
    char ch,string[3];
    struct person CurPerson;
    struct queue *que;
    struct snake *q;
    struct snake_base x1;
    struct time t[1];
    do
    {
    flag=1;bl=0;que=NULL; /*下面两行为初始化游戏变量*/
    time=30000;mark=0;level=1;m=0;
    gettime(t);/*初始化随机数*/
    s1=t[0].ti_sec;
    m1=t[0].ti_min;
    s2=s1*m1;
    srand(s2);
    initgraph(&gd,&gm,"");
    p1=picture(1);
    p2=picture(0);
    creatque(que,3);
    creat_menu();
    itoa(mark,string,10);
    setcolor(15);
    outtextxy(545,30,string);
    itoa(level,string,10);
    outtextxy(545,50,string);
    q=Q.front->next;
    for(k=0;k<=2;k++) /*遍历队列,绘制初始状态的蛇身*/
    {
    draw(q->data.x,q->data.y,p1);
    if(k==2)
    { /*队尾节点为蛇头,取出赋值给i,j*/
    i=q->data.x;j=q->data.y;
    }
    q=q->next;
    }
    do
    {
    xn=((unsigned long)rand())%31+1; /*随即产生两个坐标,作为新节点*/
    yn=((unsigned long)rand())
  • 新增功能
    1。增加自动提醒功能,在每天开机时,如果有图书已经超期或者将要到期,将会弹出窗口提醒
    每天只提醒一次的哦,以后不管是重启还是重新开机,一天之内不会再提醒了
    当然,你也可以启动程序查看自己的书籍情况

    2。修正了一些Bug,稍微修改了一些界面元素
    下载地址:下载图书助理0.11版

    新功能截图:
  • 鼠标轨迹记录器,一个很早期的作品,VB6开发,自我感觉--烂,呵呵

    ^_^,可以完全记录下鼠标的全部动作,并保存在文件中,然后播放

    下载地址:下载鼠标轨迹播放器

  • 密码管理器,VB6开发,嘿嘿,管理密码用的哦,一个很早期的作品,比较烂的啦

    保存密码的文件只用了最简单的加密,所以安全性很低的咯

    下载地址:下载密码管理器

  • 这个是用C语言编写的贪吃蛇游戏哦,原创原创,TurboC下写的,去年的作品,有源代码的哦

    源文件下载:贪吃蛇源文件下载

    可执行文件下载:贪吃蛇游戏下载

    截图



    /**********************************************************/

    /* 本程序在Turbo C 2.0下编译通过 */

    /* */

    /* 文件名: snake.c */

    /**********************************************************/

    /**********************************************************/

    /* 程序中用到的库函数所在头文件应用 #include 命令包含进来 */

    #include<graphics.h>
    #include<bios.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<time.h>
    #include<dos.h>
    #include<conio.h>
    #include<ctype.h>

    /**********************************************************/
    /* 定义符号常量 */

    #define len sizeof(struct snake)
    #define Q (*que)
    #define FILENAME "c:\\person.dat" /*文件保存路径*/

    /**********************************************************/

    /* 定义数据结构*/


    /*蛇节点*/
    struct snake_base
    {
    int x;
    int y;
    };

    /*队列节点 */
    struct snake
    {
    struct snake_base data;
    struct snake *next;
    };

    /*队列 */
    struct queue
    {
    struct snake *front,*rear;
    };

    /*排行榜结构*/
    struct person
    {
    char name[20];
    int score;
    };

    /**********************************************************/

    /* 定义全局变量 */

    struct person per[5];

    /**********************************************************/


    /************************************************************************************/

    /*自定义函数原型说明 */

    void inques(struct queue *que,int x,int y); /*入队函数*/
    void creatque(struct queue Q,int m); /*创建队列*/
    struct snake_base delete(struct queue *que); /*出队函数,返回值为一个蛇节点*/
    void *picture(int type); /*绘制方块函数*/
    void draw(int x,int y,void *p); /*从图形缓存中读出数据,并显示在屏幕上*/
    int search(int x,int y,struct snake *tmpHead); /*判断蛇头是否与蛇身相遇函数*/
    void creat_menu(); /*产生主界面*/
    void ReadFiles(); /*从文件中读取记录信息*/
    void WriteFiles(struct person *); /*将记录写入文件中*/
    void InitScoreFiles(); /*初始化记录文件*/
    void CompareScore(struct person ); /*排行榜按分数进行排序*/
    void pain_board(); /*绘制排行榜函数*/
    void pain_gameover(); /*绘制游戏结束时的图形*/
    void HelpMessage();
    /***********************************************************************************/

    /**********************************************************/

    /*主函数*/
    void main()
    {
    int gm=VGAHI,gd=VGA;
    int mark,level,m,key,hi,lo,h;
    int s1,m1,i,j,k,xn,yn,flag,bl;
    long time;
    unsigned s2;
    void *p1,*p2;
    char ch,string[3];
    struct person CurPerson;
    struct queue *que;
    struct snake *q;
    struct snake_base x1;
    struct time t[1];
    do
    {
    flag=1;bl=0;que=NULL; /*下面两行为初始化游戏变量*/
    time=30000;mark=0;level=1;m=0;
    gettime(t);/*初始化随机数*/
    s1=t[0].ti_sec;
    m1=t[0].ti_min;
    s2=s1*m1;
    srand(s2);
    initgraph(&gd,&gm,"");
    p1=picture(1);
    p2=picture(0);
    creatque(que,3);
    creat_menu();
    itoa(mark,string,10);
    setcolor(15);
    outtextxy(545,30,string);
    itoa(level,string,10);
    outtextxy(545,50,string);
    q=Q.front->next;
    for(k=0;k<=2;k++) /*遍历队列,绘制初始状态的蛇身*/
    {
    draw(q->data.x,q->data.y,p1);
    if(k==2)
    { /*队尾节点为蛇头,取出赋值给i,j*/
    i=q->data.x;j=q->data.y;
    }
    q=q->next;
    }
    do
    {
    xn=((unsigned long)rand())%31+1; /*随即产生两个坐标,作为新节点*/
    yn=((unsigned long)rand())
  • 用来管理和保存歌词的哦,还是比较好用的东东,推荐下载哦
    采用ACCESS数据库,具体介绍可以看下面的下载地址里!嘿嘿

    下载地址:下载歌词串串烧

    截图
  • 刚刚完成的测试版,可能还有一定的bug,正在测试中

    界面已经有了很大的变化哦,下载地址:下载图书助理

    截图






  • 由于经常性的因为图书超期而被罚款,所以想做一个小东东来提醒自己

    目前正在开发哦。。。。

    放几张截图先。。[face02]

  • 终于完成了对ColorWheel的开发,强烈推荐下载,这是我写过最复杂的软件了
    软件功能主要是网页配色、屏幕取色以及色彩管理等等

    软件下载地址:下载ColorWheel

    屏幕截图