矢量图形技术

一、自动生成程序框架
 1.  新建工作区    打开VC++6.0->菜单“文件”->“新建”:
  
2.  选择位置(目录)E:/vc_test,输入工程名称Mdocs,选择类型:MFC AppWizard(exe)
 3.  按“确定”后进入下一步,选择文档类型:多文档,语言:中文
4.  设定数据库,数据库类型,文件
5.  设定服务器,Automation, ActiveX 
6.  设定界面参数 
7.  按“完成”后,系统会为你创建所有的应用程序框架
8.  注:不同的系统所生成的程序框架的详细程度不同
  
二、  正文文字输入
 
1.  添加键盘输入成员函数
2.  添加字符数组变量 
3.  将字符加入到数组中
4.  窗口中显示文本
1-2-3-4实例:
//以下函数输入文本:
void CMDocsView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
       // TODO: Add your message handler code here and/or call default
         CRect rect;           //求出窗口矩形大小
        GetClientRect(&rect);
        int x = (rect.Width() -  0) / 1;
        int y = (rect.Height() -  0) / 1;
 
        double charwidth=9;  //设定字符宽度(假设)
        static int i=0,j=0;  //设定静态变量为数组的下标,每次调用后仍保持其值
        if ((nChar==13) || j>x/charwidth-1)  //输入回车,或者,到达右边缘
        {
              m_inputstring[i][j]=nChar; //字符到数组
              i++;    //到下一行
              j=0;    //新行从第一个字符位置开始
              return; //结束
 
        }
        m_inputstring[i][j]=nChar;  //正常位置记录输入
        CClientDC  dc(this);        //窗口指针
        //for (k=0;k<=i;k++)
 
        dc.TextOut( 0,i*16,&m_inputstring[i][0],j+1);  //输出
    j++;       //下一个字符位置
 
        CView::OnChar(nCharnRepCntnFlags);
}
 
5.  刷新时重写所有文本
 
/////////////////////////////////////////////////////////////////////////////
// CMDocsView drawing   图形刷新:
 
void CMDocsView::OnDraw(CDC* pDC)
{
CMDocsDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
 
//以下输出数组中的文本:
int i=0,j=0,n=0;      //循环变量
CClientDC dc(this);   //输出窗口,this当前活动窗口
for (i=0;i<=1024;i++) //循环
{
        if (m_inputstring[i][0]<13)   //每行的第一个字符=13回车符
          {return;}                                  //返回
         for (n=0;n<1024;n++)
               if (m_inputstring[i][n]<=13)   //循环求出回车符前的字符长度
               {j=n;n=1024;}
         dc.TextOut( 0,i*16,&m_inputstring[i][0],j);  //输出字符串
         //dc.TextOut (int x,int y,CString &str,Length)
}
//文本输出结束
 
}
 
 
 
 
三、              绘制图形
 
1.        MainFrame类中增加绘图菜单
(1)   ResourceView->Menu->IDR_MDOCSTYPE ->菜单虚线框按右键->属性:
 
 
(2)    建立主菜单条和子菜单条
 
(3)    注释:
A)           标题为菜单名称,&L为热键定义Alt+L
B) ID:为该菜单指定一个名称,对应于一个整型值,唯一性,程序自动指定
C)           提示栏输入菜单的功能简要说明
 
2.       给菜单添加函数
 
(1)   菜单“查看”->“建立类向导”->
(2)    
(3)   选择该菜单项的类Class NameCMainFrame
(4)   选择对象识别号Object IDsAFX_ID_DRAW_LINE,先前在菜单项中所定义的
(5)   在消息栏中选择消息传递函数Messages:COMMAND
(6)   点击右上角的“Add Function”按钮,便完成了函数添加工作
(7)   点击右上角的“Edit Code”按钮,在函数中添加内容:只能自己动手。例:
添加下列代码可绘出一条直线:
void CMDocsView::OnIdDrawLine()
{
// TODO: Add your command handler code here
         CClientDC dc(this);
         POINT Point;
         Point.x=100;
         Point.y=200;
         dc.LineTo(Point);
}
注意:C的大小写是敏感的,别忘了分号结束每一条语句,括号、引号等要成对的打入,
 
