码迷,mamicode.com
首页 > 编程语言 > 详细

MFC—第十课(一)学习笔记

时间:2015-06-05 07:30:22      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:

F编程练习—第十课

知识清单

  • 图形的绘制
  • 设置对话框
  • 颜色对话框
  • 字体对话框
  • 如何在窗口中显示一幅位图

 


(1)添加一个菜单

绘图

(2)在这个菜单中添加四个菜单项

点,直线,矩形,椭圆

(3)分别为这四个菜单项添加命令响应

  • 注意:class name选择:view类

下面是在view类中新增的四个函数

F编程练习—第十课

知识清单

  • 图形的绘制
  • 设置对话框
  • 颜色对话框
  • 字体对话框
  • 如何在窗口中显示一幅位图

 


(1)添加一个菜单

绘图

(2)在这个菜单中添加四个菜单项

点,直线,矩形,椭圆

(3)分别为这四个菜单项添加命令响应

  • 注意:class name选择:view类

下面是在view类中新增的四个函数

 1 void CGraphicView::OnDot() 
 2 {
 3     // TODO: Add your command handler code here
 4     
 5 }
 6 
 7 void CGraphicView::OnLine() 
 8 {
 9     // TODO: Add your command handler code here
10     
11 }
12 
13 void CGraphicView::OnRectangle() 
14 {
15     // TODO: Add your command handler code here
16     
17 }
18 
19 void CGraphicView::OnEllipse() 
20 {
21     // TODO: Add your command handler code here
22     
23 }

当用户点击菜单项的时候,我们应,该在相应的函数中,保存下用户的选择,那么在随后的图形绘制中,我们可以根据白存下来的选择,绘制图形。那么如何保存用户的选择?

  • 解决办法:在view类中增加一个成员变量,如下图所示:

在类中加入了成员变量,必然要在类的构造函数中对他进行初始化,如下:

 1 CGraphicView::CGraphicView()
 2 {
 3     // TODO: add construction code here
 4     m_nDrawType=0;
 5 }
 6 根据用户不同的选择,我们将变量设置为不同的值,代码如下:
 7 
 8 void CGraphicView::OnDot() 
 9 {
10     // TODO: Add your command handler code here
11     mnDrawType=1;
12 }
13 void CGraphicView::OnLine() 
14 {
15     // TODO: Add your command handler code here
16     mnDrawType=2;
17 }
18 void CGraphicView::OnRectangle() 
19 {
20     // TODO: Add your command handler code here
21     mnDrawType=3;
22 }
23 void CGraphicView::OnEllipse()
24 {
25 
26       // TODO: Add your command handler code here 
27        mnDrawType=4; 
28 
29 }

确定图像

我们可以通过两个点来确定我们的图形

  • 点击(不松开)是为一个点
  • 松开为另外的一个点

自然地:我们就要对以上的两个消息分别进行捕获

  • 在view类上,点击右键->选择add windows message hinder
  • 选择:WM_LBUTTONDOWM 和 WM_LBOTTONUP
  • 编辑代码

同样,我们应该保存下来,鼠标左键点击时的信息,与之前一样,在view类中新增一个成员变量,并在view类的构造函数中完成初始化

 1 CGraphicView::CGraphicView()
 2 {
 3     // TODO: add construction code here
 4     m_nDrawType=0;
 5     m_ptOrigin=0;
 6 }
 7 我们现在要做的就是,将新增函数获取到的信息保存在新增的变量中
 8 void CGraphicView::OnLButtonDown(UINT nFlags, CPoint point) 
 9 {
10     // TODO: Add your message handler code here and/or call default
11     m_ptOrigin=point;
12     CView::OnLButtonDown(nFlags, point);
13 }

接下来就是绘图了,首先呢,绘图,我们需要DC,

  • CClientDC dc;定义一个CClientDC的一个对象

  • 具体化到哪个图形呢,就要看用户的选择了,我们已经将用户的选择保存在了变量m_nDrawType所以,这里可用一个switch语句来判断

接下来就是用户不同的选择了,我们需要用不同的方法去处理

    1. 如果用户选择点:关于设置一个点,这里我们需要用到一个函数
    2. >

SetPixel(POINT point , COLORREF crColor)

  1. 如果用户选择了直线:这里用到两个函数 * dc.Moveto(m_nptOrigin) * dc.Lineto(point)

 

  • 如果用户选择了矩形:dc.Rectangle(CRect(m_nptOrigin,point))

     

    这个函数还有一些地方需要注意:
    参数要求:指向CRect的指针,但是我们这里传递的是一个矩形的对象,也就是CRect的对象(他可以通过两个点来构造出一个矩形对象)为什么不会报错呢?

    因为在Rectangle()函数里有这么一条:  
    如果发现参数是CRect对象而非指针,那么就会隐式的将它的参数转换为一个指向CRect的指针

     

     

  • 如果用户选择了椭圆:

     

    dc.Ellipse(CRect(m_nptOrigin,point));

    具体代码片段如下:

     1 void CGraphicView::OnLButtonUp(UINT nFlags, CPoint point) 
     2 {
     3     // TODO: Add your message handler code here and/or call default
     4     CClientDC dc(this);
     5     switch(m_nDrawType)
     6     {
     7     case 1:
     8         dc.SetPixel(point,RGB(255,0,0));//红色
     9         break;
    10     case 2:
    11         dc.MoveTo(m_ptOrigin);
    12         dc.LineTo(point);
    13         break;
    14     case 3:
    15         dc.Rectangle(CRect(m_ptOrigin,point));
    16         break;
    17     case 4:
    18         dc.Ellipse(CRect(m_ptOrigin,point));
    19         break;
    20     }
    21     CView::OnLButtonUp(nFlags, point);
    22 }

    更改图形颜色的绘制
    我们知道线条的颜色是是由dc当中画柄的颜色来决定的,所以呢,我们可以这么做:

    1. 创建一个画柄,并为这个画柄选择一种颜色
    2. 将这个画柄添加到我们的设备描述表中

    函数如下:
    CPen pen(PS_SOLID,1,RGB(255,0,0));

    参数一:画柄的类型,这里我们选择实线
    参数二:画出线的宽度
    参数三:颜色

    第二步是将我们创建的画柄添加到设备描述表当中

     

    • dc.SelectObject(&pen);

    代码片段:

    //创建画柄
    CPen pen(PS_SOLID,1,REG(255,0,0));
    //添加画柄
    dc.SelectObject(&pen);

    将画刷的填充设置为透明的

    函数GetStockObject(NULL_BRUSH)会返回一个透明画刷的句柄,接着,我们可以使用CBrush::Fromhandle()函数,他会接受一个画刷的句柄,返回一个CBrush的指针,我们还需要对参数类型进行强制转换,为HBRUSH类型。因为CBrush::Fromhandle()函数的参数类型就是HBRUSH,然后用前面讲过的方法,将他添加到我们的设备描述表当中。


    设置对话框

    (1)我们要有一个对话框的资源,在创建了对话框资源之后,接着为他建立一个类,基类选择为Dialog
    (2)添加两个控件:静态文本框,编辑框
    (3)给这个编辑框关联一个变量

    我们再来回顾一下,如何给一个控件关联变量

    1 在编辑框出右键
    2 选择classwizard
    3 点击Member Variables
    4 点击add variables

     

(4)接着,我们来建立一个菜单项,当用户点击这个菜单项的时候,弹出设置对话框
(5)为这个菜单项添加一个命令响应(其实就是增加一个函数)

  • 注意class name选择view类;
  • 要在view类中让我们的这个对话框显示出来,就必必须包含和这个对话框相关联的类的头文件

代码片段

//构建对象
CSettting dlg;
//显示对话框
dlg.DoModal();

对话框弹出之后,用户就可以进行设置了,我们下一步要做的就是将用户要输入的值保存在view类当中这样,我们在创建画柄的时候,就可以按照用户的输入,设置相关信息了。

当然了,什么时候保存呢?总不能用户一输入,我们就来保存吧,当用户点击OK按钮的时候我们,我们才会进行信息的保存这也就需要我们在保存信息之前来做一个判断

用户输入信息,我们判断之后进行保存,那么我们将信息保存在哪里呢?这也就需要我们在view类当中去增加一个成员变量,用来保存我们的信息

代码片段

 1 void CGraphicView::OnSetting() 
 2 {
 3     // TODO: Add your command handler code here
 4     CSettting dlg;
 5     //判断你如果点击的是确定按钮
 6     if(IDOK==dlg.DoModal())
 7     {
 8       mnLineWidth=dlg.mnLineWidth;
 9     }
10 }

说明:在试验中还发现如果我们再次点击设置时,之前设置的值会改为0,只是因为再次点击设置,他会重新调用函数,重新创建对话框对象,也就会调用这个类的构造函数,那么我们之前设置的值也就变成0了,其实,这种问题我们之前碰到过,只要我们在创建对象的语句之前加上关键字,static就可以了,这样,我们再次创建对象的时候,就不会重新初始化了。

MFC—第十课(一)学习笔记

标签:

原文地址:http://www.cnblogs.com/rupengkun/p/4553573.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!