av日韩亚洲,一本一本a久久,亚洲一区二区三区,亚洲一区二区三区免费视频

DOS界面通用圖形編輯軟件設(shè)計技巧

來源:期刊VIP網(wǎng)所屬分類:光電技術(shù)時間:瀏覽:

  摘 要:應(yīng)用程序編程接口主要功能是讀圖形文件并顯示,對畫面圖素進行動態(tài)刷新。這些接口均以函數(shù)形式出現(xiàn),供控制應(yīng)用程序調(diào)用。

  目前用作DDC的PC總線工控機(IPC)大部分工作在DOS界面上,而DOS不具有像Windows那樣美觀方便的圖形用戶接口(GUI)。生成工藝流程圖等復(fù)雜圖形若用程序設(shè)計語言直接編程需花費大量精力和代碼,且不易修改。設(shè)計出數(shù)據(jù)文件小,占用內(nèi)存少的圖形編輯軟件是控制界的一個研究課題。這里介紹一種生成圖素數(shù)據(jù)文件的通用圖形編輯軟件的設(shè)計方法。

  一、數(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; /* 線顏色,模式,粗細 */

  };

  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)識元素類別 */

  int ElementID; /* 元素標(biāo)識符,在接口中用來控制其屬性 */

  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)存中形成一個圖素鏈表,所有操作都可以此鏈表為基礎(chǔ)。

  3.定義幾個指針,以備各種操作

  ElementList *List-head. *List-end,*List-temp, *List-here;

  4.定義一個全局變量,記錄圖素個數(shù)

  static int Elementcount=0;

  圖形文件格式為:第一字節(jié)(char),表示整個圖形的背景顏色;接下來一個字(word),對應(yīng)于Elementcount,表示圖素個數(shù);后面是內(nèi)存鏈表中每個圖素的屬性值。

  二、圖形編輯功能的實現(xiàn)

  本軟件包含的圖形編輯功能主要有:作圖、修改、移動、刪除、復(fù)制,下面僅舉幾例說明實現(xiàn)的方法。

  1.作圖

  以圓為例,其它圖形類似。

  drawcircle()

  {

  int i;

  char s[20],c;

  int cx,cy,cr;

  int cls,clc,cfc,cfs;

  movecursor(); /* 移動光標(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 ()可以如下實現(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.圖形的移動、刪除、復(fù)制功能

  以移動為例,首先用箭頭鍵或鼠標(biāo)框取要移動的區(qū)域,區(qū)域矩形的左上,右下坐標(biāo)分別為(block-x1,block-y1),(block-x2,block-y2),然后移動標(biāo)識矩形到要到達的地方,確定。這樣標(biāo)識矩形的終止位置與初始位置存在一個偏差,水平與垂直偏差分別為dl-x,dl-y。

  接下來搜索內(nèi)存圖素鏈表,確定每個圖素的外接矩形,判斷外接矩形是否在初始標(biāo)識矩形內(nèi),若在,則將該圖素的坐標(biāo)屬性值改變dl-x,dl-y。清除圖形區(qū),根據(jù)新的圖素鏈表作圖。

  圖形的刪除功能類似,只需將符合條件的圖素從鏈表中清除,再修改Elementcount值即可。

  拷貝圖形則只需將符合條件的圖素備份一個結(jié)點,修改結(jié)點的坐標(biāo)屬性值,再將該結(jié)點加入鏈表,相應(yīng)增加Elementcount的值。

  以下為移動圖形的代碼。

  fnMove ()

  {

  Rect rect; /* 定義的矩形 */

  int i;

  selectblock (); /* 選擇要移動的塊 */

  moveblock (); /* 移動塊 */

  List-temp=List-head;

  for (i=0;i{

  getrect (&rect, List-temp); /* 計算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 ( )可以實現(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;

  .

  .

  .

  }

  }

  三、文件功能的實現(xiàn)

  存盤時,打開文件,寫入圖形的背景顏色,寫入圖素個數(shù)Elementcount,再將內(nèi)存鏈表中各圖素的屬性值依次寫入文件即可。

主站蜘蛛池模板: 富阳市| 石狮市| 林周县| 陆川县| 乌鲁木齐县| 安溪县| 余干县| 女性| 莱芜市| 柳河县| 南昌县| 乌兰察布市| 综艺| 延安市| 东源县| 聊城市| 建平县| 阿合奇县| 普宁市| 达拉特旗| 新晃| 兖州市| 泾川县| 顺义区| 穆棱市| 分宜县| 汤阴县| 广饶县| 上虞市| 晋中市| 山阳县| 瑞安市| 兰州市| 丹阳市| 大冶市| 郓城县| 瑞金市| 合川市| 黔西县| 永仁县| 浦北县|