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

📄 unix下c语言的图形编程--curses.h 函式库.txt

📁 相信您在网路上一定用过如 tin,elm 等工具, 这些软体有项共同的特色, 即他们能利用上下左右等方向键来控制游标的位置. 除此之外, 这些程式 的画面也较为美观. 对 Programm
💻 TXT
📖 第 1 页 / 共 2 页
字号:
    KEY_NPAGE       0522           Next page 
    KEY_PPAGE       0523           Previous page 

   以上仅列出笔者较常使用的一些控制键, 至於其他控制键的定义, 请自行参 

   阅 man curses (* 注三) 

   一并为您列出其他常用的一些特殊字元 

    [TAB]                 /t 
    [ENTER]               /r 
    [ESC]                 27 
    [BACKSPACE]           127 


 ■ 如何改变萤幕显示字元的属性 

   为了使输出的萤幕画面更为生动美丽,  我们常须要在萤幕上做一些如反白, 

   闪烁等变化.  curses 定义了一些特殊的属性, 透过这些定义, 我们也可以 

   在 curses 程式□控制萤幕的输出变化. 

    attron(mod)    开启属性 
    attroff(mod)   关闭属性 

   curses.h 里头定义了一些属性, 如: 

    A_UNDERLINE    加底线 
    A_REVERSE      反白 
    A_BLINK        闪烁 
    A_BOLD         高亮度 
    A_NORMAL       标准模式 (只能配合 attrset() 使用) 


   当使用 attron() 开启某一种特殊属性模式後, 接下来在萤幕的输出都会以 

   该种属性出现. 直到您呼叫 attroff() 将此模式关闭. 

   请注意, 当您欲 attron() 开启另一种属性时, 请记得利用 attroff()先关 

   闭原来的属性, 或直接以 attrset(A_NORMAL)  将所有特殊属性关闭.否则, 

   curses 会将两种属性做重叠处理. 

    □例: 

       attrset(A_NORMAL);            /* 先将属性设定为正常模式       */ 

       attron(A_UNDERLINE);          /* 加底线                       */ 

       mvaddstr(9,10,"加底线");      /* 加底线输出一串字元           */ 

       attroff(A_UNDERLINE);         /* 关闭加底线模式, 恢复正常模式 */ 

       attron(A_REVERSE);            /* 开启反白模式                 */ 

       mvaddstr(10,10,"反白");       /* 输出一串反白字元             */ 

       attroff(A_REVERSE);           /* 关闭反白模式, 恢复正常模式   */ 

       attron(A_BLINK);              /* 开启闪烁模式                 */ 

       mvaddstr(11,10,"闪烁");       /* 输出一串闪烁字元             */ 

       attroff(A_BLINK);             /* 关闭闪烁模式, 恢复正常模式   */ 

       attron(A_BOLD);               /* 开启高亮度模式               */ 

       mvaddstr(12,10,"高亮度");     /* 输出一串高亮度字元           */ 

       attroff(A_BOLD);              /* 关闭高亮度模式, 恢复正常模式 */ 



 ■ 其他常用的一些函式 

      beep()              发出一声哔声 
      box(win,ch1,ch2)    自动画方框  ch1: 画方框时垂直方向所用字元 
                                      ch2: 画方框时水平方向所用字元 

                                      example: box(stdscr,'|','-'); 
                                      将以 | 及 - 围成一个方框 

 ■ 应用完整□例 

   下面所举的例子,  即完全利用刚刚所介绍的含式来完成.这个程式可将从键 

   盘上读取的字元显示在萤幕上, 并且可以上下左右方向键来控制游标的位置 

   , 当按下 [ESC] 後, 程式即结束. 

   您有没有发现, 这不就是一个简单全萤幕编辑器的雏形吗? 


  #include <curses.h>                  /* 引进 curses.h , 并自动引进 
