基于C++(MFC)图形编辑界面工具

打印 上一主题 下一主题

主题 1711|帖子 1711|积分 5133

MFC 图形编辑界面工具

一、配景

喔,五天的实训终于竣事了,学校安排的这次实训课名称叫高级程序设计实训,但在我看来,重要是学习了 Visual C++ .NET 所提供的 MFC(Microsoft Foundation Class)库所提供的类及其功能函数的使用。写这一篇博客的目标是针对实训中出现的题目做一些阐明,方便以后检察,并且对这次实训做一些总结。这一次的实训对我来说其实挺难受的,真正用来学习使用 VS 和 MFC 的时间只有三天,加上下个周是测验周,另有几门课没有复习完,这几天基本上是连轴转,中午也泡在实行室里,唉啊照旧本身太菜了。最后我们需要提交一个课程设计程序,由于时间的缘故原由,我选择了最简单的图形界面编辑工具,这个程序其着实 C++ 的课程设计上就有这个,但其时我还不会 windows 图形界面的编程,现在想想这两个课程设计其实完全可以是一份(捂脸)。
在功能上:


  • 能够在 windows 的界面下画图,能够画直线、空心矩形、、圆角矩形、空心圆形、填充矩形、填充圆形、填充圆角矩形和文字。
  • 能够改变画图是画笔用的颜色、线宽、线型和填充用的颜色、字体。
  • 能够生存、打开所做的图形文件
  • 拥有菜单、工具栏、鼠标右键等编辑界面。
二、程序阐明

1.工具栏阐明



2.画图菜单




在画图菜单下,能够选择画直线、空心矩形、空心圆形、空心圆角矩形、填充矩形、填充圆形、填充圆角矩形。
3.文本菜单




文本输入菜单下有两个选项一个是文本输入、一个是字体设置,分别对应着两个对话框。
文本输入对话框,能够根据指定的 x、y 横纵坐标来定位输入位置,打印输入的相应信息。



而字体设置,调用体系自带的对话框,完成对字体类型、字形和字体大小的设置。


4.画笔设置菜单




画笔设置菜单下有画笔颜色、画笔类型、画笔宽度三个选项。此中画笔类型又包含实线、虚线、点线、点划线、双点划线五个选项。画笔类型根据查阅课本内容和上网搜索得知,只有在宽度为 1 的时间,才能显示除实线外的其他画笔类型,当宽度大于 1 时画出来的都是实线类型的线条。
 


颜色设置,调用体系自带的对话框,完成对画笔、画刷颜色的选择。同时选用该对话框能够实现自定义颜色。
 


画笔宽度设置对话框是本身设置的对话框,输入相应的画笔宽度,实现画笔宽度的改变。
5.界面下鼠标右键





右击鼠标会有鼠标右键菜单,其功能选项与功能栏所给的功能是一样的,选择画直线、空心矩形、空心圆形、空心圆角矩形、填充矩形、填充圆形、填充圆角矩形和文本。
三、鼠标拖动绘画

