国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

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

2019-11-17 05:40:57
字體:
供稿:網(wǎng)友
摘  要  該文介紹了一種建立在DOS界面下生成圖素文件的通用圖形編輯程序的設(shè)計(jì)方法。
    要害詞  圖形編輯  數(shù)據(jù)結(jié)構(gòu)  圖素
    目前用作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(WH99vE);
    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))
    &nb


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 塔城市| 攀枝花市| 翼城县| 龙胜| 读书| 公主岭市| 子长县| 辛集市| 中牟县| 长丰县| 柏乡县| 噶尔县| 泰和县| 东平县| 旅游| 万盛区| 鹤庆县| 丹阳市| 揭西县| 西安市| 桃园县| 南和县| 黔西县| 子洲县| 特克斯县| 宽甸| 衡水市| 增城市| 大丰市| 阿图什市| 海淀区| 昭平县| 晋州市| 乌兰察布市| 和龙市| 闸北区| 沁阳市| 德化县| 友谊县| 大悟县| 华池县|