stdio.h */ 


  #define StartX  1                    /* 决定游标初始位置 */ 
  #define StartY  1 

  void initial(); 

  main() 
  { 
     int x=StartX;                     /* 宣告 x,y 并设定其初值 
     */ 

     int y=StartY; 
     int ch;                           /* 宣告 ch 为整数,配合 getch() 
使用   */ 


     initial();                        /* 呼叫 initial(), 启动 curses 
模式,  */ 

                                       /* 并完成其它设定 
     */ 


     box(stdscr,'|','-');              /* 画方框 
     */ 


     attron(A_REVERSE);                /* 开启反白模式 
     */ 

     mvaddstr(0,20,"Curses Program");  /* 在 (20,0) 处输出反白字元 
     */ 

     attroff(A_REVERSE);               /* 关闭反白模式 
     */ 


     move(x,y);                        /* 将游标移至初始位置 
     */ 


     do {                              /* 以无限回圈不断等待输入 
     */ 

      ch=getch();                      /* 等待自键盘输入字元 
      switch(ch) {                     /* 判断输入字元为何 
     */ 


         case KEY_UP: --y;             /* 判断是否"↑"键被按下 
     */ 

                      break; 
         case KEY_DOWN: ++y;           /* 判断是否"↓"键被按下 
     */ 

                      break; 
         case KEY_RIGHT: ++x;          /* 判断是否"→"键被按下 
     */ 

                      break; 
         case KEY_LEFT: --x;           /* 判断是否"←"键被按下 
     */ 

                      break; 
         case '\r':                    /* 判断是否 ENTER 键被按下 
     */ 

                   ++y; 
                   x=0; 
                   break; 
         case '\t':                    /* 判断是否 TAB 键被按下 
     */ 

                   x+=7; 
                   break; 
         case 127:                     /* 判断是否 BACKSPACE 键被按下 
     */ 

                    mvaddch(y,--x,' ');/* delete 一个字元 
     */ 

                    break; 

         case 27: endwin();            /* 判断是否[ESC]键被按下 
     */ 

                  exit(1);             /* 结束 curses 模式 
     */ 

                                       /* 结束此程式 
     */ 


         default: 
                  addch(ch);           /* 如果不是特殊字元, 将此字元印 
出     */ 

                  x++; 
                  break; 
       } 
       move(y,x);                      /* 移动游标至现在位置 
     */ 

     } while (1); 
   } 

  void initial()                       /* 自定开启 curses 函式 
     */ 

  { 
      initscr(); 
      cbreak(); 
      nonl(); 
      noecho(); 
      intrflush(stdscr,FALSE); 
      keypad(stdscr,TRUE); 
      refresh(); 
   } 



 ■ 後记 

   学完了上述的一些命令,  相不相信您已经可以写出一个漂亮的全萤幕编辑 
   器了? 事实上, curses 提供的函式不下  200 个, 可是笔者认为, 一切再 
   复杂的函式都可以用本文提到的一些组合变化而成,  学了太多的函式, 只 
   是徒增自己困扰罢了.  当然,  如果您对其它函式有兴趣,  可以自行参阅 
   curses 说明档.  ( 方法: % man curses ) 本文不过行抛砖引玉之效, 也 
   希望未来能陆续出现更多同学自行创作的程式. 

    * 任何疑问及建议, 欢迎 e-mail 至 ljh@CCCA.NCTU.edu.tw. 谢谢 ! * 



注一: 
    请参考 /usr/share/lib/termcup 
           /usr/share/lib/terminfo/s/sun 

注二: 
    1.如果是 BSD 的版本, 需使用 
      cc [file.c] -lcurses -ltermcap 来完成 compile. 
    2.计中工作站不知何故将原来的 /usr/5bin/cc 更改为 /usr/5bin/cc.org 

      因此, 您若想在计中工作站 compile curses 程式.需以 /usr/5bin/cc. 
org 
      取代 /usr/5bin/cc , 否则 compile 可能发生错误. 
    3.较旧版的 curses 需同时引进 curses 和 termlib 这两个 library, 
      因此, 您必须使用 /usr/5bin/cc [file.c] -lcurses -ltermlib 来 
compile. 

注三: 
     根据笔者的经验, 上下左右方向键应可正常使用而不会发生问题, 但其它 

     如 PgUp,PgDn,功能键,Home,End 等特殊键, 很容易因机器, 键盘不同而无 

     法使用, 因此, 若您的程式须要在不同的机器上使用, 建议您只用方向键来 

     控制, 其它的特殊键少用为妙. 
     至於 PgUp,PgDn 一些特殊键的控制方法, 由於较为复杂, 有兴趣的同学可 
     考 tin 原始程式 curses.c 内所使用的一些方法. 
 
 

⌨️ 快捷键说明

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