xptan 发表于 2007-4-3 16:27

C语言文本屏幕界面设计方法

在做论文,使用C语言文本屏幕界面设计,但是用的不好,希望大家能提供一些例程,谢谢

neverTheSame 发表于 2007-4-3 16:46

就是使用C语言的文本模式写界面设计,而不是图形模式.

xptan 发表于 2007-4-3 17:08

是啊,我知道,我现在遇到的是我有三个参数是必须在一行,当输完第一个参数后,按回车,我定义的<BR>if(key==7181) {clreol();scanf("%f",&amp;Kp)},后面的全被删除了,是因为用了clreol();,可我的目的只是想重新输入第一个参数,请大家告诉我好的方法。

hjj1123 发表于 2007-4-3 18:11

<P>真是想得出来,你这样做很费力并且效果不会很好.</P>

xptan 发表于 2007-4-4 13:39

<P>那该怎么做,有好方法说一下</P>

hjj1123 发表于 2007-4-6 16:26

咦,你 的题目有疑义."使用C语言文本屏幕界面设计",是在C语言文本模式下写屏幕界面?还是用C语言写文本屏幕界面?前一个解释比较麻烦,效果不大好.后一种解释明显是让你在图形模式下写屏幕界面.

ba_wang_mao 发表于 2007-4-11 11:46