3.       添加成员变量,标示那个菜单项被点
 
 
(1)   ClassView中选择菜单所在的类CMainFrame,右键,Add Member Variable
(2) 添加控制变量的类性和名称,作用域即可
 
 
(3)   在窗口的创建中初始化变量
C语言中申请变量后不加初始化,则其值是不确定的!其他语言?请举例
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
……
draw_menu_control=0;  //添加该语句
return 0;
}
 
(4)   自己定义该变量对应于菜单项的规则
draw_menu_control=0;  //没有选择
draw_menu_control=1;  //绘制直线
draw_menu_control=2;  //绘制圆
draw_menu_control=3;  //绘制圆弧
draw_menu_control=4;  //绘制长方形
draw_menu_control=5;  //绘制多边形
     。。。。。。
 
(5)   在菜单函数中加入上述定义:
void CMDocsView::OnIdDrawLine()
{
       // TODO: Add your command handler code here
       draw_menu_control=1;   //绘制直线
       mouse12=0;                  //鼠标器按键次数初始化
}    
 
4.       View类中添加成员函数OnLButtonUp(UINT nFlagsCPoint point)
 
参看上面的“2. 给菜单添加函数”
 
5.       记录图形的起始点和终止点
 
(1)   添加成员变量,记录点坐标,参看前面的说明,可以在File View项中的??View.h中找到其定义:
// Implementation
public:
int y0;
int x0;
int x1,y1;
 
(2)   添加成员变量,标记鼠标左键是第一次还是第二次按下
??View.h
// Implementation
public:
int mouse12;  //=1第一次,=2第二次,=3第三次,。。。。。。
 
(3)   在函数OnLButtonUp(UINT nFlagsCPoint point)中添加绘图代码:
第一次按键:记录坐标值:
第二次按键:绘图:
void CMDocsView::OnLButtonUp(UINT nFlagsCPoint point)
{
       if (mouse12= = 0)
              mouse12=1;
              if (draw_menu_control = = 1 || draw_menu_control = = 2 || draw_menu_control = = 3)  //绘制直线或圆
                {  
           if (draw_menu_control==1 &&  mouse12==1)   //第一次
           { x0=point.x;
             y0=point.y;
             mouse12=2;
             mouse_move_count=0;   //鼠标器移动次数初始化
           }
           else             //第二次
           {
 
                   if (draw_menu_control==1 &&  mouse12==2) //选择了绘制直线菜单
                   {
                         dc.MoveTo (x0,y0);   //移到第一点
                         dc.LineTo (point);   //画到第二点
                         mouse12=0;           //鼠标器第一次按键
                         draw_menu_control=0;  //菜单选择复位
                   }
           }
                              }
              else
                {}
}
 
 
6.       画笔
 
     CClientDC dc(this);
 
    CPen penBlue;  // Construct it, then initialize
if( penBlue.CreatePen( PS_DOT, 1, RGB(0,0,255) ) )   //如果画笔创建成功
// CreatePen(线型、线宽、颜色RGB(RED,GREEN,BLUE))
    {
        // Select it into the device context
        // Save the old pen at the same time
        CPenpOldPen = dc.SelectObject( &penBlue );    //选择新的画笔,返回老的画笔
 
        // Draw with the pen
                      dc.MoveTo (x0,y0);
                      dc.LineTo (p);
 
        // Restore the old pen to the device context    
                dc.SelectObjectpOldPen );                        //恢复老的画笔
    }
    else
    {
        // Alert the user that resources are low                          //出错处理
}
 
//其中线型为
//PS_SOLID   Creates a solid pen.
//PS_DASH   Creates a dashed pen. Valid only when the pen width is 1 or less, in device units. //
//PS_DOT   Creates a dotted pen. Valid only when the pen width is 1 or less, in device units.
//PS_DASHDOT   Creates a pen with alternating dashes and dots.
//PS_DASHDOTDOT   Creates a pen with alternating dashes and double dots.
//。。。。。。
 
7.       实现橡皮筋技术
 