该程序的基础功能就是能够拖动鼠标来绘制图形,这内里现实上用到的是橡皮筋技术。在鼠标拖动中,每当鼠标的位置发生了改变,需要清除已经绘制的线段,课本已经该出了实现该过程的代码。固然之前需要在视图 View 类中添加鼠标左键按下,鼠标移动,鼠标左键抬起的消息映射。
  1. void CShirrView::OnLButtonDown(UINT nFlags, CPoint point)
  2. {
  3.     //将鼠标左键按下位置存储到p1、p2
  4.     p1 = p2 = point;
  5.     b=true;               //设置绘图标志
  6.     pdc->SetROP2(R2_NOTXORPEN);//设置绘图模式为R2_NOTXORPEN,注意背景为白色
  7.     CView::OnLButtonDown(nFlags, point);
  8. }
  9. void CShirrView::OnMouseMove(UINT nFlags, CPoint point)
  10. {
  11.     if (!b)
  12.         return;     //如果不是绘图状态,返回
  13.     //P1为鼠标左键按下位置,P2为鼠标上次位置
  14.     //即按前次位置重绘了一次,模式是R2_NOTXORPEN
  15.     //最终效果是白色,由于底色为白,实际效果是清除了上次的线段
  16.     pdc->MoveTo(p1.x,p1.y);
  17.     pdc->LineTo(p2.x,p2.y);
  18.     p2 = point;
  19.     //p1仍为鼠标左键按下位置,P2为当前鼠标位置
  20.     pdc->MoveTo(p1.x,p1.y);
  21.     pdc->LineTo(p2.x,p2.y);    //从P1到鼠标当前位置绘制线段
  22.     CView::OnMouseMove(nFlags, point);
  23. }
  24. void CShirrView::OnLButtonDown(UINT nFlags, CPoint point)
  25. {
  26.     //将鼠标左键按下位置存储到p1、p2
  27.     p1 = p2 = point;
  28.     b=true;               //设置绘图标志
  29.     pdc->SetROP2(R2_NOTXORPEN);//设置绘图模式为R2_NOTXORPEN,注意背景为白色
  30.     CView::OnLButtonDown(nFlags, point);
  31. }
  32. void CShirrView::OnMouseMove(UINT nFlags, CPoint point)
  33. {
  34.     if (!b)
  35.         return;     //如果不是绘图状态,返回
  36.     //P1为鼠标左键按下位置,P2为鼠标上次位置
  37.     //即按前次位置重绘了一次,模式是R2_NOTXORPEN
  38.     //最终效果是白色,由于底色为白,实际效果是清除了上次的线段
  39.     pdc->MoveTo(p1.x,p1.y);
  40.     pdc->LineTo(p2.x,p2.y);
  41.     p2 = point;
  42.     //p1仍为鼠标左键按下位置,P2为当前鼠标位置
  43.     pdc->MoveTo(p1.x,p1.y);
  44.     pdc->LineTo(p2.x,p2.y);    //从P1到鼠标当前位置绘制线段
  45.     CView::OnMouseMove(nFlags, point);
  46. }
复制代码
上面的代码是用来画直线的,能够完成画直线的功能,那么就可以照猫画虎实现画矩形、画圆的功能了,这些图形都需要起点和尽头的坐标作为画图的参数。
同时我们要明白鼠标相应这些函数是在当前视图中执行的,也就是说,我们一打开该程序,只要在视图中点击移动鼠标,这些函数其实都会相应执行到,那么我们该怎么去设计选择不同的图形?
其实这很简单,改造鼠标移动消息相应函数和鼠标左键抬起消息响应函数即可!我们可以给不同的图形一个编号,按下选择图形的按钮后,相对应的消息相应函数就会改变谁人编号,鼠标移动消息相应函数和鼠标左键抬起消息响应函数根据这个编号来绘制不同的图形就可以了!
那鼠标左键按下消息响应函数不用去改造吗?
是不用改造的,由于鼠标一开始按下只是为了获取起点的坐标,而是不去画图形,所以这个对全部的图形都实用。
在这之前需要记录好每一个选择图形按键的 ID,和消息响应函数,同时在消息响应函数中完成了 CDC 对象指针 pdc 的构造。
  1. /*
  2. 1 画直线
  3. 2 画矩形
  4. 3.画空心圆形
  5. 4.画填充矩形
  6. 5.画填充圆形
  7. 6.画圆角矩形
  8. 7.画填充圆角矩形
  9. 直线 ID_LINE,
  10. 矩形 ID_RECTANGLE
  11. 圆形 ID_CIRCLE
  12. 填充矩形 ID_TRECTANGLE
  13. 填充圆形 ID_TCIRCLE
  14. 圆角矩形 ID_YTRECTANGLE
  15. 填充圆角矩形 ID_TYTRECTANGLE
  16. */
  17. void CWkfDrawingView::OnLine()
  18. {
  19.     // TODO: 在此添加命令处理程序代码
  20.     MyDrawStyle = 1;
  21.     pdc=new CClientDC(this);//构造对象
  22.     b=false;
  23. }
  24. void CWkfDrawingView::OnRectangle()//画矩形
  25. {
  26.     MyDrawStyle = 2;
  27.     pdc=new CClientDC(this);//构造对象
  28.     b=false;
  29. }
  30. void CWkfDrawingView::OnCircle()//画空心圆形
  31. {
  32.     MyDrawStyle = 3;
  33.     pdc=new CClientDC(this);//构造对象
  34.     b=false;
  35. }
  36. void CWkfDrawingView::OnTrectangle()
  37. {
  38.     MyDrawStyle = 4;
  39.     pdc=new CClientDC(this);//构造对象
  40.     b=false;
  41. }
  42. void CWkfDrawingView::OnTcircle()
  43. {
  44.     MyDrawStyle = 5;
  45.     pdc=new CClientDC(this);//构造对象
  46.     b=false;
  47. }
  48. void CWkfDrawingView::OnYtrectangle()
  49. {
  50.     MyDrawStyle = 6;
  51.     pdc=new CClientDC(this);//构造对象
  52.     b=false;
  53. }
  54. void CWkfDrawingView::OnTytrectangle()
  55. {
  56.     MyDrawStyle = 7;
  57.     pdc=new CClientDC(this);//构造对象
  58.     b=false;
  59. }
