• 一个编程函数集(包含大量C实用函数)


    又一个编程函数集(包含大量实用函数)

    编程函数集,详细内容如下:


    格式化字符串转换
    鼠标驱动
    西文模式下输出汉字(BGI)
    三维窗体
    时钟中断服务
    取得键盘扫描码
    文本模式光标定位
    显示的关闭与开启
    文本模式的直接写屏技术
    TVGA直接写屏图形引擎
    /*-------------------------------------------------------------------------*/
    /* Head */
    /*-------------------------------------------------------------------------*/

    #include 
    <stdio.h>
    #include 
    <conio.h>
    #include 
    <stdarg.h>
    #include 
    <dos.h>
    #include 
    <graphics.h>
    #include 
    <stdio.h>
    #include 
    <iostream.h>
    #include 
    <stdlib.h>
    #include 
    <time.h>
    #include 
    <bios.h>
    #include 
    <string.h>
    #include 
    <math.h>


    /*---------------------------格式化字符串转换------------------------------*/

    int vsprint(char *buffer,char *fmt, )
    {
    va_list argptr;
    int cnt;
    va_start(argptr, fmt);
    cnt 
    = vsprintf(buffer, fmt, argptr);
    va_end(argptr);
    return(cnt);
    }


    /*-------------------------------鼠标驱动----------------------------------*/

    int mouse(int a,int b,int c,int d)
    {
    asm mov ax,a
    asm mov bx,b
    asm mov cx,c
    asm mov dx,d
    asm 
    int 33h
    return _AX;
    }


    #if defined(MOUSESHAPE) //光标形状设定
    typedef 
    struct
    {
    unsigned 
    int shape[32];
    char hotx;
    char hoty;
    }
    SHAPE;

    SHAPE pen1
    ={{0x0fff,0x07ff,0x03ff,0x01ff,0x80ff,0xc07f,0xe03f,0xf01f,
    0xf80f,0xfc07,0xfe03,0xff01,0xff80,0xffc1,0xffe3,0xfff7,
    0xf000,0xe800,0xd400,0xaa00,0x5500,0x2a80,0x1540,0x0aa0,
    0x0550,0x02a8,0x0154,0x00aa,0x0055,0x002a,0x0014,0x0008}
    ,0,0 }
    ;
    SHAPE pen2
    ={{0xe1ff,0xe1ff,0xe1ff,0xe1ff,0xe000,0xe000,0xe000,0xe000,
    0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,0x0000,
    0x1e00,0x1200,0x1200,0x1200,0x1200,0x13ff,0x1249,0x1249,
    0x1249,0x9001,0x9001,0x9001,0x8001,0x8001,0x8001,0xffff}
    ,5,0}
    ;


    void mouseshape(SHAPE sp)
    {
    _BX
    =sp.hotx;
    _CX
    =sp.hoty;
    _ES
    =FP_SEG(&sp.shape);
    _DX
    =FP_OFF(&sp.shape);
    _AX
    =0x09;
    geninterrupt(
    0x33);
    }

    #endif

    /*--------------------------西文模式下输出汉字(BGI)------------------------*/

    void initgraphics(int gdriver,int gmode,char *drvpath="")
    {
    initgraph(
    &gdriver,&gmode,drvpath);
    }


    couttextxy(FILE 
    *library,int x,int y,unsigned char far *string,char color)
    {
    register 
    int i,j;
    unsigned 
    long int locate;
    int k=0;
    char l=0,buffer[32];
    if(library==NULL) return 0;
    while(string[k]!='\0')
    {
    locate
    =(string[k]-161)*94+string[k+1]-161;
    fseek(library,(
    long int)locate*32,SEEK_SET);
    fread(buffer,
    32,sizeof(char),library);
    k
    +=2;
    for(i=0;i<16;i++)
    for(j=0;j<2;j++)
    {
    l
    =buffer[i*2+j];
    if((l&0x80)!=0) putpixel(x+j*8,y+i,color);
    if((l&0x40)!=0) putpixel(x+j*8+1,y+i,color);
    if((l&0x20)!=0) putpixel(x+j*8+2,y+i,color);
    if((l&0x10)!=0) putpixel(x+j*8+3,y+i,color);
    if((l&0x08)!=0) putpixel(x+j*8+4,y+i,color);
    if((l&0x04)!=0) putpixel(x+j*8+5,y+i,color);
    if((l&0x02)!=0) putpixel(x+j*8+6,y+i,color);
    if((l&0x01)!=0) putpixel(x+j*8+7,y+i,color);
    }

    x
    +=16;
    }

    return 1;
    }


    /*-------------------------------三维窗体----------------------------------*/

    void window3d(int x,int y,int length,int width,char *title)
    {
    setcolor(
    7);
    line(x,y,x
    +length,y);
    line(x,y,x,y
    +width);
    setcolor(
    0);
    line(x,y
    +width,x+length,y+width);
    line(x
    +length,y,x+length,y+width);
    setcolor(
    15);
    line(x
    +1,y+1,x+length-1,y+1);
    line(x
    +1,y+1,x+1,y+width-1);
    setcolor(
    8);
    line(x
    +1,y+width-1,x+length-1,y+width-1);
    line(x
    +length-1,y+1,x+length-1,y+width-1);
    setfillstyle(
    1,7);
    bar(x
    +2,y+2,x+length-2,y+width-2);
    setfillstyle(
    1,1);
    bar(x
    +4,y+4,x+length-4,y+20);
    setcolor(
    15);
    outtextxy(x
    +8,y+8,title);
    }


    void textwindow3d(int x,int y,int length,int width,char *title,int bargin)
    {
    window3d(x,y,length,width,title);
    setfillstyle(
    1,15);
    bar(x
    +bargin,y+bargin+20,x+length-bargin,y+width-bargin);
    setcolor(
    0);
    line(x
    +bargin-1,y+bargin+19,x+length-bargin+1,y+bargin+19);
    line(x
    +bargin-1,y+bargin+19,x+bargin-1,y+width-bargin+1);
    setcolor(
    7);
    line(x
    +length-bargin+1,y+bargin+19,x+1+length-bargin,y+width-bargin+1);
    line(x
    +bargin-1,y+width-bargin+1,x+1+length-bargin,y+width-bargin+1);
    setcolor(
    8);
    line(x
    +bargin-2,y+bargin+18,x+2+length-bargin,y+18+bargin);
    line(x
    +bargin-2,y+18+bargin,x+bargin-2,y+2+width-bargin);
    setcolor(
    15);
    line(x
    +2+length-bargin,y+18+bargin,x+2+length-bargin,y+2+width-bargin);
    line(x
    +bargin-2,y+2+width-bargin,x+2+length-bargin,y+2+width-bargin);
    }


    /*-----------------------------时钟中断服务--------------------------------*/

    #if defined(INTERRUPT)
    void interrupt (*old)();
    //void interrupt hand(){(*old)();}

    void uninstall()
    {
    disable();
    setvect(
    0x1c,(*old));
    enable();
    }


    void install()
    {
    disable();
    old
    =getvect(0x1c);
    setvect(
    0x1c,hand);
    enable();
    }

    #endif

    /*-----------------------------取得键盘扫描码------------------------------*/

    int keydown()
    {
    int key;
    if(bioskey(1)==0return -1;
    else 
    key
    =bioskey(0);
    key
    =key&0xff?key&0xff:key>>8;
    return key;
    }


    /*----------------------------文本模式光标定位-----------------------------*/

    void goto_xy(char x,char y)
    {
    asm mov ah,
    2
    asm mov dl,x
    asm mov dh,y
    asm mov bh,
    0
    asm 
    int 10h
    }


    /*----------------------------显示的关闭与开启-----------------------------*/

    #define CLOSE 0x1201
    #define OPEN 0x1200
    void video(int mode)
    {
    asm mov bl,36h
    asm mov ax,mode
    asm 
    int 10h
    }


    /*---------------------------文本模式的直接写屏技术------------------------*/

    int video_mode(void)
    {
    union REGS r;
    r.h.ah
    =15;
    return int86(0x10,&r,&r)&255;
    }


    char far *set_v_ptr()
    {
    int vmode;
    char far *vid_mem;
    vmode
    =video_mode();
    if((vmode!=2)&&(vmode!=3)&&(vmode!=7))
    {
    printf(
    "Video must be in 80 column text mode!");
    exit(
    1);
    }

    if(vmode==7) vid_mem=(char far *)0xb0000000;
    else vid_mem=(char far *)0xb8000000;
    return vid_mem;
    }


    void write_char(char far *vid_mem,int x,int y,char ch,int attrib)
    {
    char far *v;
    v
    =vid_mem;
    v
    +=(y*160)+x*2;
    *v++=ch;
    *v=attrib;
    }


    void write_string(char far *vid_mem,int x,int y,char *string,int color)
    {
    int i;
    for(i=0;i<strlen(string);i++)
    write_char(vid_mem,x
    +i,y,*(string+i),color);
    }


    int read_color(char far *vid_mem,int x,int y)
    {
    char far *v;
    v
    =vid_mem;
    v
    +=(y*160)+x*2;
    return *(++v);
    }


    char read_char(char far *vid_mem,int x,int y)
    {
    char far *v;
    v
    =vid_mem;
    v
    +=(y*160)+x*2;
    return *v;
    }


    /*-------------------------TVGA直接写屏图形引擎--------------------------*/

    void _setgraphmode(int mode,int *xmax,int *ymax)
    {
    union REGS regs;
    unsigned 
    char video;
    switch(mode)
    {
    case 0: video=0x5c;
    *xmax=640;
    *ymax=400;break//640x400
    case 1: video=0x5d;
    *xmax=640;
    *ymax=480;break//640x480
    case 2: video=0x5e;
    *xmax=800;
    *ymax=600;break//800x600
    case 3: video=0x62;
    *xmax=1024;
    *ymax=768;break//1024x768
    default:video=0x5d;
    *xmax=640;
    *ymax=480;break//Default: 640x480
    }

    regs.h.ah
    =0;
    regs.h.al
    =video;
    int86(
    0x10,®s,®s);
    outportb(
    0x3c4,0x0b);
    inportb(
    0x3c5);
    return;
    }


    void _putpixel(int x,int y,int color,int xmax)
    {
    unsigned 
    long int result=y;
    char far *offset;
    char temp;
    result
    *=xmax;
    result
    +=x;
    offset
    =(char far *)MK_FP(0xa000,(unsigned)result&0xffff);
    outportb(
    0x3c4,0x0e);
    temp
    =((result>>16)&0x0f)^0x02;
    outportb(
    0x3c5,temp);
    temp
    =*offset;
    *offset=(char)color;
    return;
    }


    int _getpixel(int x,int y,int xamx)
    {
    unsigned 
    long int result=y;
    char far *offset;
    char temp;
    result
    *=xmax;
    result
    +=x;
    offset
    =(char far *)MK_FP(0xa000,(unsigned)result&0xffff);
    outportb(
    0x3c4,0x0e);
    temp
    =((result>>16)&0x0f)^0x02;
    outportb(
    0x3c5,temp);
    temp
    =*offset;
    return (int)temp;
    }


    void _closegraph()
    {
    union REGS regs;
    regs.h.ah
    =0x00;
    regs.h.al
    =0x03;
    int86(
    0x10,®s,®s);
    return;
    }


    void _outtextxy(int x,int y,char far *string,int color,int xmax)
    {
    register 
    int i,j;
    char huge *ptr;
    int k=0;
    while(string[k]!='\0')
    {
    ptr
    =(char huge *)MK_FP(0xf000,0xfa6e+(string[k]<<3));
    for(i=0;i<8;i++)
    for(j=0;j<8;j++)
    if((ptr[i]&(0x80>>j))!=0)
    _putpixel(x
    +(k<<3)+j,y+i,color,xmax);
    k
    ++;
    }

    return;
    }


    int _couttextxy(FILE *library,int x,int y,unsigned char far *string,char color,int xmax)
    {
    register 
    int i,j;
    unsigned 
    long int locate;
    int k=0;
    char l=0,buffer[32];
    if(library==NULL) return 0;
    while(string[k]!='\0')
    {
    locate
    =(string[k]-161)*94+string[k+1]-161;
    fseek(library,(
    long int)locate*32,SEEK_SET);
    fread(buffer,
    32,sizeof(char),library);
    k
    +=2;
    for(i=0;i<16;i++)
    for(j=0;j<2;j++)
    {
    l
    =buffer[i*2+j];
    if((l&0x80)!=0) _putpixel(x+j*8,y+i,color,xmax);
    if((l&0x40)!=0) _putpixel(x+j*8+1,y+i,color,xmax);
    if((l&0x20)!=0) _putpixel(x+j*8+2,y+i,color,xmax);
    if((l&0x10)!=0) _putpixel(x+j*8+3,y+i,color,xmax);
    if((l&0x08)!=0) _putpixel(x+j*8+4,y+i,color,xmax);
    if((l&0x04)!=0) _putpixel(x+j*8+5,y+i,color,xmax);
    if((l&0x02)!=0) _putpixel(x+j*8+6,y+i,color,xmax);
    if((l&0x01)!=0) _putpixel(x+j*8+7,y+i,color,xmax);
    }

    x
    +=16;
    }

    return 1;
    }


    #if defined(TVGAMOUSE)
    char image[55];
    char cursorshape[55]={14,14,14,14,0,14,
    14,0,0,14,14,0,
    0,0,14,14,0,0,
    0,0,14,14,0,0,
    0,0,0,14,14,0,
    0,0,0,0,0,14,14,
    0,0,0,0,0,0,0,14,
    14,14,14,14,14,14,
    14,14,14,14}
    ;

    void _putimage(int x,int y)
    {
    int i,j,k=0;
    for(j=y;j<y+10;j++)
    for(i=x;i-x<j-y+1;i++)
    {
    _putpixel(i,j,image[k
    ++]);
    }

    return;
    }


    void cursor(int x,int y)
    {
    static int cf=0,oldx=-1,oldy=-1;
    if(!cf) cf=1;
    else if(x!=oldx||y!=oldy) _putimage(oldx,oldy);
    if(x!=oldx||y!=oldy) draw(x,y);
    oldx
    =x;oldy=y;
    return;
    }

    #endif

    /*-------------------------------------------------------------------------*/

  • 相关阅读:
    svn的revert、checkout、clean up、setting
    jsonp跨域原理
    王亚伟北大演讲:一切通胀问题都是货币问题(全文)
    string <-> wstring
    点在多边形内 经典算法(转)
    不可不表的OSG智能指针之强指针与弱指针 《转载》
    一个shell脚本给客户使用服务器生成一个序列号
    Rsync(远程同步): linux中Rsync命令的实际示例
    一个 rsync同步文件脚本
    用UltraISO制作CentOS U盘安装盘
  • 原文地址:https://www.cnblogs.com/zhangyin/p/650869.html
Copyright © 2020-2023  润新知