(1)   View类中添加成员函数OnMouseMove(UINT nFlagsCPoint point)
(2)   绘制一个新的图形
(3)   反色绘制上一个图形
(4)   不能删掉其它的已经存在的图形
实例:
 
// 随着鼠标器的移动,函数会返回一系列的坐标点point
 
//1)在View类中添加成员函数OnMouseMove(UINT nFlagsCPoint point)
void CMDocsView::OnMouseMove(UINT nFlagsCPoint point)
{
     // TODO: Add your message handler code here and/or call default
 
       CClientDC dc(this);
 
    CPen penBlue;  // Construct it, then initialize
    if( penBlue.CreatePen( PS_DOT, 1, RGB(0,0,255) ) )   //蓝色画笔,用于画橡皮筋线
    {
        // Select it into the device context
        // Save the old pen at the same time
        CPenpOldPen = dc.SelectObject( &penBlue );
 
        // Draw with the pen
           if (draw_menu_control= =1 && mouse12= =2)   //如果绘制直线,,有了第一次按键:
           {
                         //3)反色绘制上一个图形:
                         //设定反色画笔共4句:P1-P4:
 
                         CPen penGND;   //P1
                         if (penGND.CreatePen( PS_SOLID, 3, RGB(255,255,255) ))  //背景色 P2
//白色画笔,与底色相同,用于删除上一根橡皮筋线
                         CPen* pOldPen1 = dc.SelectObject( &penGND );         //选择画笔P3
 
                         //设定反色画笔的4P1-P4, 可以用下列绘图方式设定来代替:
                         //dc.SetROP2(R2_NOT);    //设定画笔与屏幕的Pixelinverse运算
                         POINT p;
                         if (mouse_move_count= =0)
                         {     x1=x0;
                                y1=y0;
                         }
                         p.x=x1;p.y=y1;
                         dc.MoveTo (x0,y0);
                         dc.LineTo (p);                  //删除上次的直线
                         dc.SelectObject( pOldPen1 );      //恢复画笔P4
                         }
            dc.MoveTo (x0,y0);
            dc.LineTo (point);
            x1=point.x;
            y1=point.y;    //记录当前点的坐标,为下次删除准备
           }
           mouse_move_count=mouse_move_count+1;   //鼠标器移动次数增加
 
        // Restore the old pen to the device context
                dc.SelectObject( pOldPen );
    }
    else
    {
        // Alert the user that resources are low
    }
 
 
     CView::OnMouseMove(nFlags, point);
}
 
8.       避免新绘制的实体覆盖老的实体
 
void CMDocsView::OnLButtonUp(UINT nFlagsCPoint point)
{
       CClientDC dc(this);
       dc.SetROP2(R2_XOR);   //画笔PEN与屏幕SCREENPIXEL取或运算
}
 
9.       在图形绘制过程中避免鼠标器干别的事情
//在安下第一次鼠标按键进入绘图时,调用鼠标器捕捉:
SetCapture();
//再完成绘制后释放鼠标:
ReleaseCapture();
 
10.   记录实体参数
 
(1)   申请坐标数组
CMDcosView.h:
     typedef struct
     {
            int x;
            int y;
     } PlineVertexStruct;
 
     PlineVertexStruct  PlineVertex[500][50];   //实体数:500;顶点数:50
 
(2)   实体属性参数
CMDcosView.h:
 
  int ObjectLineWidth[500];   //实体线宽
  int ObjectLineType[500];       //实体线型
  int ObjectColor[500];            //实体颜色
  int ObjectType[500];             //实体类型
  int ObjectCount;          //实体数量
 
(3)   变量的初始化
 
 
BOOL CMDocsView::PreCreateWindow(CREATESTRUCT& cs)
{
       // TODO: Modify the Window class or styles here by modifying
       //  the CREATESTRUCT cs
 
       //以下初始化用户变量:
              LineColor=RGB(0,255,0);     //初始化颜色
              LineType=PS_SOLID;                 //初始化线型
              LineWidth=1;                    //初始化线宽
              ObjectCount=-1;                         //初始化实体数量
 
              for (int i=0;i<500;i++)       //初始化实体坐标点
                     for (int j=0;j<50;j++)
                     {
                            PlineVertex[i][j].x=0;
                            PlineVertex[i][j].y=0;
                     }
 
       return CView::PreCreateWindow(cs);
}
 
 
 