复制代码
下面给出鼠标按下消息相应函数、鼠标移动消息相应函数和鼠标左键抬起消息响应函数的代码,MyStart 和 MyEnd 是视图类的两个 CPoint 类型的成员变量,用来生存起点和尽头的坐标。
  1. void CWkfDrawingView::OnLButtonDown(UINT nFlags, CPoint point)//鼠标按下
  2. {
  3.     // TODO: 在此添加消息处理程序代码和/或调用默认值
  4.     MyStart = MyEnd = point;
  5.     pdc=new CClientDC(this);
  6.     pdc->SetROP2(R2_NOTXORPEN);
  7.     b = true;
  8.     CView::OnLButtonDown(nFlags, point);
  9. }
  10. void CWkfDrawingView::OnMouseMove(UINT nFlags, CPoint point)//鼠标移动
  11. {
  12.     // TODO: 在此添加消息处理程序代码和/或调用默认值
  13.     /*pdc->MoveTo(MyStart.x,MyStart.y);
  14.     pdc->LineTo(MyEnd.x,MyEnd.y);*/
  15.     if(!b)
  16.         return ;
  17.     CPen pen(GP.type, GP.width, GP.pencolor);
  18.     OldPen=pdc->SelectObject(&pen);
  19.     if(MyDrawStyle==1)
  20.     {
  21.         pdc->SelectStockObject(NULL_BRUSH);
  22.         pdc->MoveTo(MyStart.x,MyStart.y);
  23.         pdc->LineTo(MyEnd.x,MyEnd.y);
  24.         MyEnd=point;
  25.         pdc->MoveTo(MyStart.x,MyStart.y);
  26.         pdc->LineTo(MyEnd.x,MyEnd.y);
  27.     }
  28.     else if(MyDrawStyle==2)
  29.     {
  30.         pdc->SelectStockObject(NULL_BRUSH);
  31.         pdc->Rectangle(MyStart.x,MyStart.y,MyEnd.x,MyEnd.y);
  32.         MyEnd = point;
  33.         pdc->Rectangle(MyStart.x,MyStart.y,MyEnd.x,MyEnd.y);
  34.     }
  35.     else if(MyDrawStyle==3)
  36.     {
  37.         pdc->SelectStockObject(NULL_BRUSH);
  38.         pdc->Ellipse(MyStart.x,MyStart.y,MyEnd.x,MyEnd.y);
  39.         MyEnd = point;
  40.         pdc->Ellipse(MyStart.x,MyStart.y,MyEnd.x,MyEnd.y);
  41.     }
  42.     else if(MyDrawStyle==4)
  43.     {
  44.         //pdc->SelectObject(&newBrush);
  45.         CBrush bsh;
  46.         bsh.CreateSolidBrush(GP.pencolor);
  47.         pdc->SelectObject(&bsh);
  48.         pdc->Rectangle(MyStart.x,MyStart.y,MyEnd.x,MyEnd.y);
  49.         MyEnd = point;
  50.         pdc->Rectangle(MyStart.x,MyStart.y,MyEnd.x,MyEnd.y);
  51.         bsh.DeleteObject();
  52.     }
  53.     else if(MyDrawStyle==5)
  54.     {
  55.         //pdc->SelectObject(&newBrush);
  56.         CBrush bsh;
  57.         bsh.CreateSolidBrush(GP.pencolor);
  58.         pdc->SelectObject(&bsh);
  59.         pdc->Ellipse(MyStart.x,MyStart.y,MyEnd.x,MyEnd.y);
  60.         MyEnd = point;
  61.         pdc->Ellipse(MyStart.x,MyStart.y,MyEnd.x,MyEnd.y);
  62.         bsh.DeleteObject();
  63.     }
  64.     else if(MyDrawStyle==6)
  65.     {
  66.         pdc->SelectStockObject(NULL_BRUSH);
  67.         pdc->RoundRect(MyStart.x,MyStart.y,MyEnd.x,MyEnd.y,a.x,a.y);
  68.         MyEnd = point;
  69.         pdc->RoundRect(MyStart.x,MyStart.y,MyEnd.x,MyEnd.y,a.x,a.y);
  70.     }
  71.     else if(MyDrawStyle==7)
  72.     {
  73.         CBrush bsh;
  74.         bsh.CreateSolidBrush(GP.pencolor);
  75.         pdc->SelectObject(&bsh);
  76.         pdc->RoundRect(MyStart.x,MyStart.y,MyEnd.x,MyEnd.y,a.x,a.y);
  77.         MyEnd = point;
  78.         pdc->RoundRect(MyStart.x,MyStart.y,MyEnd.x,MyEnd.y,a.x,a.y);
  79.         bsh.DeleteObject();
  80.     }
  81.     CView::OnMouseMove(nFlags, point);
  82. }
  83. void CWkfDrawingView::OnLButtonUp(UINT nFlags, CPoint point)//鼠标抬起
  84. {
  85.     GPen g;
  86.     g.start = MyStart;
  87.     g.end = MyEnd;
  88.     g.width = MyWidth;
  89.     g.type = type;
  90.     g.style = MyDrawStyle;
  91.     g.pencolor = GP.pencolor;
  92.     if(MyDrawStyle==1)
  93.     {
  94.         // TODO: 在此添加消息处理程序代码和/或调用默认值  
  95.         pdc->SetROP2(R2_COPYPEN);//当前颜色覆盖背景颜色
  96.         pdc->MoveTo(MyStart.x,MyStart.y);
  97.         pdc->LineTo(point.x,point.y);
  98.         g.c = GP.pencolor;
  99.         b=false;//解除绘图关系
  100.     CView::OnLButtonUp(nFlags, point);
  101.     }
  102.     else if(MyDrawStyle==2)
  103.     {
  104.         pdc->SetROP2(R2_COPYPEN);
  105.         pdc->Rectangle(MyStart.x,MyStart.y,MyEnd.x,MyEnd.y);
  106.         g.c = GP.pencolor;
  107.         b=false;//解除绘图关系
  108.         CView::OnLButtonUp(nFlags, point);
  109.     }
  110.     else if(MyDrawStyle==3)
  111.     {
  112.         pdc->SetROP2(R2_COPYPEN);
  113.         pdc->Ellipse(MyStart.x,MyStart.y,MyEnd.x,MyEnd.y);
  114.         g.c = GP.pencolor;
  115.         b=false;//解除绘图关系
  116.         CView::OnLButtonUp(nFlags, point);
  117.     }
  118.    else if(MyDrawStyle==4)
  119.     {
  120.         //pdc->SelectObject(&newBrush);
  121.         CBrush bsh;
  122.         bsh.CreateSolidBrush(GP.pencolor);
  123.         pdc->SetROP2(R2_COPYPEN);
  124.         pdc->SelectObject(&bsh);
  125.         pdc->Rectangle(MyStart.x,MyStart.y,MyEnd.x,MyEnd.y);
  126.         g.c =GP.pencolor;
  127.         b=false;//解除绘图关系
  128.         CView::OnLButtonUp(nFlags, point);
  129.     }
  130.     else if(MyDrawStyle==5)
  131.     {
  132.         //pdc->SelectObject(&newBrush);
  133.         CBrush bsh;
  134.         bsh.CreateSolidBrush(GP.pencolor);
  135.         pdc->SetROP2(R2_COPYPEN);
  136.         pdc->SelectObject(&bsh);
  137.         pdc->Ellipse(MyStart.x,MyStart.y,MyEnd.x,MyEnd.y);
  138.         g.c =GP.pencolor;
  139.         b=false;//解除绘图关系
  140.         CView::OnLButtonUp(nFlags, point);
  141.     }
  142.    else if(MyDrawStyle==6)
  143.     {
  144.         pdc->SetROP2(R2_COPYPEN);
  145.         pdc->RoundRect(MyStart.x,MyStart.y,MyEnd.x,MyEnd.y,a.x,a.y);
  146.         g.angle=a;
  147.         g.c = GP.pencolor;
  148.         b=false;//解除绘图关系
  149.         CView::OnLButtonUp(nFlags, point);
  150.     }
  151.    else if(MyDrawStyle==7)
  152.     {
  153.         //pdc->SelectObject(&newBrush);
  154.         CBrush bsh;
  155.         bsh.CreateSolidBrush(GP.pencolor);
  156.         pdc->SetROP2(R2_COPYPEN);
  157.         pdc->SelectObject(&bsh);
  158.         pdc->RoundRect(MyStart.x,MyStart.y,MyEnd.x,MyEnd.y,a.x,a.y);
  159.         g.angle=a;
  160.         g.c = GP.pencolor;
  161.         b=false;//解除绘图关系
  162.         CView::OnLButtonUp(nFlags, point);
  163.     }
  164.      GetDocument()->Mylist.AddTail(g);//保存信息
  165.      Invalidate();
  166. }