<P>本程序必须在TC++ 3.0及心上版本编译<BR>#include &lt;bios.h&gt;<BR>#include &lt;dos.h&gt;<BR>#include &lt;string.h&gt;<BR>#ifdef __cplusplus<BR>    #define __CPPARGS ...<BR>#else<BR>    #define __CPPARGS<BR>#endif<BR>#define ESC_KEY                    0x011B<BR>#define DOUBLE_X                 205<BR>#define DOUBLE_Y                 186<BR>#define DOUBLE_LEFT_UP          201<BR>#define DOUBLE_LEFT_DOWN          187<BR>#define DOUBLE_RIGHT_UP          200<BR>#define DOUBLE_RIGHT_DOWN          188<BR>#define SHADOW_ATTR              0x07<BR>#define WINDOW_ATTR              0x1E<BR>#define DESKTOP_ATTR             0x71<BR>#define DESKTOP_CHAR             0xB0<BR>#define WINDOW_CHAR              0X20<BR>#define WHITE_BLACK                0x70<BR>#define WHITE_RED                0x74<BR>#define WHITE_YELLOW            0x76<BR>#define WHITE_BLUE                0x71<BR>#define BLUE_WHITE                0x17<BR>#define BLUE_WHITE_LIGHT        0x1F<BR>#define BLUE_LIGHT_WHITE        0x97<BR>#define BLUE_GRAY                0x18<BR>#define BLUE_LIGHT_GRAY            0x98<BR>#define BLUE_YELLOW                0x1E<BR>#define BLUE_GREEN                0x12<BR>#define BLUE_LIGHT_GREEN        0x1A<BR>#define BLUE_RED                0x1D<BR>#define MIN_DESKTOP_X            0x01<BR>#define MAX_DESKTOP_X            0x17<BR>#define MAX_WINDOW_X            0x17<BR>#define MIN_WINDOW_X            0x01<BR>#define MAX_DESKTOP_Y            0x4F<BR>#define MIN_DESKTOP_Y            0x00<BR><BR><BR>//保存光标<BR>void CursorSave(void)<BR>{<BR>    union REGS regs;</P>
<P>    regs.h.ah = 0x03;<BR>    regs.h.bh = 0x00;<BR>    int86(0x10,&amp;regs,&amp;regs);<BR>    xSave = regs.h.dh;<BR>    ySave = regs.h.dl;<BR>    regs.h.ah = 0x02;<BR>    regs.h.bh = 0x00;<BR>    regs.h.dh = 0x50;<BR>    regs.h.dl = 0x50;<BR>    int86(0x10,&amp;regs,&amp;regs);<BR>}</P>
<P>//恢复光标<BR>void CursorRestore(void)<BR>{<BR>    union REGS regs;</P>
<P>    regs.h.ah = 0x02;<BR>    regs.h.bh = 0x00;<BR>    regs.h.dh = xSave;<BR>    regs.h.dl = ySave;<BR>    int86(0x10,&amp;regs,&amp;regs);<BR>}</P>
<P>//窗口区域上滚,背景颜色=attr<BR>void WindowScrollUp(char x1,char y1,char x2,char y2,char attr)<BR>{<BR>    union REGS regs;</P>
<P>    regs.h.ah = 0x06;<BR>    regs.h.al = 0x01;<BR>    regs.h.bh = attr;<BR>    regs.h.cl = y1;<BR>    regs.h.ch = x1;<BR>    regs.h.dl = y2;<BR>    regs.h.dh = x2;<BR>    int86(0x10,&amp;regs,&amp;regs);<BR>}</P>
<P>//在(x,y)写字符,颜色=attr<BR>void WriteChar(unsigned char x,unsigned char y,unsigned char c,unsigned char attr)<BR>{<BR>    char far *v = (char far *)0xb8000000;<BR>    char far *t;</P>
<P>    t = v + x*0xA0+y*0x02;<BR>    *t++ = c;<BR>    *t++ = attr;<BR>}</P>
<P>//在(x,y)写字符串,颜色=attr<BR>void WriteString(const unsigned char x,const unsigned char y,char *String,const unsigned char attr)<BR>{<BR>    unsigned char j = y;<BR>    char *ptr = String;</P>
<P>    while (*ptr)<BR>        WriteChar(x,j++,*ptr++,attr);<BR>}<BR><BR>//读(x,y)处的字符及颜色<BR>unsigned int ReadCharAttr(const unsigned char x , const unsigned char y)<BR>{<BR>    unsigned char lo,hi;</P>
<P>    char far *v = (char far *)0xb8000000;<BR>    char far *t;</P>
<P>    t = v + x*0xA0+y*0x02;<BR>    lo = *t++;                                   // char<BR>    hi = *t++;                                   // attr<BR>    return int(hi*256+lo);<BR>}<BR><BR>//保存窗口区域内容<BR>void WindowSaveImage(void)<BR>{<BR>    unsigned char far *image_ptr = image;<BR>    unsigned int num;</P>
<P>    for (char i = 0x00 ; i &lt;= 0x18; i++)<BR>        for (char j = 0x00 ; j &lt;= 0x4F; j++)<BR>        {<BR>            num = ReadCharAttr(i,j);<BR>            *image_ptr++ = num%256;<BR>            *image_ptr++ = num/256;<BR>        }<BR>}</P>
<P>//恢复窗口区域内容<BR>void WindowRestoreImage(void)<BR>{<BR>    unsigned char far *image_ptr = image;</P>
<P>    for (char i = 0x00; i &lt;= 0x18; i++)<BR>        for (char j = 0x00 ; j &lt;= 0x4F ; j++)<BR>        {<BR>            unsigned char c = *image_ptr++;<BR>            unsigned char attr = *image_ptr++;<BR>            WriteChar(i,j,c,attr);<BR>        }<BR>}</P>
<P>//画窗口<BR>void WindowBorder(const char x1,const char y1,const char x2,const char y2,unsigned char box_attr)<BR>{<BR>    for (char i=y1; i&lt;y2; i++)<BR>    {<BR>        WriteChar(x1,i,DOUBLE_X,box_attr);<BR>        WriteChar(x2,i,DOUBLE_X,box_attr);<BR>    }<BR>    for (i=x1; i&lt;x2; i++)<BR>    {<BR>        WriteChar(i,y1,DOUBLE_Y,box_attr);<BR>        WriteChar(i,y2,DOUBLE_Y,box_attr);<BR>    }<BR>    WriteChar(x1,y1,DOUBLE_LEFT_UP,box_attr);<BR>    WriteChar(x1,y2,DOUBLE_LEFT_DOWN,box_attr);<BR>    WriteChar(x2,y1,DOUBLE_RIGHT_UP,box_attr);<BR>    WriteChar(x2,y2,DOUBLE_RIGHT_DOWN,box_attr);<BR>}</P>
<P>//窗口初始化<BR>void WindowInit(const int x1,const int y1,const int x2,const int y2,unsigned char box_attr,unsigned char window_attr,unsigned char title_attr,char *title)<BR>{<BR>    char i,j;</P>
<P>    for (i=x1; i&lt;x2; i++)<BR>        for (j=y1; j&lt;y2; j++)<BR>            WriteChar(i,j,WINDOW_CHAR,window_attr);<BR>    for (i = x1+1;i&lt;=x2+1;i++)<BR>        WriteChar(i,y2+1,WINDOW_CHAR,SHADOW_ATTR);<BR>    for (j=y1+2; j&lt;=y2+1; j++)<BR>        WriteChar(x2+1,j,WINDOW_CHAR,SHADOW_ATTR);<BR>    for (i=x1+1; i&lt;=x2+1; i++)<BR>        WriteChar(i,y2+1,WINDOW_CHAR,SHADOW_ATTR);<BR>    for (j=y1+2; j&lt;=y2+1; j++)<BR>        WriteChar(x2+1,j,WINDOW_CHAR,SHADOW_ATTR);<BR>    WindowBorder(x1,y1,x2,y2,box_attr);<BR>    WriteString(x1,y1+(y2-y1+1-strlen(title))/2,title,title_attr);<BR>}</P>
<P>//桌面初始化<BR>void DeskTopInit(char *title)<BR>{<BR>    for (unsigned char i = 0x00 ; i &lt;= 0x4F;i++)<BR>    {<BR>        WriteChar(0x00,i,WINDOW_CHAR,WHITE_BLACK);<BR>        WriteChar(0x18,i,WINDOW_CHAR,WHITE_BLACK);<BR>    }<BR>    for (i = MIN_DESKTOP_X; i&lt;=MAX_DESKTOP_X; i++)<BR>        for (unsigned char j = MIN_DESKTOP_Y; j&lt;=MAX_DESKTOP_Y; j++)<BR>            WriteChar(i,j,DESKTOP_CHAR,DESKTOP_ATTR);<BR>    WriteString(0x00,(80-strlen(title))/2,title,WHITE_BLACK);<BR>}<BR></P>

ba_wang_mao 发表于 2007-4-11 11:49

unsigned char image[(25*80+1)*2];<BR>

页: [1]

编程论坛