(4)   在记录所绘图形的坐标和实体属性
 
//鼠标器左键抬起
 
void CMDocsView::OnLButtonUp(UINT nFlagsCPoint point)
{
              if (mouse12==1)   //第一次
              {if (draw_menu_control==1 ||draw_menu_control==2 ||draw_menu_control==3)
                     { x0=point.x;
                       y0=point.y;
                       ObjectCount++;                                            //增加实体数量
                       ObjectColor[ObjectCount]=LineColor;             //记录该实体的颜色
                       ObjectLineWidth[ObjectCount]=LineWidth;      //记录该实体的线宽
                       ObjectLineType[ObjectCount]=LineType;        //记录该实体的线型
                       ObjectType[ObjectCount]=draw_menu_control;             //记录该实体的线型
 
                       PlineVertex[ObjectCount][0].x=point.x ;   //记录该实体的顶点坐标
                       PlineVertex[ObjectCount][0].y=point.y ;
                       mouse12=2;//记录该实体的颜色
                       mouse_move_count=0;   //鼠标器移动次数初始化
                       SetCapture();         //捕捉鼠标
                     }
              }
              else             //第二次
              {
                     //绘制直线:
                     if (draw_menu_control==1  ||draw_menu_control==2 &&  mouse12>=2) //选择了绘制直线菜单
                     {
                            dc.MoveTo (x0,y0);   //移到第一点
                            dc.LineTo (point);   //画到第二点
                            x0=point.x;            //如果绘制PLINE,该终点作为下一段线的起点
                            y0=point.y;
 
                       PlineVertex[ObjectCount][mouse12-1].x=point.x ;
                         PlineVertex[ObjectCount][mouse12-1].y=point.y ;
                           
                            mouse12++;           //鼠标器第i次按键
 
                            if (draw_menu_control==1) draw_menu_control=0; //菜单选择复位
                     }
 
                     if (draw_menu_control==3 &&  mouse12==2) //选择了绘制圆菜单
                     {
                            dc.MoveTo (x0,y0);   //移到第一点
                            dc.Ellipse(x0-CircleR,y0-CircleR,x0+CircleR,y0+CircleR);   //画到第二点
                       PlineVertex[ObjectCount][mouse12-1].x=CircleR ;
                            mouse12=0;           //鼠标器第一次按键
                            draw_menu_control=0; //菜单选择复位
                     }
 
                     ReleaseCapture(); //释放鼠标
              } //else end of 第二次按键
                     }
 
 
11. View类中的OnDraw(CDC* pDC)实现重画
 
/////////////////////////////////////////////////////////////////////////////
// CMDocsView drawing   图形刷新:
 
void CMDocsView::OnDraw(CDC* pDC)
{
 
//为了使用CMDocsDoc中申请的变量 :step1/3: MdocsView.cpp中: #include "MDocsDoc.h"
CMDocsDocpDoc = GetDocument();    //step 2/3定义文档类的指针,然后初始化该指针
ASSERT_VALID(pDoc);                         //此两个语句APPWizard已经帮你创建好了。
// TODO: add draw code for native data here
 
//CMDocsDoc* doc;    //为了使用CMDocsDoc中申请的变量
//doc=GetDocument();  //也可以分开来写
 
//以下输出数组中的文本:
int i=0,j=0,n=0;      //循环变量
CClientDC dc(this);   //输出窗口,this当前活动窗口
dc.SetROP2(R2_MASKPEN);    //设定画笔与屏幕的Pixel的或运算
 
for (i=0;i<256;i++) //循环
{  
       for (n=0;n<256;n++)
              if (pDoc->m_inputstring[i][n]<=13)   //循环求出回车符前的字符长度      // step 3/3: 红色部分:使用MDocsDoc.h中定义的变量时,变量前加类指针->
              {j=n;n=256;}
       dc.TextOut(   0,i*16,&pDoc->m_inputstring[i][0],j);  //输出字符串
       //dc.TextOut (int x,int y,CString &str,Length)
 
       if (pDoc->m_inputstring[i+1][0]<13)   //每行的第一个字符=13回车符
       {i=256;}                                    //返回
 
}
//文本输出结束
 
 
//实体绘制:
for (i=0;i<=pDoc->ObjectMaxQt;i++)
{
 
        //Draw with the pen
       CPen penRED;  // Construct it, then initialize
       if( penRED.CreatePenpDoc->ObjectLineType[i], pDoc->ObjectLineWidth[i], pDoc->ObjectColor[i] ) )   //使用当前色LineColor
       {
              // Select it into the device context
              // Save the old pen at the same time
              CPenpOldPen = dc.SelectObject( &penRED );
 
              dc.MoveTo (pDoc->PlineVertex[i][0].x,pDoc->PlineVertex[i][0].y);
 
              if (pDoc->ObjectType[i]==1 || pDoc->ObjectType[i]==2)   //直线类
                     for (j=0;j<=pDoc->ObjectVertexQt[i];j++)
                     {
                            dc.LineTo (pDoc->PlineVertex[i][j].x,pDoc->PlineVertex[i][j].y);
                            if (pDoc->PlineVertex[i][j+1].x==0 && pDoc->PlineVertex[i][j+1].y==0 && pDoc->PlineVertex[i][j+2].x==0 && pDoc->PlineVertex[i][j+2].x==0)
                                   j=50;
 
                     }  //end of for (j=
 
              if (pDoc->ObjectType[i]==3)   //
              {  
                     dc.Ellipse (pDoc->PlineVertex[i][0].x-pDoc->PlineVertex[i][1].x,pDoc->PlineVertex[i][0].y-pDoc->PlineVertex[i][1].x,pDoc->PlineVertex[i][0].x+pDoc->PlineVertex[i][1].x,pDoc->PlineVertex[i][0].y+pDoc->PlineVertex[i][1].x);
              }
 
       if (pDoc->PlineVertex[i+1][0].x==0 && pDoc->PlineVertex[i+1][0].y==0 && pDoc->PlineVertex[i+1][1].x==0 && pDoc->PlineVertex[i+1][1].x==0)
              i=500;
        dc.SelectObject( pOldPen );
       }  //end of if CreatePen()
 
}  //end of for i
//实体绘制结束
 
}    
 
12.   图形存盘、打开图形文件,图形读出
 
 
//CMDocsDoc类中使用void CMDocsDoc::Serialize(CArchivear)进行输入输出,参数(CArchivear)指向外存文件,
//可以使用ar.write等进行输入输出,
 
/////////////////////////////////////////////////////////////////////////////
// CMDocsDoc serialization
 