复制代码
上面的代码中也嵌入了画笔和画刷的内容,画笔和画刷有一个特性就是一旦被定义和创建后,之后所绘制的图形就会之间用上了,所以要注意画笔和画刷的使用,而填充图形和空心图形的区别就是有没有画刷。
  1. CBrush bsh;//定义画刷
  2. bsh.CreateSolidBrush(GP.pencolor);//创建画刷
  3. pdc->SelectObject(&bsh);//选择画刷
复制代码
画笔的使用
  1. CPen pen(GP.type, GP.width, GP.pencolor);//画笔的定义和创建,三个参数画笔的类型、画笔宽度、画笔的颜色
  2. pdc->SelectObject(&pen);//选择画笔
复制代码
上面另有一些代码是关于图形生存和重绘的,之后进行阐明。
四、文件生存和读取——文档串行化

文档类中中提供了文档串行化(Serialize)函数能够将对象当前的状态由成员变量的值表现写入硬盘中,下次再从硬盘中读取对象的状态,从而重建对象。
但在这里的对象是什么呢?
是图形,可是图形的种类很多,假如将每一个图形的信息都通过结构体定义出来,那么会有很多的结构体来表现不同的图形,这里我选择了一种方法,将全部图形的参数,不管是特有的参数照旧共有的参数,都齐备封装到一个结构体中,为这个结构体创建链表,修改串行化函数就可以了!
  1. //为了让视图和文档都认识GPen这个存储图片信息的结构体,需要在Stdafx.h中添加代码
  2. struct GPen//保存画笔参数全局变量
  3. {
  4. int type;//画笔类型
  5. int width;//画笔宽度
  6. COLORREF pencolor;//画笔颜色
  7. COLORREF c;
  8. CPoint start,end;//直线、矩形和椭圆的起始点
  9. int style;//图形的类型
  10. CPoint angle;//圆角矩形角度
  11. };
