⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main4.c

📁 如何编写自己的图形开发包 利用tc2.0在DOS下编写一个功能完整的图形开发包。并有详细浅显的文章耐心逐步讲解。
💻 C
字号:
#include "GrTry.c"


typedef struct tagRGBQUAD     /* 用于读取调色板信息                   */
{
    UINT8   r;
    UINT8   g;
    UINT8   b;
    UINT8   reserved;
} RGBQUAD;



int main()
{
    INT16   fp;
    INT16   i, j;
    UINT32  Width, Height, Linebytes;
    UINT8   Buffer[768];
    RGBQUAD bmiColors[256];
    struct  REGPACK reg;

    InitSVGA();                     /* 图形初始化开始   */
    SetSVGAMode(TRY640X480X256);    /* 实现图形模式     */

    if ((fp = open("mnls.bmp", O_RDONLY|O_BINARY)) == -1)
    {
        printf("can't open the file!");
        getch();
        return 0;
    }
    lseek(fp, 18L, SEEK_SET);       /* 读取文件宽高     */
    read(fp, &Width, 4);
    read(fp, &Height, 4);



    if (Width%4)                    /* 拼凑4字节倍数    */
    {
        Linebytes = Width+(4-Width%4);
    }
    else
    {
        Linebytes = Width;
    }



    /*----------以下为设置调色板信息----------*/
    lseek(fp, 54L, SEEK_SET);
    if (read(fp, (char *)bmiColors, 1024) != 1024)  /* 读当前图片调色板数据     */
    {
        printf("Can't get palette !\n");
        bioskey(0);
        exit(0);
    }
    
    for (i = 0, j = 0; i < 256; ++i, j +=3) /* 拼凑信息 */
    {
        Buffer[j] = bmiColors[i].b >> 2;
        Buffer[j + 1] = bmiColors[i].g >> 2;
        Buffer[j + 2] = bmiColors[i].r >> 2;
    }
    reg.r_ax = 0x1012;
    reg.r_bx = 0;
    reg.r_cx = 256;
    reg.r_es = FP_SEG(Buffer);
    reg.r_dx = FP_OFF(Buffer);
    intr(0x10, &reg);                       /* 使用中断完成设置 */



    lseek(fp, 1078L, SEEK_SET);     /* 开始读取图形数据 */
    SelectPage(4);
    for (i = Height-1; i >= 0; i--)
    {
        read(fp, Buffer, Linebytes);/* 一次读取一行     */
        switch (i)
        {
            case 102:
                movedata(FP_SEG(Buffer+256), FP_OFF(Buffer+256), FP_SEG(VideoBuffer+(640*i)+256), FP_OFF(VideoBuffer+(640*i)+256), 384);
                SelectPage(0);
                movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(640*i)), FP_OFF(VideoBuffer+(640*i)), 256);
                break;

            case 204:
                movedata(FP_SEG(Buffer+512), FP_OFF(Buffer+512), FP_SEG(VideoBuffer+(640*i)+512), FP_OFF(VideoBuffer+(640*i)+512), 128);
                SelectPage(1);
                movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(640*i)), FP_OFF(VideoBuffer+(640*i)), 512);
                break;


            case 307:
                movedata(FP_SEG(Buffer+128), FP_OFF(Buffer+128), FP_SEG(VideoBuffer+(640*i)+128), FP_OFF(VideoBuffer+(640*i)+128), 512);
                SelectPage(2);
                movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(640*i)), FP_OFF(VideoBuffer+(640*i)), 128);
                break;


            case 409:
                movedata(FP_SEG(Buffer+384), FP_OFF(Buffer+384), FP_SEG(VideoBuffer+(640*i)+384), FP_OFF(VideoBuffer+(640*i)+384), 256);
                SelectPage(3);
                movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(640*i)), FP_OFF(VideoBuffer+(640*i)), 384);
                break;


            default:
                movedata(FP_SEG(Buffer), FP_OFF(Buffer), FP_SEG(VideoBuffer+(640*i)), FP_OFF(VideoBuffer+(640*i)), Linebytes);
        }

    }

    close(fp);


    getch();
    ExitSVGA();                     /* 恢复原始的模式   */
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -