ba_wang_mao 发表于 2007-10-30 11:37

我的简易图形基本程序(在TC++3.0 FOR DOS 及 BORLAND C++3.1 FOR DOS)下调试通过

<P>/////////////////////////////////////////////////////////////////<BR>//  __           ____   _______          ______   //<BR>// /\ \         / / /  /\  ____\        / _____\  //<BR>// \ \ \       / / /   \ \ \___/       /\ \____/  //<BR>//  \ \ \     / / /     \ \ \_____     \ \ \________  //<BR>//   \ \ \   / / /       \ \  ____\     \ \ _______ \  //<BR>//    \ \ \ / / /         \ \ \___/      \/_______/\ \     V //<BR>//     \ \ \_/ /           \ \ \______        ____\_\ \   E S   //<BR>//      \ \___/             \ \_______\      /\_______/  V A E  //<BR>//       \/__/               \/_______/      \_______/  S     A //<BR>///////////////////////////////////////////////////////////// //<BR>///////  分辨率----位数----色深--------页数-----显存需求量 // //<BR>///////////////////////////////////////////////////////////// //<BR>// 640*480*8Bit----256-Colors----5-Pages-----512K  //<BR>// 640*480*16Bit---64K-Colors----10-Pages----1M  //<BR>// 800*600*8Bit----256-Colors----8-Pages-----512K  //<BR>// 800*600*16Bit---64K-Colors----16-Pages----1M  //<BR>// 1024*768*8Bit---256-Colors----12-Pages----1M  //<BR>// 1024*768*16Bit--64K-Colors----24-Pages----2M  //<BR>//////////////////////////////////////////////////////////////////<BR>//////////////////////////////////////////////////////////////////<BR>#include &lt;stdio.h&gt;<BR>#include &lt;stdlib.h&gt;<BR>#include &lt;dos.h&gt;<BR>#include &lt;string.h&gt;<BR>#include &lt;conio.h&gt;</P>
<P>#define FALSE                        0<BR>#define TRUE                        1<BR>#define SOLID_FILL                    1   // fills area in solid fill color<BR>#define S8X8                             8    //    8*8        获取ASCII ROM字符集首地址<BR>#define S14X8                        14    //    14*8    获取ASCII ROM字符集首地址<BR>#define S16X8                           16    //    16*8    获取ASCII ROM字符集首地址<BR>#define VBE800X600X256               0x103<BR>#define VRAM_GRAPH_800X600X256(x,y)    (((unsigned long)y&lt;&lt;9L)+((unsigned long)y&lt;&lt;8L)+((unsigned long)y&lt;&lt;5L)+((unsigned long)(x)))</P>
<P>#define DIALOG_TITLE_BK_COLOR        LIGHTBLUE        //    对话框标题条背景颜色<BR>#define DIALOG_TITLE_TEXT_COLOR        BLACK        //    对话框标题条文本颜色<BR>#define DIALOG_TEXT_BK_COLOR        LIGHTGRAY    //    对话框背景颜色<BR>typedef unsigned int BOOL;                  //    布尔类型<BR>typedef unsigned int XMS_HANDLE;        //    XMS句柄类型<BR>//////////////////////////////////////////////////////////////////////////////<BR>/////XMS规范使用扩充内存所用的数据结构<BR>//////////////////////////////////////////////////////////////////////////////<BR>typedef struct XMS<BR>{<BR>    unsigned long length;                // 需传输的数据字节数(32位)<BR>    XMS_HANDLE source_handle;             // 源数据块句柄<BR>    unsigned long source_offset;        // 源偏移量(32位)<BR>    XMS_HANDLE dest_handle;               // 目标数据块句柄<BR>    unsigned long dest_offset;            // 目标偏移量(32位)<BR>};<BR>//////////////////////////////////////////////////////////////////////////////<BR>////窗口区域保存结构体<BR>//////////////////////////////////////////////////////////////////////////////<BR>struct GUI_STACK<BR>{<BR>    unsigned int x1;<BR>    unsigned int y1;<BR>    unsigned int x2;<BR>    unsigned int y2;<BR>    XMS_HANDLE handle;                     // XMS句柄<BR>};</P>
<P>typedef struct<BR>{<BR>//    enum WINDOW_TYPE;<BR>    char no;<BR>    char *chinese_name;<BR>    int number;<BR>    char unit;<BR>    char *help_name;<BR>    union<BR>    {<BR>        struct<BR>        {<BR>            int min;<BR>            int max;<BR>            char dot;<BR>        }a;<BR>        struct<BR>        {<BR>          int MENU_min;<BR>          int MENU_max;<BR>          char *MENU_chinese_name;<BR>        }b;<BR>    }c;<BR>}BOOT_KING,*BOOT_KING_PTR;</P>
<P><BR>void far (*XMS_Function)(void) = 0L;// XMS服务程序入口地址<BR>XMS_HANDLE xms_handle;                // 伪指针<BR>int g_cur_vbe_page = 0;<BR>int GUI_SP = 0;                        // 弹出式堆栈指针<BR>unsigned char far *ROM_ASCII;<BR>int Back_Color,Fore_Color,Fill_Color;<BR>struct XMS xms;<BR>struct GUI_STACK GUI_Stack[10];        // 弹出式堆栈</P>
<P><BR>int  _Cdecl TOP_X1(void);<BR>int  _Cdecl TOP_X2(void);<BR>int  _Cdecl TOP_Y1(void);<BR>int  _Cdecl TOP_Y2(void);<BR>int  _Cdecl TOP_Handle(void);<BR>int  _Cdecl BOTTOM_X1(void);<BR>int  _Cdecl BOTTOM_X2(void);<BR>int  _Cdecl BOTTOM_Y1(void);<BR>int  _Cdecl BOTTOM_Y2(void);<BR>BOOL _Cdecl Stack_Empty(void);<BR>BOOL _Cdecl Stack_Full(void);<BR>BOOL _Cdecl PUSH_Stack(int x1,int y1,int x2,int y2,XMS_HANDLE handle);<BR>BOOL _Cdecl POP_Stack(void);<BR>void _Cdecl setfillstyle(int __pattern,int color);<BR>void _Cdecl setcolor(int color);<BR>int  _Cdecl getcolor(void);<BR>void _Cdecl setbkcolor(int color);<BR>int  _Cdecl getbkcolor(void);<BR>int  _Cdecl getfillcolor(void);<BR>BOOL _Cdecl XMS_Test(void);<BR>unsigned int _Cdecl XMS_Version(void);<BR>int  _Cdecl XMS_Size(void);<BR>BOOL _Cdecl XMS_Alloc(int size);<BR>int  _Cdecl XMS_ReAlloc(XMS_HANDLE handle,int resize);<BR>BOOL _Cdecl XMS_Free(XMS_HANDLE handle);<BR>BOOL _Cdecl XMS_Move(struct XMS *xms);<BR>void _Cdecl Write_To_XMS(char *buf,unsigned int size,XMS_HANDLE handle,unsigned long offset);<BR>void _Cdecl Read_From_XMS(char *buf,unsigned int size,XMS_HANDLE handle,unsigned long offset);<BR>void _Cdecl ReadHzkXMS(char *Hzkname);<BR>void _Cdecl HzkFree(void);<BR>void _Cdecl ReadHzkBit(unsigned char *qw,unsigned char *buf);<BR>unsigned char far *Get_ASCII_ROM(unsigned int BX);<BR>unsigned char far *Current_ASCII_ROM(int ch);<BR>void _Cdecl set_vbe_page(int page);<BR>char _Cdecl GetPixel(int x, int y);<BR>void _Cdecl Common_PutPixel(int x,int y,int color);<BR>void _Cdecl PutPixel(int x,int y,int color);<BR>void _Cdecl POPUP_PutPixel(int x,int y,int color);<BR>void _Cdecl puthz(int x,int y,char *p,int color,int d);<BR>void _Cdecl POPUP_puthz(int x,int y,char *p,int color,int d);<BR>void _Cdecl Vline(int x, int y1, int y2);<BR>void _Cdecl POPUP_Vline(int x, int y1, int y2);<BR>void _Cdecl Hline(int x1, int y, int x2);<BR>void _Cdecl POPUP_Hline(int x1, int y, int x2);<BR>void _Cdecl Line(int x1,int y1,int x2,int y2);<BR>void _Cdecl Rectangle(int x1,int y1,int x2,int y2);<BR>void _Cdecl POPUP_Rectangle(int x1,int y1,int x2,int y2);<BR>void _Cdecl Bar(int x1, int y1, int x2, int y2);<BR>void _Cdecl POPUP_Bar(int x1, int y1, int x2, int y2);<BR>void _Cdecl Circle(int c_x, int c_y, int r);<BR>void _Cdecl CircleFill(int x0, int y0, int r);<BR>void _Cdecl InitGraph(void);<BR>void _Cdecl CloseGraph(void);<BR>BOOL _Cdecl Save_Image_XMS(int x1,int y1,int x2,int y2);<BR>void _Cdecl Restore_Image_XMS(void);<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////测试堆栈是否为空<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>BOOL _Cdecl Stack_Empty(void)<BR>{<BR>    if (GUI_SP == 0)<BR>        return (TRUE);<BR>    return (FALSE);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////测试堆栈是否溢出<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>BOOL _Cdecl Stack_Full(void)<BR>{<BR>    if (GUI_SP == 3)<BR>        return (TRUE);<BR>    return (FALSE);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////窗口区域及窗口句柄入栈<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>BOOL _Cdecl PUSH_Stack(int x1,int y1,int x2,int y2,XMS_HANDLE handle)<BR>{<BR>    if (!Stack_Full())<BR>    {<BR>        GUI_SP++;<BR>        GUI_Stack[GUI_SP].x1 = x1;<BR>        GUI_Stack[GUI_SP].y1 = y1;<BR>        GUI_Stack[GUI_SP].x2 = x2;<BR>        GUI_Stack[GUI_SP].y2 = y2;<BR>        GUI_Stack[GUI_SP].handle = handle;<BR>        return (TRUE);<BR>    }<BR>    return (FALSE);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////窗口区域及窗口句柄出栈<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>BOOL _Cdecl POP_Stack(void)<BR>{<BR>    if (!Stack_Empty())<BR>    {<BR>        GUI_SP--;<BR>        return (TRUE);<BR>    }<BR>    return (FALSE);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////获取栈顶.x1<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>int _Cdecl TOP_X1(void)<BR>{<BR>    return (GUI_Stack[GUI_SP].x1);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////获取栈顶.x2<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>int _Cdecl TOP_X2(void)<BR>{<BR>    return (GUI_Stack[GUI_SP].x2);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////获取栈顶.y1<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>int _Cdecl TOP_Y1(void)<BR>{<BR>    return (GUI_Stack[GUI_SP].y1);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////获取栈顶.y2<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>int _Cdecl TOP_Y2(void)<BR>{<BR>    return (GUI_Stack[GUI_SP].y2);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////获取栈顶.handle<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>int  _Cdecl TOP_Handle(void)<BR>{<BR>    return (GUI_Stack[GUI_SP].handle);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////获取栈底.x1<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>int _Cdecl BOTTOM_X1(void)<BR>{<BR>    return (GUI_Stack[1].x1);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////获取栈底.x2<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>int _Cdecl BOTTOM_X2(void)<BR>{<BR>    return (GUI_Stack[1].x2);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////获取栈底.y1<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>int _Cdecl BOTTOM_Y1(void)<BR>{<BR>    return (GUI_Stack[1].y1);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////获取栈底.y2<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>int _Cdecl BOTTOM_Y2(void)<BR>{<BR>    return (GUI_Stack[1].y2);<BR>}</P>

ba_wang_mao 发表于 2007-10-30 11:38

<P>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//    设置 bar 填充颜色(同 Turbo C)<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl setfillstyle(int __pattern,int color)<BR>{<BR>    __pattern++;                    // no use<BR>    Fill_Color = color;<BR>}</P>
<P>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//    设置前景色(同 Turbo C)<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl setcolor(int color)<BR>{<BR>    Fore_Color = color;<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//    获取前景色(同 Turbo C)<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>int _Cdecl getcolor(void)<BR>{<BR>    return (Fore_Color);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//    设置背景色(同 Turbo C)<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl setbkcolor(int color)<BR>{<BR>    Back_Color = color;<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//    获取背景色(同 Turbo C)<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>int _Cdecl getbkcolor(void)<BR>{<BR>    return (Back_Color);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//    获取填充色<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>int _Cdecl getfillcolor(void)<BR>{<BR>    return (Fill_Color);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//检测XMS是否安装<BR>//  INT 2F - XMS 驱动程序安装检测<BR>//  输入参数:AX = 4300h<BR>//  返回值:    AL = 80h XMS 驱动程序已安装<BR>//            AL &lt;&gt; 80h 未发现XMS 驱动程序<BR>//  注: XMS 使你可以访问扩充内存以及其它的高于640K的非EMS内存,<BR>//    其它程序不得使用与之相同的安装检测方式<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>BOOL _Cdecl XMS_Test(void)<BR>{<BR>    _AX = 0x4300;<BR>    __int__(0x2F);<BR>    if (_AL == 0x80)            //    检查XMS驱动程序是否已经安装<BR>    {<BR>        _AX = 0x4310;<BR>        __int__(0x2F);            //    取得XMS功能调用的地址<BR>        XMS_Function=(void far *)MK_FP(_ES,_BX); //    返回值:ES:BX -&gt; 驱动程序入口地址<BR>        return (TRUE);<BR>    }<BR>    return (FALSE);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//    说明: 获取XMS驱动器版本号<BR>//    参数: 返回参数: XMS驱动器版本号<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>unsigned int _Cdecl XMS_Version(void)<BR>{<BR>    _AH = 0x00;<BR>    (XMS_Function)();<BR>    return (_AX);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//查询空闲的扩充内存空间(不包括HMA)<BR>//输入参数:AH = 08h<BR>//返回值:AX = 最大的扩充内存块的大小(单位:K)<BR>//DX = 总的扩充内存块的大小(单位:K)<BR>//AX = 最大的扩充内存块的大小(单位:K)<BR>//BL = 错误代码<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>int _Cdecl XMS_Size(void)<BR>{<BR>    _AH = 0x08;<BR>    XMS_Function();<BR>    return (_DX);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//分配扩充内存<BR>//输入参数:AH = 09h<BR>//        DX = 要求分配的内存块大小(单位:K)<BR>//返回值:<BR>//        AX = 0001h 成功<BR>//      DX = 内存块的句柄<BR>//      AX = 0000h 失败<BR>//      BL = 错误代码<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>BOOL _Cdecl XMS_Alloc(int size)<BR>{<BR>    _DX = size;                    //    扩充内存块大小,单位为K字节<BR>    _AH = 0x09;<BR>    XMS_Function();<BR>    if(_AX == 1)<BR>        return (_DX);<BR>    return (FALSE);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//    为句柄重新分配内存<BR>//    输入参数:AH = 0Fh<BR>//      DX = 句柄<BR>//      BX = 新的块的容量(单位:K)<BR>//    返回值:<BR>//        AX = 0001h 成功<BR>//         = 0000h 失败<BR>//      BL = 错误代码<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>int _Cdecl XMS_ReAlloc(XMS_HANDLE handle,int resize)<BR>{<BR>    _AH = 0x0F;<BR>       _DX = handle;<BR>    _BX = resize;<BR>    (XMS_Function)();<BR>    if (_AX)<BR>    {<BR>        XMS_Size();<BR>        return (handle);<BR>    }<BR>    return (-1);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//    释放指定句柄所分配的扩充内存<BR>//  输入参数:AH = 0Ah<BR>//      DX = 内存块的句柄<BR>//  返回值:<BR>//        AX = 0001h 成功<BR>//           = 0000h 失败<BR>//      BL = 错误代码<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>BOOL _Cdecl XMS_Free(XMS_HANDLE handle)<BR>{<BR>    _DX = handle;<BR>    _AH = 0x0A;<BR>    XMS_Function();<BR>    if(_AX)<BR>        return (TRUE);<BR>    return (FALSE);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//扩充内存和常规内存中的数据交换(移动扩充内存块)<BR>//    移动扩充内存块<BR>//  输入参数:<BR>//        AH = 0Bh<BR>//      DS:SI -&gt; XMS 结构<BR>//  返回值:<BR>//        AX = 0001h 成功<BR>//         = 0000h 失败<BR>//      BL = 错误代码<BR>//  注: 如果结构中任一句柄为0000h, 那么其对应32位偏移量将被视为常规内存的绝对地址<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>BOOL _Cdecl XMS_Move(struct XMS *xms)<BR>{<BR>    _DS = FP_SEG(xms);<BR>    _SI = FP_OFF(xms);<BR>    _AH = 0x0B;<BR>    XMS_Function();<BR>    if (_AX)<BR>        return (TRUE);<BR>    return (FALSE);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//将汉字库点阵字模从常规内存缓冲区buf装载到扩充内存<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl Write_To_XMS(char *buf,unsigned int size,XMS_HANDLE handle,unsigned long offset)<BR>{<BR>    xms.length = size;<BR>    xms.source_handle = 0;<BR>    xms.source_offset  = FP_SEG((void far *)buf);<BR>    xms.source_offset &lt;&lt;= 16;<BR>    xms.source_offset += FP_OFF((void far *)buf);<BR>    xms.dest_handle = handle;<BR>    xms.dest_offset = offset;<BR>    XMS_Move(&amp;xms);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//从扩充内存中读取汉字点阵字模到常规内存缓冲区buf<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl Read_From_XMS(char *buf,unsigned int size,XMS_HANDLE handle,unsigned long offset)<BR>{<BR>    xms.length = size;<BR>    xms.source_handle = handle;<BR>    xms.source_offset = offset;<BR>    xms.dest_handle = 0;<BR>    xms.dest_offset = FP_SEG((void far *)buf);<BR>    xms.dest_offset &lt;&lt;= 16;<BR>    xms.dest_offset  += FP_OFF((void far *)buf);<BR>    XMS_Move(&amp;xms);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//汉字库点阵装载到扩充内存<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl ReadHzkXMS(char *Hzk16)<BR>{<BR>    unsigned long hzksize;<BR>    unsigned int size;<BR>    unsigned long offset = 0;<BR>    char buf[32];<BR>    FILE *fp;</P>
<P>    if (!XMS_Test())<BR>    {<BR>        puts("not found XMS");<BR>        exit(1);<BR>    }<BR>    if ((fp = fopen(Hzk16,"rb")) == NULL)<BR>    {<BR>        puts("Cannot Open HZK16 ...\n");<BR>        exit(1);<BR>    }<BR>    fseek(fp,0L,SEEK_END);<BR>    hzksize = ftell(fp);<BR>    fseek(fp,0L,SEEK_SET);<BR>    size = (int)(hzksize&gt;&gt;10) +1;<BR>    if (XMS_Size() &lt; size)<BR>    {<BR>        puts("not enough XMS");<BR>        fclose(fp);<BR>        exit(-1);<BR>    }<BR>    if ((xms_handle = XMS_Alloc(size)) == 0)<BR>    {<BR>        puts("XMS handle Error...");<BR>        fclose(fp);<BR>        exit(-1);<BR>    }<BR>    while (!feof(fp))<BR>    {<BR>        size = fread(buf,sizeof(char),32,fp);<BR>        Write_To_XMS(buf,size,xms_handle,offset);<BR>        offset += size;<BR>    }<BR>    fclose(fp);<BR>    ROM_ASCII = Current_ASCII_ROM(S16X8);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//    释放XMS内存<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl HzkFree(void)<BR>{<BR>    XMS_Free(xms_handle);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//    汉字点阵字模从XMS读到缓冲区buf中<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl ReadHzkBit(unsigned char *qw,unsigned char *buf)<BR>{<BR>    unsigned short QM,WM;<BR>    long offset;</P>
<P>    QM = *qw - 160;<BR>    WM = *(qw+1) - 160;<BR>    offset = ((QM-1)*94+WM-1)*32L;<BR>    Read_From_XMS(buf,32,xms_handle,offset);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//获得 ASCII ROM字符集首址<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>unsigned char far *Get_ASCII_ROM(unsigned int BX)<BR>{<BR>    _AX = 0x1130;<BR>    _BX = BX;<BR>    __int__(0x10);<BR>    return (unsigned char far *)MK_FP(_ES,_BP);</P>
<P>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//获得 8X8或14X8或16X8英文字模基地址<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>unsigned char far  *Current_ASCII_ROM(int ch)<BR>{<BR>    switch(ch)<BR>    {<BR>        case S8X8:<BR>            return (Get_ASCII_ROM(0x0300));<BR>        case S14X8:<BR>            return (Get_ASCII_ROM(0x0200));<BR>        case S16X8:<BR>            return (Get_ASCII_ROM(0x0600));<BR>        default:<BR>            return (Get_ASCII_ROM(0x0600));<BR>    }<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//显存换页函数<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl set_vbe_page(int page)<BR>{<BR>    if (g_cur_vbe_page != page)<BR>    {<BR>        _BX = 0;<BR>        _DX = g_cur_vbe_page = page;<BR>        _AX = 0x4F05;<BR>        __int__(0x10);<BR>    }<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//读像素点函数<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>char _Cdecl GetPixel(int x, int y)<BR>{<BR>    long addr;<BR>    int  page;<BR>    char far *videoptr = (char far *)0xa0000000L;</P>
<P>    addr = VRAM_GRAPH_800X600X256(x,y);<BR>    page = (int)(addr &gt;&gt; 16);<BR>    set_vbe_page(page);<BR>    return *(videoptr + (unsigned)(addr &amp; 0xffff));<BR>//  return (peekb(0xa000, (unsigned)(addr &amp; 0xFFFF) ));<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//画点函数<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl Common_PutPixel(int x,int y,int color)<BR>{<BR>    int page;<BR>    long addr;<BR>    char far *videoptr = (char far *)0xa0000000L;</P>
<P>    if (x &lt; 800 &amp;&amp; y &lt; 600)<BR>    {<BR>        addr = VRAM_GRAPH_800X600X256(x,y);<BR>        page = (int)(addr &gt;&gt; 16);<BR>        set_vbe_page(page);<BR>//        pokeb(0xa000, (unsigned)(addr &amp; 0xFFFF),color);<BR>        *(videoptr+(unsigned int)(addr&amp;0xffff))= color;<BR>    }<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//画点函数<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl PutPixel(int x,int y,int color)<BR>{<BR>    unsigned char put_mark = TRUE;<BR>    unsigned int i;</P>
<P>    if (!Stack_Empty())<BR>    {<BR>        for (i = 1 ; i &lt;= GUI_SP; i++)<BR>        {<BR>            if ((x &gt;= GUI_Stack[i].x1 &amp;&amp; x &lt;= GUI_Stack[i].x2)  &amp;&amp;<BR>                (y &gt;= GUI_Stack[i].y1 &amp;&amp; y &lt;= GUI_Stack[i].y2))<BR>                put_mark = FALSE;<BR>        }<BR>    }<BR>    if (put_mark)<BR>        Common_PutPixel(x,y,color);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//画点函数(弹出式窗口专用)<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl POPUP_PutPixel(int x,int y,int color)<BR>{<BR>    Common_PutPixel(x,y,color);<BR>}</P>

ba_wang_mao 发表于 2007-10-30 11:39

<P>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////中英文混合输出函数<BR>////unsigned char mat[16][2],<BR>////for(j=0;j&lt;16;j++)<BR>////        for(i=0;i&lt;2;i++)<BR>////            for(k=0;k&lt;8;k++)<BR>////                if(mat[j][i]&amp;(0x80&gt;&gt;k)) /*测试为1的位则显示*/<BR>////                    putpixel(i*8+k,j,WHITE);<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl puthz(int x,int y,char *p,int color,int d)<BR>{<BR>    unsigned int i,j;<BR>    unsigned char ch;<BR>    unsigned char matrix[32];</P>
<P>    while((ch=*p++)!=0)<BR>    {<BR>        if(ch&gt;160)<BR>        {<BR>            p--;<BR>            ReadHzkBit(p,matrix);<BR>            for(j = 0 ; j &lt; 16 ; j++)<BR>                for(i = 0 ; i &lt; 16 ; i++)<BR>                    if(matrix[2*j+i/8] &amp; (0x80&gt;&gt;i%8))<BR>                        PutPixel(i+x,y+j,color);<BR>                    else<BR>                        PutPixel(i+x,y+j,Back_Color);<BR>            p++;<BR>            p++;<BR>            x+=16+d;<BR>        }<BR>        else<BR>        {<BR>            for(i=0;i&lt;16;i++)<BR>            {<BR>                matrix[i*2]=*(ROM_ASCII+(ch)*16+i);<BR>                matrix[i*2+1]=0;        //    字模右边8位补0<BR>            }<BR>            for(j=0;j&lt;16;j++)<BR>                for(i=0;i&lt;8;i++)<BR>                    if (matrix[2*j+i/8] &amp; (0x80&gt;&gt;i%8))<BR>                       PutPixel(i+x,y+j,color);<BR>                    else<BR>                       PutPixel(i+x,y+j,Back_Color);<BR>            x+=8+d;<BR>/*-----------------------------------------------------------------------------------------------*/<BR>//    如果采用8X8点阵字模显示英文及数字,请采用如下代码<BR>/*-----------------------------------------------------------------------------------------------*/<BR>/*            for(i=0;i&lt;8;i++)<BR>                buf[i]=*(ROM_ASCII+(ch)*8+i);<BR>            for(j=0;j&lt;8;j++)<BR>                for(i=0;i&lt;8;i++)<BR>                    if((0x80&gt;&gt;i%8)&amp;buf[j+i/8])<BR>                        POPUP_PutPixel(i+x,y+j+5,color);<BR>                    else<BR>                        POPUP_PutPixel(i+x,y+j+5,Back_Color);<BR>            x+=8+d;*/<BR>        }<BR>    }<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////中英文混合输出函数(弹出式窗口专用)<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl POPUP_puthz(int x,int y,char *p,int color,int d)<BR>{<BR>    unsigned int i,j;<BR>    unsigned char ch;<BR>    char buf[32];</P>
<P>    while((ch=*p++)!=0)<BR>    {<BR>        if(ch&gt;160)<BR>        {<BR>            p--;<BR>            ReadHzkBit(p,buf);<BR>            for (j=0;j&lt;16;j++)<BR>            {<BR>                for (i=0;i&lt;16;i++)<BR>                    if ((0x80&gt;&gt;i%8)&amp;buf[2*j+i/8])<BR>                        POPUP_PutPixel(i+x,y+j,color);<BR>                    else<BR>                        POPUP_PutPixel(i+x,y+j,Back_Color);<BR>                POPUP_PutPixel(16+x,y+j,Back_Color);<BR>            }<BR>            p++;<BR>            p++;<BR>            x+=16+d;<BR>        }<BR>        else<BR>        {<BR>            for(i=0;i&lt;16;i++)<BR>            {<BR>                buf[i*2]=*(ROM_ASCII+(ch)*16+i);<BR>                buf[i*2+1]=0;        //字模右边8位补0</P>
<P>            }<BR>            for(j=0;j&lt;16;j++)<BR>            {<BR>                for(i=0;i&lt;8;i++)<BR>                    if ((0x80&gt;&gt;i%8)&amp;buf[2*j+i/8])<BR>                       POPUP_PutPixel(i+x,y+j,color);<BR>                    else<BR>                       POPUP_PutPixel(i+x,y+j,Back_Color);<BR>                POPUP_PutPixel(8+x,y+j,Back_Color);<BR>            }<BR>            x+=8+d;<BR>/*-----------------------------------------------------------------------------------------------*/<BR>//    如果采用8X8点阵字模显示英文及数字,请采用如下代码<BR>/*-----------------------------------------------------------------------------------------------*/<BR>/*            ROM_ASCII = Current_ASCII_ROM(S8X8);<BR>            for(i=0;i&lt;8;i++)<BR>                buf[i]=*(ROM_ASCII+(ch)*8+i);<BR>            for(j=0;j&lt;8;j++)<BR>                for(i=0;i&lt;8;i++)<BR>                    if((0x80&gt;&gt;i%8)&amp;buf[j+i/8])<BR>                        POPUP_PutPixel(i+x,y+j+5,color);<BR>                    else<BR>                        POPUP_PutPixel(i+x,y+j+5,Back_Color);<BR>            x+=8+d;*/<BR>        }<BR>    }<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////绘制一条垂直线函数<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl Vline(int x, int y1, int y2)<BR>{<BR>    int i,gcolor = getcolor();</P>
<P>    for (i = y1; i &lt;= y2; ++i)<BR>        PutPixel(x,i,gcolor);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////绘制一条垂直线函数(弹出式窗口专用)<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl POPUP_Vline(int x, int y1, int y2)<BR>{<BR>    int i,gcolor = getcolor();</P>
<P>    for (i = y1; i &lt;= y2; ++i)<BR>        POPUP_PutPixel(x,i,gcolor);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////绘制一条水平线函数<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl Hline(int x1, int y, int x2)<BR>{<BR>    int i,gcolor = getcolor();</P>
<P>    for (i=x1;i&lt;=x2;i++)<BR>        PutPixel(i,y,gcolor);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////绘制一条水平线函数(弹出式窗口专用)<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl POPUP_Hline(int x1, int y, int x2)<BR>{<BR>    int i,gcolor = getcolor();</P>
<P>    for (i=x1;i&lt;=x2;i++)<BR>        POPUP_PutPixel(i,y,gcolor);</P>
<P>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////通用画线子程序<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl Line(int x1,int y1,int x2,int y2)<BR>{<BR>    register int t,d;<BR>    int xer=0,yer=0,deta_x,deta_y,incx,incy;<BR>    int gcolor = getcolor();</P>
<P>    deta_x = x2 - x1;<BR>    deta_y = y2 - y1;<BR>    if (deta_x&gt;0)<BR>       incx = 1;<BR>    else if(deta_x == 0)<BR>        incx = 0;<BR>    else<BR>        incx = -1;<BR>    if (deta_y&gt;0)<BR>        incy = 1;<BR>    else if (deta_y == 0)<BR>        incy = 0;<BR>    else<BR>        incy = -1;</P>
<P>    deta_x = abs(deta_x);<BR>    deta_y = abs(deta_y);</P>
<P>    if (deta_x&gt;deta_y)<BR>        d = deta_x;<BR>    else<BR>        d = deta_y;</P>
<P>    for (t=0;t&lt;=d+1;t++)<BR>    {<BR>        PutPixel(x1,y1,gcolor);<BR>        xer += deta_x;<BR>        yer += deta_y;<BR>        if (xer&gt;d)<BR>        {<BR>            xer -= d;<BR>            x1 += incx;<BR>        }<BR>        if (yer&gt;d)<BR>        {<BR>            yer -= d;<BR>            y1 += incy;<BR>        }<BR>    }<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////画矩形<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl Rectangle(int x1,int y1,int x2,int y2)<BR>{<BR>    Hline(x1, y1, x2);<BR>    Hline(x1, y2, x2);<BR>    Vline(x1, y1, y2);<BR>    Vline(x2, y1, y2);</P>
<P>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////画矩形(弹出式窗口专用)<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl POPUP_Rectangle(int x1,int y1,int x2,int y2)<BR>{<BR>    POPUP_Hline(x1, y1, x2);<BR>    POPUP_Hline(x1, y2, x2);<BR>    POPUP_Vline(x1, y1, y2);<BR>    POPUP_Vline(x2, y1, y2);</P>
<P>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////填充矩形<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl Bar(int x1, int y1, int x2, int y2)<BR>{<BR>    int i,gcolor = getcolor();</P>
<P>    setcolor(Fill_Color);<BR>    for (i = y1; i &lt;= y2; ++i)<BR>        Hline(x1, i, x2);<BR>    setcolor(gcolor);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////填充矩形(弹出式窗口专用)<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl POPUP_Bar(int x1, int y1, int x2, int y2)<BR>{<BR>    int i,gcolor = getcolor();</P>
<P>    setcolor(Fill_Color);<BR>    for (i = y1; i &lt;= y2; ++i)<BR>        POPUP_Hline(x1,i,x2);<BR>    setcolor(gcolor);<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////画圆函数,以(c_x, c_y)为中心画一半径为r的圆<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl Circle(int c_x, int c_y, int r)<BR>{<BR>    int x = 0, y = r, d0, d1, d2, direction;<BR>    int gcolor = getcolor();</P>
<P>    d0 = (1-r) &lt;&lt; 1;<BR>    while (y &gt;= 0)<BR>    {<BR>        PutPixel(c_x + x, c_y + y, gcolor);<BR>        PutPixel(c_x - x, c_y - y, gcolor);<BR>        PutPixel(c_x + x, c_y - y, gcolor);<BR>        PutPixel(c_x - x, c_y + y, gcolor);<BR>        if (d0 &lt; 0)<BR>        {<BR>            d1 = ((d0 + y) &lt;&lt; 1) -1;<BR>            if (d1 &lt;= 0) direction = 1;<BR>            else direction = 2;<BR>        }<BR>        else if (d0 &gt; 0)<BR>        {<BR>            d2 = ((d0 - x) &lt;&lt; 1) - 1;<BR>            if (d2 &lt;= 0) direction = 2;<BR>            else direction = 3;<BR>        }<BR>        else direction = 2;</P>
<P>        switch(direction)<BR>        {<BR>            case 1 : ++x;<BR>                d0 += (x&lt;&lt;1) + 1;<BR>                break;<BR>            case 2 : ++x;<BR>                --y;<BR>                d0+=(x-y+1)&lt;&lt;1;<BR>                break;<BR>            case 3 : --y;<BR>                d0 += -(y&lt;&lt;1) + 1;<BR>                break;<BR>        }<BR>    }<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////填充的圆形,使用的是Midpoint算法<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl CircleFill(int x0, int y0, int r)<BR>{<BR>    int x,y;<BR>    int deltax,deltay;<BR>    int d,gcolor = getcolor();</P>
<P>    x = 0;<BR>    y = r;<BR>    deltax = 3;<BR>    deltay = 2 - (r &lt;&lt; 1);<BR>    d = 1 - r;</P>
<P>    setcolor(getfillcolor());<BR>    while (x &lt;= y)<BR>    {<BR>        Hline(x0-x, y0+y, x0+x) ;<BR>        Hline(x0-x, y0-y, x0+x);<BR>        Hline(x0-y, y0-x, x0+y);<BR>        Hline(x0-y, y0+x, x0+y);<BR>        Hline(x0-x, y0+y, x0+x);<BR>        if(d&lt;0)<BR>        {<BR>            d += deltax;<BR>            deltax += 2;<BR>            x++;<BR>        }<BR>        else<BR>        {<BR>            d += deltax+deltay;<BR>            deltax += 2;<BR>            deltay += 2;<BR>            x++;<BR>            y--;<BR>         }<BR>    }<BR>   setcolor(gcolor);<BR>}<BR></P>

ba_wang_mao 发表于 2007-10-30 11:39

<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>////图形模式初始化子程序<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl InitGraph(void)<BR>{<BR>    _AX = 0x4F02;<BR>    _BX = VBE800X600X256;<BR>    __int__(0x10);<BR>    if (_AH != 0)<BR>    {<BR>        puts("Can't Initialize the graphics mode!");<BR>        exit(1);<BR>    }<BR>}</P>
<P><BR>//////////////////////////////////////////////////////////////////////////////<BR>////关闭图形模式,回到文本模式子程序<BR>//////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl CloseGraph(void)<BR>{<BR>    _AX = 0x4F02;<BR>    _BX = 0x03;<BR>    __int__(0x10);<BR>}</P>
<P><BR>//////////////////////////////////////////////////////////////////////////////<BR>////保存窗口映像<BR>//////////////////////////////////////////////////////////////////////////////<BR>BOOL _Cdecl Save_Image_XMS(int x1,int y1,int x2,int y2)<BR>{<BR>    int i,j,size;<BR>    long long_size,offset = 0;<BR>    XMS_HANDLE handle;<BR>    char *ptr,buffer[800];</P>
<P>    long_size = ((long)800L-(long)x1+1)*((long)y2-(long)y1+1);<BR>    long_size &gt;&gt;= 10;<BR>    size = long_size;<BR>    size++;<BR>    if (XMS_Size() &gt; size)<BR>    {<BR>        if ((handle = XMS_Alloc(size)) != 0)<BR>        {<BR>            if (PUSH_Stack(x1,y1,x2,y2,handle))<BR>            {<BR>                size = 800 - TOP_X1();<BR>                for (i = TOP_Y1() ; i &lt;= TOP_Y2() ; i++)<BR>                {<BR>                    ptr = buffer;<BR>                    for (j = TOP_X1() ; j &lt; 800 ; j++)<BR>                        *ptr++ = GetPixel(j,i);<BR>                    Write_To_XMS(buffer,size,TOP_Handle(),offset);<BR>                    offset += size;<BR>                }<BR>                return (TRUE);<BR>            }<BR>        }<BR>    }<BR>    return (FALSE);<BR>}</P>
<P><BR>//////////////////////////////////////////////////////////////////////////////<BR>////恢复窗口映像<BR>//////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl Restore_Image_XMS(void)<BR>{<BR>    int i,j,size;<BR>    long offset = 0;<BR>    char *ptr,buffer[800];</P>
<P>    for (i = TOP_Y1() ; i &lt;= TOP_Y2() ; i++)<BR>    {<BR>        size = 800 - TOP_X1();<BR>        Read_From_XMS(buffer,size,TOP_Handle(),offset);<BR>        ptr = buffer;<BR>        for (j = TOP_X1() ; j &lt; 800 ; j++)<BR>            POPUP_PutPixel(j,i,*ptr++);<BR>        offset += size;<BR>    }<BR>}</P>
<P><BR>//////////////////////////////////////////////////////////////////////////////<BR>////弹出式列表当前位置以红色为底色,白色为字符色,显示亮条<BR>////入口参数:<BR>////    x1,y1 = 坐标(以像素为单位)<BR>////    len = 亮条宽度<BR>////    string = 显示字符串<BR>//////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl POPUP_SET_Light_Bar(int x1,int y1,int len,char *string)<BR>{<BR>    int bcolor = getbkcolor();</P>
<P>    setfillstyle(SOLID_FILL,LIGHTRED);<BR>    setbkcolor(LIGHTRED);<BR>    POPUP_Bar(x1-2,y1-8,x1+len+2,y1+16+8);<BR>    POPUP_puthz(x1,y1,string,WHITE,0);<BR>    setbkcolor(bcolor);<BR>}</P>
<P><BR>//////////////////////////////////////////////////////////////////////////////<BR>////弹出式列表恢复亮条<BR>////入口参数:<BR>////    x1,y1 = 坐标(以像素为单位)<BR>////    len = 亮条宽度<BR>////    string = 显示字符串<BR>//////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl POPUP_RESTORE_Light_Bar(int x1,int y1,int len,char *string)<BR>{<BR>    int bcolor = getbkcolor();</P>
<P>    setfillstyle(SOLID_FILL,DIALOG_TEXT_BK_COLOR);<BR>    setbkcolor(DIALOG_TEXT_BK_COLOR);<BR>    POPUP_Bar(x1-2,y1-8,x1+len+2,y1+16+8);<BR>    POPUP_puthz(x1,y1,string,BLACK,0);<BR>    setbkcolor(bcolor);<BR>}</P>
<P><BR>//////////////////////////////////////////////////////////////////////////////<BR>////画一个凹矩形<BR>//////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl POPUP_GuiConCaveRectangle(int x1,int y1,int x2,int y2)<BR>{<BR>    setcolor(DARKGRAY);<BR>    POPUP_Hline(x1,y1,x2);<BR>    POPUP_Vline(x1,y1,y2);<BR>    setcolor(WHITE);<BR>    POPUP_Hline(x1,y2,x2);<BR>    POPUP_Vline(x2,y1,y2);<BR>}</P>
<P><BR>//////////////////////////////////////////////////////////////////////////////<BR>////画一个凸按钮(专门用于画对话框、列表框的外框)<BR>//////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl POPUP_GuiConProtrudingBox(int x1,int y1,int x2,int y2)<BR>{<BR>    setcolor(WHITE);<BR>    POPUP_Hline(x1,y1,x2);<BR>    POPUP_Vline(x1,y1,y2);<BR>    POPUP_Hline(x1-1,y1-1,x2+1);<BR>    POPUP_Vline(x1-1,y1-1,y2+1);<BR>    setcolor(DARKGRAY);<BR>    POPUP_Hline(x1,y2,x2);<BR>    POPUP_Vline(x2,y1,y2);<BR>    POPUP_Hline(x1-1,y2+1,x2+1);<BR>    POPUP_Vline(x2+1,y1-1,y2+1);<BR>    setfillstyle(SOLID_FILL,DIALOG_TEXT_BK_COLOR);<BR>    POPUP_Bar(x1+1,y1+1,x2-1,y2-1);<BR>    POPUP_GuiConCaveRectangle(x1+2,y1+2,x2-2,y1+28-2);<BR>    setfillstyle(SOLID_FILL,DIALOG_TITLE_BK_COLOR);<BR>    POPUP_Bar(x1+4,y1+4,x2-4,y1+28-4);<BR>}</P>
<P><BR>//////////////////////////////////////////////////////////////////////////////<BR>//    画一条凹凸立体线<BR>//////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl POPUP_Double_Line(int x1,int y1,int x2)<BR>{<BR>    setcolor(DARKGRAY);<BR>    POPUP_Hline(x1,y1-1,x2);<BR>    setcolor(WHITE);<BR>    POPUP_Hline(x1,y1,x2);<BR>}</P>
<P><BR>////////////////////////////////////////////////////////////////////////////////////////////////<BR>//    创建对话框子程序<BR>//    入口参数:<BR>//        x1,y1,x2,y2 = 窗口区域<BR>//    功能:<BR>//        1.窗口区域(x1,y1,x2,y2)及窗口指针入栈<BR>//        2.保存窗口区域屏幕到扩展内存<BR>//        2.画对话框<BR>////////////////////////////////////////////////////////////////////////////////////////////////<BR>BOOL _Cdecl POPUP_Create_DialogBox(int x1,int y1,int x2,int y2)<BR>{<BR>    if (Save_Image_XMS(x1,y1,x2,y2))<BR>    {<BR>        POPUP_GuiConProtrudingBox(TOP_X1()+1,TOP_Y1()+1,TOP_X2()-1,TOP_Y2()-1);<BR>        return (TRUE);<BR>    }<BR>    return (FALSE);<BR>}</P>
<P><BR>////////////////////////////////////////////////////////////////////////////////////////////////<BR>//  关闭对话框子程序<BR>////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl POPUP_Close_DialogBox(void)<BR>{<BR>    if (!Stack_Empty())<BR>    {<BR>        Restore_Image_XMS();<BR>        XMS_Free(TOP_Handle());<BR>        POP_Stack();<BR>    }<BR>}</P>
<P><BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>//    快速清除屏幕子程序(将缓冲屏幕中的数据直接复制到可见视频缓存区里面去)<BR>//    由于分辨率为800*600*256色(8位深度),因此共需800*600/65535=8页=512K<BR>/////////////////////////////////////////////////////////////////////////////////////////////////<BR>void _Cdecl GuiQuickClsScreen(int color)<BR>{<BR>    unsigned int i,j;<BR>    unsigned char VDCBuf[800];<BR>    unsigned int dest_off = 0;</P>
<P>    memset(VDCBuf,color,800);<BR>    for (j = 0 ; j &lt; 8 ; j++)            // 页号(共需8页)<BR>    {<BR>        set_vbe_page(j);                    // 依次选择页号0-页号7<BR>        dest_off = 0;                    // 偏移<BR>        for (i = 0 ; i &lt; 81 ; i++)        // 由于显卡每页64K,因此先送64800个像素<BR>        {<BR>            movedata(FP_SEG(VDCBuf),FP_OFF(VDCBuf),0xa000,dest_off,800);<BR>            dest_off += 800;            // 指向下一根扫描线<BR>        }<BR>        movedata(FP_SEG(VDCBuf),FP_OFF(VDCBuf),0xa000,dest_off,736);// 将每页余下的736个像素单独送<BR>    }<BR>}</P>
<P>void main(void)<BR>{<BR>    InitGraph();<BR>    GuiQuickClsScreen(BLUE);<BR>    POPUP_GuiConProtrudingBox(100,100,500,500);</P>
<P>    getch();<BR>    getch();<BR>}</P>

kk4868 发表于 2007-10-30 12:14

<P>风格和注释都不错,希望能坚持写下去,做个游戏引擎,呵呵</P>

maomsx 发表于 2007-10-30 21:55

XMS_Function=(void far *)MK_FP(_ES,_BX); //    返回值:ES:BX -&gt; 驱动程序入口地址<BR>好像编译通过不了

ba_wang_mao 发表于 2007-10-31 08:42

一定要在在TC++3.0 FOR DOS 及 BORLAND C++3.1 FOR DOS<BR>不要在TC2.0下编译(TC2.0下我没试过)

一笔苍穹 发表于 2007-10-31 09:06

非常好,已加精

RockCarry 发表于 2007-10-31 09:37

tc2.0 不支持 // 的单行注释

zhulei1978 发表于 2007-10-31 21:01

我用TC3.0也通不过<br><br>[attach]29781[/attach]<br>
[align=right][color=#000066][此贴子已经被作者于2007-10-31 21:05:00编辑过][/color][/align]

ba_wang_mao 发表于 2007-11-1 08:33

扩展名要用.C,不能用.CPP。例如:GRAPH.C,不能为GRAPH.CPP。

zhulei1978 发表于 2007-11-1 14:51

哦,我把后缀名改为c,编译通过了,可是执行exe文件后屏幕一片漆黑,什么也没有
[align=right][color=#000066][此贴子已经被作者于2007-11-1 18:09:08编辑过][/color][/align]

ba_wang_mao 发表于 2007-11-2 15:05

你的显示器不支持。

一笔苍穹 发表于 2007-11-2 17:26

确切的说是显卡<br>其实显卡也支持,只是没设置到位<br>

kk4868 发表于 2007-11-3 09:02

<P>等忙完了游戏,我写个EDID与VBE的信息读取软件吧,输出可用的分辨率,色深,刷新频率等信息</P>

维c 发表于 2007-11-3 12:54

强悍。。

xianshizhe111 发表于 2007-12-21 10:37

这段程序我在TC 3.0下无法通过.请问显卡该如何设置\我的显卡是GeForce 6600LE系列
双128位\PCI-E的,谢谢.

xianshizhe111 发表于 2007-12-21 17:58

怎么没人回答?
郁闷,郁闷..

页: [1]

编程论坛