复制代码
为文档 Doc 类添加 Gpen 的链表:
  1. CList <GPen,GPen> Mylist;
复制代码
文档类的串行化 Serialize 函数:
  1. void CWkfDrawingDoc::Serialize(CArchive& ar)
  2. {
  3.     int i;
  4.     if (ar.IsStoring())//保存
  5.     {
  6.         // TODO: 在此添加存储代码
  7.         ar<<Mylist.GetCount();
  8.         GPen g;
  9.         POSITION pos = Mylist.GetHeadPosition();
  10.         for(i = 0; i<Mylist.GetCount(); i++)
  11.             {
  12.                 g = Mylist.GetNext(pos);
  13.                 ar<<g.type<<g.width<<g.pencolor<<g.c<<g.start<<g.end<<g.style<<g.angle;
  14.             }
  15.     }
  16.     else//读取
  17.     {
  18.         // TODO: 在此添加加载代码
  19.         int count;
  20.         ar>>count;
  21.         GPen g;
  22.         POSITION pos = Mylist.GetHeadPosition();
  23.         for(i = 0; i<count; i++)
  24.             {
  25.                 ar>>g.type>>g.width>>g.pencolor>>g.c>>g.start>>g.end>>g.style>>g.angle;
  26.                 Mylist.AddTail(g);
  27.             }
  28.     }
  29. }
