中文字幕在线一区二区在线,久久久精品免费观看国产,无码日日模日日碰夜夜爽,天堂av在线最新版在线,日韩美精品无码一本二本三本,麻豆精品三级国产国语,精品无码AⅤ片,国产区在线观看视频

      DOS界面下通用圖形編輯軟件的設(shè)計(jì)

      時(shí)間:2024-06-26 21:17:18 計(jì)算機(jī)畢業(yè)論文 我要投稿
      • 相關(guān)推薦

      DOS界面下通用圖形編輯軟件的設(shè)計(jì)


         摘 要 該文介紹了一種建立在DOS界面下生成圖素文件的通用圖形編輯程序的設(shè)計(jì)方法。
      目前用作DDC的PC總線工控機(jī)(IPC)大部分工作在DOS界面上,而DOS不具有像Windows那樣美觀方便的圖形用戶接口(GUI)。生成工藝流程圖等復(fù)雜圖形若用程序設(shè)計(jì)語言直接編程需花費(fèi)大量精力和代碼,且不易修改。設(shè)計(jì)出數(shù)據(jù)文件小,占用內(nèi)存少的圖形編輯軟件是控制界的一個(gè)研究課題。這里介紹一種生成圖素?cái)?shù)據(jù)文件的通用圖形編輯軟件的設(shè)計(jì)方法。
      一、數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)文件格式
      由于所有的操作都基本建立在圖素的基礎(chǔ)之上,故數(shù)據(jù)結(jié)構(gòu)也以圖素為中心。以下以圓、直線、矩形、字符串為例,其它圖素類似。
      1.定義所需圖素
      struct circle /*定義圓 */
      {
      int x,y,r; /* 圓心,半徑 */
      char linecolor,linestyle; /* 圓外圍線的顏色,線型 */
      char fillcolor,fillstyle; /* 填充顏色,模式 */
      };
      struct line /* 定義直線 */
      {
      int x1,y1;
      int x2,y2;
      char linecolor,linestyle,linethick; /* 線顏色,模式,粗細(xì) */
      };
      struct box /* 定義矩形 */
      {
      int x1,y1;
      int x2,y2;
      char linecolor,linestyle;
      char fillcolor,fillstyle;
      };
      struct string /* 定義字符串 */
      {
      int x,y;
      char str[10]
      char backcolor,dir;
      char str-color,str-style;
      };
      .
      . /* 定義其它圖素 */
      .
      2.將各圖素置于一條鏈表之中
      typedef struct tagElementList
      {
      char ElementType; /* 標(biāo)識(shí)元素類別 */
      int ElementID; /* 元素標(biāo)識(shí)符,在接口中用來控制其屬性 */
      union tagElement {
      struct circle circle;
      struct box box;
      struct string string;
      struct line line;
      .
      . /* 可在此說明其它元素 */
      .
      }Element;
      struct tagElementList *next;
      }ElementList;
      利用這種數(shù)據(jù)結(jié)構(gòu)可在內(nèi)存中形成一個(gè)圖素鏈表,所有操作都可以此鏈表為基礎(chǔ)。
      3.定義幾個(gè)指針,以備各種操作
      ElementList *List-head. *List-end,*List-temp, *List-here;
      4.定義一個(gè)全局變量,記錄圖素個(gè)數(shù)
      static int Elementcount=0;
      圖形文件格式為:第一字節(jié)(char),表示整個(gè)圖形的背景顏色;接下來一個(gè)字(word),對(duì)應(yīng)于Elementcount,表示圖素個(gè)數(shù);后面是內(nèi)存鏈表中每個(gè)圖素的屬性值。
      二、圖形編輯功能的實(shí)現(xiàn)
      本軟件包含的圖形編輯功能主要有:作圖、修改、移動(dòng)、刪除、復(fù)制,下面僅舉幾例說明實(shí)現(xiàn)的方法。
      1.作圖
      以圓為例,其它圖形類似。
      drawcircle()
      {
      int i;
      char s[20],c;
      int cx,cy,cr;
      int cls,clc,cfc,cfs;
      movecursor(); /* 移動(dòng)光標(biāo),確定圓心 */
      cx=cursor-x;
      cy=cursor-y;
      movecursor(); /* 確定半徑 */
      cr=(int)sqrt((cursor-x-cx)*(cursor-x-cx)+(cursor-y-cy)*(cursor-y-cy);
      setcolor(WHITE);
      circle (cx,cy,cr); /* 畫圓 */
      cls=selectlinestyle();
      clc=selectcolor ("select-line-color");
      setcolor(clc);
      for(i=0;i<=cls;i++)
      circle(cx,cy,cr-i);
      cfs=selectfillstyle();
      cfc=selectcolor("set-fill-color");
      setfillstyle(cfs.cfc);
      floodfill(cx,cy,clc); /* 填充 */
      temp(ElementList *) malloc(sizeof(ElementList));
      temp->ElementType= 'c';
      temp->Element.circle.x=cx;
      temp->Element.circle.y=cy;
      temp->Element.circle.r=cr;
      temp->Element.circle.lcolor=clc;
      temp->Element.circle.lstyle=cls;
      temp->Element.circle.fcolor=cfc;
      temp->Element.circle.fstyle=cfs;
      addtolist(temp); /* 將圖素加入圖素鏈表 */
      }
      其中 addtolist ()可以如下實(shí)現(xiàn):
      addtolist (ElementList *Etemp)
      {
      if(List-head==NULL)
      {
      List-head=Etemp;
      List-end=Etemp;
      }
      else
      { List-end->next=Etemp;
      List-end=Etemp;
      Etemp->next=NULL;
      }
      Elementcount++;
      }
      2.圖形的移動(dòng)、刪除、復(fù)制功能
      以移動(dòng)為例,首先用箭頭鍵或鼠標(biāo)框取要移動(dòng)的區(qū)域,區(qū)域矩形的左上,右下坐標(biāo)分別為(block-x1,block-y1),(block-x2,block-y2),然后移動(dòng)標(biāo)識(shí)矩形到要到達(dá)的地方,確定。這樣標(biāo)識(shí)矩形的終止位置與初始位置存在一個(gè)偏差,水平與垂直偏差分別為dl-x,dl-y。
      接下來搜索內(nèi)存圖素鏈表,確定每個(gè)圖素的外接矩形,判斷外接矩形是否在初始標(biāo)識(shí)矩形內(nèi),若在,則將該圖素的坐標(biāo)屬性值改變dl-x,dl-y。清除圖形區(qū),根據(jù)新的圖素鏈表作圖。
      圖形的刪除功能類似,只需將符合條件的圖素從鏈表中清除,再修改Elementcount值即可。
      拷貝圖形則只需將符合條件的圖素備份一個(gè)結(jié)點(diǎn),修改結(jié)點(diǎn)的坐標(biāo)屬性值,再將該結(jié)點(diǎn)加入鏈表,相應(yīng)增加Elementcount的值。
      以下為移動(dòng)圖形的代碼。
      fnMove ()
      {
      Rect rect; /* 定義的矩形 */
      int i;
      selectblock (); /* 選擇要移動(dòng)的塊 */
      moveblock (); /* 移動(dòng)塊 */
      List-temp=List-head;
      for (i=0;i<Elementcount; i++)
      {
      getrect (&rect, List-temp); /* 計(jì)算List-temp所指圖素的外接矩形 */
      if (inblock(rect.x1,rect.x2,rect.y1.rect.y2))
      /* 判斷外接矩形是否在所選塊內(nèi) */
      change (List-temp, dl-x,dl-y);
      /* 改變圖素的坐標(biāo)屬性 */
      List-temp=List-temp->next;
      }
      clearscreeen (); /* 清除作圖區(qū) */
      drawlink (); /* 依據(jù)圖素鏈表畫圖 */
      }
      其中,change ( )可以實(shí)現(xiàn)如下。
      change(ElementList *Ctemp, int dl-x,int dl-y)
      {
      switch (Ctemp->ElementType)
      {
      case 'c': Ctemp->Element.circle.x+=dl-x;
      Ctemp->Element.circle.y+=dl-y;
      break;
      case 'b': Ctemp->Element.box.x1+=dl-x;
      Ctemp->Element.box.x2+=dl-x;
      Ctemp->Element.box.y1+=dl-y;
      Ctemp->Element.box.y2+=dl-y;
      break;
      case 'l': Ctemp->Element.line.x1+=dl-x;
      Ctemp->Element.line.y1+=dl-y;
      Ctemp->Element.line.x2+=dl-x;
      Ctemp->Element.line.y2+=dl-y;
      break;
      case 's': Ctemp->Element.string.x+=dl-x;
      Ctemp->Element.string.y+=dl-y;
      break;
      .
      .
      .
      }
      }
      三、文件功能的實(shí)現(xiàn)
      存盤時(shí),打開文件,寫入圖形的背景顏色,寫入圖素個(gè)數(shù)Elementcount,再將內(nèi)存鏈表中各圖素的屬性值依次寫入文件即可。
      讀盤時(shí),在內(nèi)存中動(dòng)態(tài)建立圖素鏈表,將文件中的圖素屬性值依次放入鏈表中,再根據(jù)背景顏色、圖素屬性值在屏幕上顯示圖形。
      存盤過程實(shí)現(xiàn)如下。
      savefile(char * filename)
      {
      FILE *fp;
      int i;
      List-temp=List-head;
      Eid=0;
      if((fp=fopen(filename,"w+b"))==NULL)
      {
      printf ("%s", "Cant't open the file ");
      exit(1);
      }
      fwrite(&back-color, sizeof(char),1,fp);
      fwrite(&Elementcount,sizeof(int),1,fp);
      for(i=0;i<Elementcount;i++)
      { List-temp->ElementID=Eid;
      fwrite(List-temp,sizeof(ElementList),1,fp);
      List-temp=List-temp->next;
      Eid++;
      }
      fclose(fp);
      }
      四、應(yīng)用程序編程接口
      應(yīng)用程序編程接口主要功能是讀圖形文件并顯示,對(duì)畫面圖素進(jìn)行動(dòng)態(tài)刷新。這些接口均以函數(shù)形式出現(xiàn),供控制應(yīng)用程序調(diào)用。
      1.draw-chart (char * filename)功能:讀圖形文件,在內(nèi)存中建立圖素鏈表,顯示圖形。
      2.change-chart(int Element-ID, int how)功能:改變圖素Element-ID的特性,怎樣改變由how決定。該接口能方便地實(shí)現(xiàn)圖形的動(dòng)態(tài)刷新。
      3.clear-chart( )功能:釋放圖素鏈表占用的內(nèi)存。
      4.draw ( char * filename)功能:不建立鏈表,邊讀圖形文件,邊顯示。該函數(shù)不占用內(nèi)存,適用于圖素多、數(shù)據(jù)文件較大,而又不需動(dòng)態(tài)刷新的圖形畫面顯示。  

      作者:汪建平 陸志才 

      【DOS界面下通用圖形編輯軟件的設(shè)計(jì)】相關(guān)文章:

      DOS用戶界面的設(shè)計(jì)03-20

      Linux下的GTK圖形界面編程12-04

      淺論軟件界面設(shè)計(jì)中的色彩運(yùn)用03-05

      DOS下DSP播音的編程03-03

      在 DOS 下使用Windows *.WAV 文件03-03

      淺談圖形用戶界面的文化傳播影響03-01

      基于Perl的DoS工具設(shè)計(jì)與實(shí)現(xiàn)03-10

      設(shè)計(jì)界面說-探討設(shè)計(jì)藝術(shù)03-20

      設(shè)計(jì)工作的界面管理03-19

      主站蜘蛛池模板: 久久精品亚洲精品不卡顿| 榆中县| 亚洲国产一区二区三区视频在线| 金昌市| 91久久国产综合精品| 湘潭市| 精品国产高清a毛片| 亚洲五月七月丁香缴情| 孙吴县| 南澳县| 亚洲午夜无码久久久久软件| 日本熟妇中文字幕三级| 日本高清不在线一区二区色| 亚洲图片第二页| 免费在线观看国产v片| 日本一区二区三区视频一| 最新亚洲av日韩av二区一区| 色yeye在线观看| 久久夜色精品国产亚洲噜噜| 亚洲男人天堂av一区| 亚洲精品永久一区二区三区 | 国产真实伦视频在线视频| 黄和色美女啪啪啪亚洲| 国产精品久久久一本精品| 亚洲午夜激情久久加勒比| 国产精品白浆视频免费观看| 国产一区二区三区视频免费在线| 全南县| 亚洲人成无码网站十八禁| 91久久国产福利自产拍| 无码av永久免费大全| 风韵丰满妇啪啪区老老熟女杏吧| 日韩久久免费精品视频| 强d漂亮少妇高潮在线观看| 波多野无码AV中文专区| 97久久综合区小说区图片专区| 日韩久久免费精品视频| 超高清丝袜美腿视频在线| 亚洲AV乱码毛片在线播放| 国产精品自拍一区视频在线观看| 国产精品高潮av有码久久|