`
mmdev
  • 浏览: 12847644 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

MFC 自绘入门

 
阅读更多

<wbr>使用MFC画点的方法很简单,只需要调用COLORREF CDC::SetPixel( int x, int y, COLORREF crColor )就可以在指定点画上指定颜色,同时返回原来的颜色。COLORREF CDC::GetPixel( int x, int y)可以得到指定点的颜色。在Windows中应该少使用MFC的画点函数,因为这样做的执行效率比较低。</wbr>

<wbr><wbr><wbr><wbr>刷子和画笔是MFC作图中是使用最多的GUI对象,本节在讲解刷子和画笔使用方法的同时也讲述一写基本作图函数。</wbr></wbr></wbr></wbr>

<wbr><wbr><wbr>在画点或画线时系统使用当前DC中的画笔,所以在创建画笔后必须将其选入DC才会在绘图时产生效果。画笔可以通过CPen对象来产生,通过调用CPen::CreatePen( int nPenStyle, int nWidth, COLORREF crColor )来创建。其中nPenStyle指名画笔的风格,可取如下值:</wbr></wbr></wbr>

  • PS_SOLID实线<wbr><wbr><wbr></wbr></wbr></wbr>
  • PS_DASH虚线,宽度必须唯一<wbr><wbr><wbr></wbr></wbr></wbr>
  • PS_DOT点线,宽度必须唯一<wbr><wbr><wbr></wbr></wbr></wbr>
  • PS_DASHDOT点划线,宽度必须唯一<wbr><wbr><wbr></wbr></wbr></wbr>
  • PS_DASHDOTDOT双点划线,宽度必须唯一<wbr><wbr></wbr></wbr>
  • PS_NULL空线,使用时什么也不会产生<wbr><wbr></wbr></wbr>
  • PS_ENDCAP_ROUND结束处为圆形<wbr><wbr><wbr></wbr></wbr></wbr>
  • PS_ENDCAP_SQUARE结束处为方形<wbr><wbr></wbr></wbr>

nWidth和crColor为线的宽度和颜色。

<wbr><wbr><wbr>刷子是在画封闭曲线时用来填充的颜色,例如当你画圆形或方形时系统会用当前的刷子对内部进行填充。刷子可利用CBrush对象产生。通过以下几种函数创建刷子:</wbr></wbr></wbr>

  • BOOL CreateSolidBrush( COLORREF crColor ); 创建一种固定颜色的刷子
  • BOOL CreateHatchBrush( int nIndex, COLORREF crColor ); 创建指定颜色和网格的刷子
  • BOOL CreatePatternBrush( CBitmap* pBitmap ); 创建以8*8位图为模板的刷子

在选择了画笔和刷子后就可以利用MFC的DC作图函数进行作图了,基本的画线函数有以下几种

  • CDC::MoveTo( int x, int y ); 改变当前点的位置
  • CDC::LineTo( int x, int y ); 画一条由当前点到参数指定点的线
  • CDC::BOOL Arc( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); 画弧线
  • CDC::BOOL Polyline( LPPOINT lpPoints, int nCount ); 将多条线依次序连接

基本的作图函数有以下几种:

  • CDC::BOOL Rectangle( LPCRECT lpRect ); 矩形
  • CDC::RoundRect( LPCRECT lpRect, POINT point ); 圆角矩形
  • CDC::Draw3dRect( int x, int y, int cx, int cy, COLORREF clrTopLeft, COLORREF clrBottomRight ); 3D边框
  • CDC::Chord( LPCRECT lpRect, POINT ptStart, POINT ptEnd ); 扇形
  • CDC::Ellipse( LPCRECT lpRect ); 椭圆形
  • CDC::Pie( LPCRECT lpRect, POINT ptStart, POINT ptEnd );
  • CDC::Polygon( LPPOINT lpPoints, int nCount ); 多边形

<wbr><wbr><wbr>对于矩形,圆形或类似的封闭曲线,系统会使用画笔绘制边缘,使用刷子填充内部。如果你不希望填充或是画出边缘,你可以选入空刷子(NULL_PEN)或是(NULL_BRUSH)空笔。</wbr></wbr></wbr>

下面的代码创建一条两象素宽的实线并选入DC。并进行简单的作图:

{

...

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>CPen pen;</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>pen.CreatePen(PS_SOLID,2,RGB(128,128,128));</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>CPen* pOldPen=(CPen*)dc.SelectObject(&amp;pen);</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>dc.SelectStockObject(NULL_BRUSH);//选入空刷子</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>dc.Rectangle(CRect(0,0,20,20));//画矩形</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

...

}

注:SelectObject该函数选择一对象到指定的设备上下文环境中,该新对象替换先前的相同类型的对象。

StretchBlt函数从源矩形中复制一个位图到目标矩形,必要时按目前目标设备设置的模式进行图像的拉伸或压缩。

SelectStockObject其作用是选择系统预定义的GDI对象(stock -库存)。由于是系统定义的公用函数,所以用完以后也不用手动删除。
而SelectObject则是选择你自己自定义的的GDI对象,用完之后要DelectObject();

bitblt : 直接按你指定的大小输出源dc到目标dc,而strechblt会调整你源dc大小,使之适应你所指定的目标dc大小,再输出。

也就是说,strechblt输出的图总是完整的,而且充满你指定的目标DC区域,而bitblt则可能输出的图是不完整的,也可能无法充满目标dc制定区域。


在Windows中可以将预先准备好的图像复制到显示区域中,这种内存拷贝执行起来是非常快的。在Windows中提供了两种使用图形拷贝的方法:通过设备相关位图(DDB)和设备无关位图(DIB)。

关于DDB 和 DIB :http://blog.csdn.net/qsycn/article/details/4485523

<wbr><wbr><wbr>DDB可以用MFC中的CBitmap来表示,而DDB一般是存储在资源文件中,在加载时只需要通过资源ID号就可以将图形装入。BOOL CBitmap::LoadBitmap( UINT nIDResource )可以装入指定DDB,但是在绘制时必须借助另一个和当前绘图DC兼容的内存DC来进行。通过CDC::BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc,DWORD dwRop )绘制图形,同时指定光栅操作的类型。BitBlt可以将源DC中位图复制到目的DC中,其中前四个参数为目的区域的坐标,接下来是源DC指针,然后是源DC中的起始坐标,由于BitBlt为等比例复制,所以不需要再次指定长宽,(StretchBlt可以进行缩放)最后一个参数为光栅操作的类型,可取以下值:</wbr></wbr></wbr>

  • BLACKNESS输出区域为黑色<wbr><wbr><wbr></wbr></wbr></wbr>
  • DSTINVERT反色输出区域<wbr><wbr><wbr></wbr></wbr></wbr>
  • MERGECOPY在源和目的间使用AND操作<wbr><wbr><wbr></wbr></wbr></wbr>
  • MERGEPAINT在反色后的目的和源间使用OR操作<wbr><wbr><wbr></wbr></wbr></wbr>
  • NOTSRCCOPY将反色后的源拷贝到目的区<wbr><wbr><wbr></wbr></wbr></wbr>
  • PATINVERT源和目的间进行XOR操作<wbr><wbr></wbr></wbr>
  • SRCAND源和目的间进行AND操作<wbr></wbr>
  • SRCCOPY复制源到目的区<wbr><wbr></wbr></wbr>
  • SRCINVERT源和目的间进行XOR操作<wbr><wbr><wbr></wbr></wbr></wbr>
  • SRCPAINT源和目的间进行OR操作<wbr><wbr><wbr></wbr></wbr></wbr>
  • WHITENESS输出区域为白色<wbr><wbr></wbr></wbr>

下面用代码演示MFC下的位图使用:

CYourView::OnDraw(CDC* pDC)

{

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>CDC memDC;//定义一个兼容DC</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>memDC.CreateCompatibleDC(pDC);//创建DC</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>CBitmap bmpDraw;</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>bmpDraw.LoadBitmap(ID_BMP) ;//装入DDB</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>CBitmap* pbmpOld=memDC.SelectObject(&amp;bmpDraw) ;</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

//保存原有DDB,并选入新DDB入DC

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>pDC-&gt;BitBlt(0,0,20,20,&amp;memDC,0,0,SRCCOPY) ;</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

//将源DC中(0,0,20,20)复制到目的DC(0,0,20,20)

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>pDC-&gt;BitBlt(20,20,40,40,&amp;memDC,0,0,SRCAND);</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr>//将源DC中(0,0,20,20)和目的DC(20,20,40,40)中区域进行AND操作</wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>memDC.SelectObject(pbmpOld) ;//选入原DDB</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

}

(图标并不是一个GDI对象,所以不需要选入DC)在MFC中没有一个专门的图标类,因为图标的操作比较简单,使用HICON CWinApp::LoadIcon( UINT nIDResource )或是HICON CWinApp::LoadStandardIcon( LPCTSTR lpszIconName ) 装入后就可以利用BOOL CDC::DrawIcon( int x, int y, HICON hIcon )绘制。由于在图标中可以指定透明区域,所以在某些需要使用非规则图形而且面积不大的时候使用图标会比较简单。下面给出简单的代码:

OnDraw(CDC* pDC)

{

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>HICON hIcon1=AfxGetApp()-&gt;LoadIcon(IDI_I1);</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>HICON hIcon2=AfxGetApp()-&gt;LoadIcon(IDI_I2);</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>pDC-&gt;DrawIcon(0,0,hIcon1);</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>pDC-&gt;DrawIcon(0,40,hIcon2);</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>DestroyIcon(hIcon1);</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

<wbr><wbr><wbr><wbr><wbr><wbr><wbr>DestroyIcon(hIcon2);</wbr></wbr></wbr></wbr></wbr></wbr></wbr>

}

<wbr><wbr><wbr>同样在MFC也没有提供一个DIB的类,所以在使用DIB位图时我们需要自己读取位图文件中的头信息,并读入数据,并利用API函数StretchDIBits绘制。位图文件以BITMAPFILEHEADER结构开始,然后是BITMAPINFOHEADER结构和调色版信息和数据,其实位图格式是图形格式中最简单的一种,而且也是Windows可以理解的一种。我不详细讲解DIB位图的结构,提供一个MFC的CDib类供大家使用,这个类包含了基本的功能如:Load,Save,Draw。</wbr></wbr></wbr>


CDC类常用绘图函数类常用绘图函数:
Arc:绘制一段弧:

Chord:绘制弦形:

Ellipse:绘制椭圆或圆:

MoveTo:将当前位置移动到指定位置:

LineTo:从当前位置到指定位置画一条直线:

Polyline:画连接指定点的折线段:

PolyBezler:根据两个端点和两个控制点画贝塞尔曲线

Pie:画冰块:

Polygon:根据两个或两个以上的顶点绘制一个多边形:

Rectangle:根据指定的左上角和右下角坐标绘制一个矩形:

RoundRect:画圆角矩形:

SetPixel:画一个点



分享到:
评论

相关推荐

    mfc 自绘按钮

    mfc 自绘按钮 此文章简单的自绘一个按钮,同时也介绍自绘的一些原理;(绝对适合初学者入门,我也Goolgle 很多资料,介绍相当模糊为此也花了两天时间整理和学习!)虽然做的很简单,却包含了 自绘的原理。

    MFC入门绘图程序,可以实现Window环境下自带绘图软件的一些基本功能

    简单的MFC入门绘图程序,可以实现Window环境下自带绘图软件的一些基本功能,帮助大家学习、入门MFC

    MFC 编程入门教程55篇完整版.pdf

    VS2010之MFC入门到精通教程的pdf,共306页 ,10大章节,55小节。完整有图版 第一部分:VS2010/MFC 开发环境 VS2010/MFC 编程入门之前言 VS2010/MFC 编程入门之一(VS2010 与MSDN 安装过程图解) 第二部分:VS2010/...

    鸡啄米:VS2010-MFC编程入门教程(1-55).docx

    一、VS2010/MFC编程入门教程之目录 第一部分:VS2010/MFC开发环境 VS2010/MFC编程入门之前言 VS2010/MFC编程入门之一(VS2010与MSDN安装过程图解) 第二部分:VS2010/MFC应用程序框架 VS2010/MFC编程入门之二...

    VS2012+MFC入门经典+利用MFC编写绘图器

    VS2017+MFC入门经典,该示例在vs2017的MFC平台上利用多文档模板,编写的一个绘图器,功能齐全,注释全面清晰,是入门MFC的助手,一个例程带你入门MFC

    MFC教程入门知识全集.rar

    4.1 什么是MFC 以及MFC 的特点 (例子代码EX04-00) 4.2 MFC 应用程序框架 (例子代码EX04-01) 4.3 应用程序框架说明 4.4 文档-视图体系结构 4.4.1 文档-视图相互作用的函数 4.4.2 单文档-视图应用程序结构 ...

    MFC鼠标绘图Demo源程序

    用鼠标进行简单的涂鸦绘图,并对绘图进行重绘,代码简洁,适合MFC入门人员阅读

    MFC基于对话框实现GDI+绘图入门代码总结

    之前研究了很久GDI+,也一直看不到,因为一直都不动手,今天偶然百度查询资料,终于实现了GDI+绘图的基本流程了,因此总结下基本编写代码的流程,分为单文档,和对话框两种方式来绘图,也写出了注意要点,在此分享,...

    MFC程序绘图

    用MFC进行简单的图形绘制,比较适合入门者学习!用MFC进行简单的图形绘制,比较适合入门者学习!

    MFC中OpenGL入门基本图形的绘制

    在MFC中绘制计算机图形学中的基本图形,对初学者有一定帮助

    MFC绘图sin函数

    MFC不错的入门学习资料,先掌握简单的静态绘图如正弦函数,然后添加模块,学习更深入的MFC。

    C++/MFC绘图

    MFC中绘图讲解与代码,很好的学习资料。例子很详细,是很好地C++入门资料。

    MFC绘图程序 MFC绘图程序

    利用MFC(C++)绘制动态曲线。入门的东西,可以下载试试。

    MFC入门程序

    新接触MFC,学习过程中用来练手的小程序,做完这个后就差不多算是入门了吧

    Visual C++6.0MFC简单绘图

    简单的MFC绘制图形,绘制直线,圆,矩形,适合入门者学习

    MFC入门讲解与上机指导

    手把手教你学习MFC,通过具体步骤,一步步教你如何开始一个MFC项目,到具体映射

    MFC图形编程与交互绘图基础

    MFC图形编程与交互绘图基础,MFC入门必看。。。

    c++中mfc的简单绘图教程

    资源中主要介绍的是mfc入门的一些知识以及常用和比较简单的一些绘图的教学。主要是为入门者提供一个学习和参考

    经典MFC绘图

    经典MFC绘图,各种绘图详解,清华大学经典教程,轻松入门MFC绘图

    MFC及windows程序入门学习资料

    MFC的入门学习资料,1:Windows程序设计教材及课件,实验1:vc6.0集成开发环境,实验2:Windows编程基础,实验3:MFC应用程序基本框架,实验4:windows绘图,实验5:菜单、工具栏和状态栏,实验6:对话框,实验7 ...

Global site tag (gtag.js) - Google Analytics