复制代码
打开之前生存文件需要有一个重绘函数,我们之前画图都只是在鼠标移动和鼠标左键抬起的时间画图,现在画图都要在视图类中的 OnDraw 中重绘了,这也就是之前的鼠标左键抬起消息响应函数中,最后需要将所画的图形信息生存到链表中的缘故原由了。(鼠标抬起了,这个图形才真正被画出来)
  1. GetDocument()->Mylist.AddTail(g);//保存信息
  2. Invalidate();
复制代码
之后的哪一行代码就是刷新,去执行 OnDraw 函数了。
  1. void CWkfDrawingView::OnDraw(CDC* pDC)//加载文件重绘函数
  2. {
  3.     int i;
  4.     CWkfDrawingDoc* pDoc = GetDocument();
  5.     pdc=new CClientDC(this);
  6.     ASSERT_VALID(pDoc);
  7.     if (!pDoc)
  8.         return;
  9.     GPen g;
  10.     POSITION pos = pDoc->Mylist.GetHeadPosition();
  11.     for(i = 0; i<pDoc -> Mylist.GetCount(); i++)
  12.         {
  13.             g = pDoc -> Mylist.GetNext(pos);
  14.             CPen p(g.type,g.width,g.pencolor);
  15.             pdc->SelectObject(&p);
  16.             pdc->MoveTo(g.start.x,g.start.y);
  17.             if(g.style==1)//画直线
  18.             {
  19.                 pdc->SelectStockObject(NULL_BRUSH);
  20.                 pdc->LineTo(g.end.x,g.end.y);
  21.             }
  22.             if(g.style==2)//画矩形
  23.             {
  24.                 pdc->SelectStockObject(NULL_BRUSH);
  25.                 pdc->Rectangle(g.start.x,g.start.y,g.end.x,g.end.y);
  26.             }
  27.             if(g.style==3)//画圆形
  28.             {
  29.                 pdc->SelectStockObject(NULL_BRUSH);
  30.                 pdc->Ellipse(g.start.x,g.start.y,g.end.x,g.end.y);
  31.             }
  32.             if(g.style==4)//画填充矩形
  33.             {
  34.                 CBrush bsh;
  35.                 bsh.CreateSolidBrush(g.pencolor);
  36.                 pdc->SelectObject(&bsh);
  37.                 pdc->Rectangle(g.start.x,g.start.y,g.end.x,g.end.y);
  38.                 bsh.DeleteObject();
  39.             }
  40.             if(g.style==5)//画填充圆形
  41.             {
  42.                 CBrush bsh;
  43.                 bsh.CreateSolidBrush(g.pencolor);
  44.                 pdc->SelectObject(&bsh);
  45.                 pdc->Ellipse(g.start.x,g.start.y,g.end.x,g.end.y);
  46.                 bsh.DeleteObject();
  47.             }
  48.             if(g.style==6)//画圆角矩形
  49.             {
  50.                 pdc->SelectStockObject(NULL_BRUSH);
  51.                 pdc->RoundRect(g.start.x,g.start.y,g.end.x,g.end.y,g.angle.x,g.angle.y);
  52.             }
  53.             if(g.style==7)//画填充圆角矩形
  54.             {
  55.                 CBrush bsh;
  56.                 bsh.CreateSolidBrush(g.pencolor);
  57.                 pdc->SelectObject(&bsh);
  58.                 pdc->RoundRect(g.start.x,g.start.y,g.end.x,g.end.y,g.angle.x,g.angle.y);
  59.                 bsh.DeleteObject();
  60.             }
  61.             pdc->SelectObject(OldPen);
  62.         }
  63. }
复制代码
五、几个对话框

颜色对话框和字体对话框是体系给的,我这里给出其按键的消息响应函数。此中的 MyFont 和是 Pcolor 是视图类的两个成员变量 CFont MyFont COLORREF Pcolor
  1. void CWkfDrawingView::OnFont()//字体设置
  2. {
  3.     CFontDialog dlg;
  4.     if(IDOK==dlg.DoModal())
  5.     {
  6.         if(MyFont.m_hObject)
  7.         {
  8.             MyFont.DeleteObject();
  9.         }
  10.         MyFont.CreateFontIndirect(dlg.m_cf.lpLogFont);//字体信息
  11.         MyFontName=dlg.m_cf.lpLogFont->lfFaceName;//字体的名称
  12.     }
  13. }
  14. void CWkfDrawingView::OnPancolor()//画笔颜色设置
  15. {
  16.     CColorDialog dlg(0,CC_FULLOPEN);
  17.     if(dlg.DoModal())
  18.     {
  19.         Pcolor = dlg.GetColor();//从颜色对话框中获取颜色信息
  20.         GP.pencolor=Pcolor;
  21.     }
  22.     else if(dlg.DoModal()==IDCANCEL)
  23.     {}
  24. }