void CMDocsDoc::Serialize(CArchivear)
{
 
 
       if (ar.IsStoring())   //写文件开始
       {
              // TODO: add storing code here
              char ItoS[256];
 
 
                     //以下输出数组中的文本:
                     int i,j,n;      //循环变量
 
 
                     if (m_inputstring[0][0]>13)  //无文本时不输出:ASCII13是回车符。
                     {
                           
                             for ( i=0;i<256;i++)
                            { 
                                   ar.WriteString("T,");                     //流输出:行头:T-文本,L-直线,C-
                                   for (n=0;n<256;n++)
                                   {
                                          if (m_inputstring[i][n+1]<=13)   //循环求出回车符前的字符长度
                                          {
                                                 j=n;
                                                 n=256;
                                          }
                                   }
                                  
                                   m_inputstring[i][j+1]=0;
                                   ar.WriteString(m_inputstring[i]) ; //输出字符串
                                  
                                   if (m_inputstring[i+1][0]<=13)   //每行的第一个字符=13回车符
                                   {i=256;}                        //返回
                                   ar.WriteString("/n");
 
                            }
                     }
                     //文本输出结束
 
 
                     //实体绘制:
                                  
                     for (i=0;i<=ObjectMaxQt;i++)
                     {
 
                                   if (ObjectType[i]==1 || ObjectType[i]==2)   //直线类:L,线型,线宽,颜色,起始点,顶点,。。。
                                   {
                                                       
                                         if (ObjectType[i]==1)
                                                 ar.WriteString("L,");
                                          else
                                                 ar.WriteString("P,");
 
                                          itoa(ObjectLineType[i],ItoS,10);
                                          ar.WriteString(ItoS);
                                          ar.WriteString(",");
 
                                          itoa(ObjectLineWidth[i],ItoS,10);
                                          ar.WriteString(ItoS);
                                          ar.WriteString(",");
 
                                          itoa(ObjectColor[i],ItoS,10);
                                          ar.WriteString(ItoS);
 
                                          for (j=0;j<=ObjectVertexQt[i];j++)
                                          {
                                                 ar.WriteString(",");
 
                                                 itoa(PlineVertex[i][j].x,ItoS,10);
                                                 ar.WriteString(ItoS);
                                                 ar.WriteString(",");
 
                                                 itoa(PlineVertex[i][j].y,ItoS,10);
                                                 ar.WriteString(ItoS);
 
                                                 if (PlineVertex[i][j+1].x==0 && PlineVertex[i][j+1].y==0 && PlineVertex[i][j+2].x==0 && PlineVertex[i][j+2].x==0)
                                                        j=50;
 
                                          }  //end of for (j=
                                                
                                          ar.WriteString("/0");
                                          ar.WriteString ("/n");
                                   }
                                   if (ObjectType[i]==3)   //:C,线型,线宽,颜色,中心点,半径
                                   {  
                                          ar.WriteString("C,");
 
                                          itoa(ObjectLineType[i],ItoS,10);
                                          ar.WriteString(ItoS);
                                          ar.WriteString(",");
 
                                          itoa(ObjectLineWidth[i],ItoS,10);
                                          ar.WriteString(ItoS);
                                          ar.WriteString(",");
 
                                          itoa(ObjectColor[i],ItoS,10);
                                          ar.WriteString(ItoS);
                                          ar.WriteString(",");
 
                                          itoa(PlineVertex[i][0].x,ItoS,10);
                                          ar.WriteString(ItoS);
                                          ar.WriteString(",");
 
                                          itoa(PlineVertex[i][0].y,ItoS,10);
                                          ar.WriteString(ItoS);
                                          ar.WriteString(",");
 
                                          itoa(PlineVertex[i][1].x,ItoS,10);
                                          ar.WriteString(ItoS);
                                          ar.WriteString("/0");   ///0字符串结束,                                      
                                          ar.WriteString("/n");   ///0字符串结束,
                                   }
 
                            if (PlineVertex[i+1][0].x==0 && PlineVertex[i+1][0].y==0 && PlineVertex[i+1][1].x==0 && PlineVertex[i+1][1].x==0)
                                   i=500;
                     }  //end of for i
                     //实体绘制结束
 
 
       }     //写文件结束
       else  //读文件开始
       {
              // TODO: add loading code here
              CString readCString;
              int i=0,j=0,k=0;
              static int m=0;
 
              int pos,pos1;
              bool goon=true;
              char * strtemp=",";
              fstream ff;
              ff.open ("ppp.txt",ios::out);
 
              while (true)
              {
                     if (ar.ReadString(readCString))  //ar.ReadString()返回true,如果成功
                     {
                            if (readCString[0]=='T')  //文字处理
                            {
                                   readCString=readCString.Right (readCString.GetLength()-2);
                                   _tcscpy(m_inputstring[i],readCString);
                                   i++;
                                   //_tcscpy(char*,CString)CString转换成char*,反向运算CString=_T(char*)
                            }
 
                            if (readCString[0]=='L' || readCString[0]=='P')  //直线处理
                            {
                                   if (readCString[0]=='L')
                                          ObjectType[j]=1;
                                   else
                                          ObjectType[j]=2;
 
                                   readCString=readCString.Right (readCString.GetLength()-2);
                                   ff<<readCString.GetLength()<<"//";
                                   while (goon)
                                   {
                                          pos=strcspn(readCString,strtemp);  //strcspn("fsabcd","bc"),返回3
                                          ff<<"pos="<<pos<<"  k="<<k<<"    j="<<j;
                                          if (pos <readCString.GetLength()) //如果有","
                                                
                                          {
                                                
                                                 if (k>=3)  //坐标点部分
                                                 {  
                                                        if (k==3) m=0;
                                                        PlineVertex[j][m].x=atoi(readCString.Left (pos));
                                                        readCString=readCString.Right (readCString.GetLength()-pos-1);
                                                        pos1=strcspn(readCString,strtemp);
 
                                                        if (pos1<readCString.GetLength()) //后面还有点坐标
                                                        {
                                                               PlineVertex[j][m].y=atoi(readCString.Left (pos1));
                                                               readCString=readCString.Right (readCString.GetLength()-pos1-1);
                                                        }
                                                        else
                                                        {
                                                               PlineVertex[j][m].y=atoi(readCString);
                                                               goon=false;
                                                        }
                                                        ObjectVertexQt[j]=m;
                                                        m++;
                                                 } //end of if (k>=3)
                                                 else  //if k<=2
                                                 {
                                                        if (k==0) ObjectLineType[j]=atoi(readCString.Left (pos));
                                                        if (k==1) ObjectLineWidth[j]=atoi(readCString.Left (pos));
                                                        if (k==2) ObjectColor[j]=atoi(readCString.Left (pos));
                                                        readCString=readCString.Right (readCString.GetLength()-pos-1);
                                                 }   //end if k>=3
                                          k++;  //每根线中第几个值,用“,”分割
                                          }   //end of if (int pos=strcspn(readCString,strtemp)<readCString.GetLength())
                                          else
                                          {goon=false;
                                          }
                                   //_tcscpy(char*,CString)CString转换成char*,反向运算CString=_T(char*)
                                   } //end of while (goon)
                                   ObjectMaxQt=j;ff<<"j="<<j<<"   m="<<ObjectVertexQt[j];
                                   j++; //第几根线
                            } //end of if 直线
 
                     }
                     else    //如果读不成功,结束serialization函数,也可以添加告警代码
                            return;
              }  //end of while(true)读循环
 
       }     //读文件结束
//end of void CMDocsDoc::Serialize(CArchivear)
 
 
 
 
 
四、              图形的画面操作
 
1.图形画面的平移
(1)       在函数void CMDocsView::OnLButtonDown(UINT nFlagsCPoint point)中记录起始点坐标point0
(2)       在函数void CMDocsView::OnLButtonUp(UINT nFlagsCPoint point)中:
Ø         记录终止点坐标point1
Ø         将所有的坐标点平移point1-point0
Ø         发出重画消息,调用重画函数ON_Draw()
 
2.  图形画面窗口放大
(1)      在函数void CMDocsView::OnLButtonDown(UINT nFlagsCPoint point)中记录选择窗口起始点坐标point0
(2)     在函数void CMDocsView::OnLButtonUp(UINT nFlagsCPoint point)中:
Ø         记录选择窗口终止点坐标point1
Ø         计算选择窗口与视图窗口的平移量和比例
Ø         将所有的坐标点平移,并放大比例;
Ø         发出重画消息,调用重画函数ON_Draw()
 
3.  显示全图
Ø         计算出所有图形实体的矩形区域
Ø         计算该矩形区域与视图窗口的平移量和比例
Ø         将所有的坐标点平移,并放大比例;
Ø         发出重画消息,调用重画函数ON_Draw()
 
4.  返回上一级画面
设定一个数组,记录图形画面操作的每一步参数
 
五、              编辑图形
 
1.编辑菜单
2.鼠标器的位置是否落在图形实体上
3.编辑对话框
4.实体改变的程序体
 
六、              管理图形
 
1.  图形实体的层
2.  图形实体的颜色
3.  图形实体的线型
4.  图形实体的附加信息
5.  图形实体外部信息库链接
 
七、              格式转换
 
1.  图形交换格式DXF
2.  其它图形数据格式
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值