复制代码
对于自定义的对话框,有画笔的宽度设置,画笔类型设置,文本输入,代码如下:
  1. void CWkfDrawingView::OnTxt()//文本输入
  2. {
  3.     // TODO: 在此添加命令处理程序代码
  4.     CTxtlog dlg;
  5.     if(dlg.DoModal()==IDOK)
  6.     {
  7.         int X=dlg.MyX;
  8.         int Y=dlg.MyY;
  9.         CString String=dlg.MyString;
  10.         pdc=new CClientDC(this);//构造对象
  11.         pdc->SetTextColor(GP.pencolor);//设置文件颜色
  12.         pdc->SelectObject(&MyFont);
  13.         pdc->TextOut(X,Y,String);
  14.     }
  15.     else if(dlg.DoModal()==IDCANCEL)
  16.     {}
  17. }
  18. void CWkfDrawingView::OnLineW()//画笔宽度
  19. {
  20.     // TODO: 在此添加命令处理程序代码
  21.     CLWidth dlg;
  22.     if(dlg.DoModal()==IDOK)
  23.     {
  24.         GP.width=dlg.width;//更新画笔的宽度
  25.         MyWidth=dlg.width;
  26.     }
  27.     else if(dlg.DoModal()==IDCANCEL)
  28.     {}
  29. }
  30. /*
  31. PS_SOLID 实线
  32. PS_DASH 虚线
  33. PS_DOT 点线
  34. PS_DASHDOT 点化线
  35. PS_DASHDOTDOT 双点化线
  36. */
  37. void CWkfDrawingView::OnSolid()//线条类型
  38. {
  39.     // TODO: 在此添加命令处理程序代码
  40.     type=PS_SOLID;
  41.     GP.type=type;
  42.     pdc=new CClientDC(this);
  43. }
  44. void CWkfDrawingView::OnDash()
  45. {
  46.     // TODO: 在此添加命令处理程序代码
  47.     type=PS_DASH;
  48.     GP.type=type;
  49. }
  50. void CWkfDrawingView::OnDot()
  51. {
  52.     // TODO: 在此添加命令处理程序代码
  53.     type=PS_DOT;
  54.     GP.type=type;
  55. }
  56. void CWkfDrawingView::OnDashdot()
  57. {
  58.     // TODO: 在此添加命令处理程序代码
  59.     type=PS_DASHDOT;
  60.     GP.type=type;
  61. }
  62. void CWkfDrawingView::OnDashdotdot()
  63. {
  64.     // TODO: 在此添加命令处理程序代码
  65.     type=PS_DASHDOTDOT;
  66.     GP.type=type;
  67. }
复制代码
但对于文本输入和字体宽度设置,需要从对话框中获取信息,生存到变量中,这就需要互换函数,在这之前需要将自定义的对话框设置一个对话框类,与对话框资源相关联,全部的代码处理惩罚都在对话框类中进行。以文本输入为例,添加文本输入对话框类
  1. # pragma once
  2. // CTxtlog 对话框
  3. class CTxtlog : public CDialog
  4. {
  5. DECLARE_DYNAMIC(CTxtlog)
  6. public:
  7. CTxtlog(CWnd* pParent = NULL);   // 标准构造函数
  8. virtual ~CTxtlog();
  9. // 对话框数据
  10. enum { IDD = IDD_TEXT };
  11. protected:
  12. virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持
  13. DECLARE_MESSAGE_MAP()
  14. public:
  15. int MyX;
  16. public:
  17. int MyY;
  18. public:
  19. CString MyString;
  20. };
复制代码
修改此中的数据互换函数为:
  1. void CTxtlog::DoDataExchange(CDataExchange* pDX)
  2. {
  3.     CDialog::DoDataExchange(pDX);
  4.     DDX_Text(pDX, ID_TXTX, MyX);
  5.     DDX_Text(pDX, ID_TXTY, MyY);
  6.     DDX_Text(pDX, ID_TXTS, MyString);
  7. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

伤心客

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表