CDC类的主要绘图成员函数

合集下载

DC,CDC,HDC,CClientDC....有什么本质的区别

DC,CDC,HDC,CClientDC....有什么本质的区别

Vc中关于DC(设备环境函数(Device Context))的理解问:设备描述表DC是一个什么概念,谁通俗的说说,先谢了学习Vc,首先遇到的就是这个dc,即设置描述表,输出文字,绘图都要用这个,好象它太重要了。

但是我就是不明白,这是什么东西。

一些教程看了,但还是不太了解,谁能通俗的说说,能快速理解它,谢谢。

答:1、作画之前需要准备好画布、画笔、调色板等。

当使用GDI函数如MoveToEx/LineTo, TextOut时,只是告诉系统要划线或写字了,但用什么样的笔(HPEN),字是什么颜色(SetTextColor),画在哪张“纸”(HBITMAP)上需要从一个由系统定义的数据结构中去读取。

这个数据结构被称为Device Context(DC)。

换句话说,GDI函数只是绘画的动作,而DC则保存了绘画所需的材料和工具。

2、设备环境函数(Device Context)设备环境是一个结构,它定义了一系列图形对象及其相关的属性,以及会影响输出结果的绘图方式。

这些图形对象包括:画笔(用于画直线),笔刷(用于绘图和填充),位图(用于屏幕的拷贝或滚动),调色板(用于定义可用的颜色集),剪裁区(用于剪裁和其他操作),路径(用于绘图和画图操作)。

设备环境函数用于对设备环境进行创建、删除或获取信息。

问:DC,CDC,HDC,CClientDC....有什么本质的区别?答:都是DC嘛,HDC就是最原始的DC 句柄,很多API的第一个参数就是一个HDC 类型,比如HDC hDC = ::GetDC( m_hWnd);::MoveToEx( hDC, 0, 0, NULL );::LineTo( hDC, 0, 100, );::ReleaseDC( m_hWnd, hDC );在MFC中,为了将API封装成一个类来操作,因此多出来了一个CDC。

所以在MFC中,都是CDC dc = GetDC();dc.MoveTo( 0, 0 );dc.LineTo( 0, 100 );this->ReleaseDC( &dc );但这样还不够,因为CDC还要你自己去释放,所有MFC中又多出来一个CClientDC, 这样你就可以这样了:CClientDC dc(this);dc.MoveTo( 0, 0 );dc.LineTo( 0, 100 );CClientDC的析构函数自己会释放自己。

DC介绍

DC介绍

DC 即Device Context,是GDI内部的一个资料结构,一个DC会和某个特定的显示设备(如打印机、屏幕等)产生关联。

我们如果能取得该DC的handle 那我们便可以在这显示设备上写字、画图。

在Form 或Picturebox中都有一个hdc的属性,指的便是这东西,但是,怎麽又会有一个Memory DC呢?这是一个存在记忆体内的dc ,它除了不像form picturebox能将图形、文字显示出来之外,其他的几乎都相同,它也可以用在所有的GDI API 呼叫之上,其实我们在VB中早就有使用上这Memory DC 了,只是没有自觉。

当我们设form picturebox的AutoRedraw = True时,hdc所指的便是Momoory DC,这时我们在其上作绘图动作,都没有显示在form上,这便是先前说的,它只是在记忆体中,不会真的画出图。

而我们下r efresh指令时,便是将这MemoryDC上的图,copy到form/Picture Box上。

另外我们也可以使用CreateCompatibleDC() API 它传入一个h Dc ,代表产生的Memory DC和hdc相容,若传0则是与屏幕相容的Memory DC hMemDC = CreateCompatibleDC(0)这时候,该hMemDC所指的绘图区有多大呢?其实只有一个单色Pixel,直到我们使用SelectObject( hMemDC, hBitmap)那hMemDC显示区就会有和hBitmap一样的宽度、高度、颜色选择等。

而且我们在hMemDC上的任何绘图,也都会反映在hBit Map上,也就是说,原本hBitMap所指的图,在SelectObject(hMe mDC, hBitMap)后,我们使用gdi函式在hMemDC上画一条线,那么该hBitmap所指的图也会有一条线了。

那么Memory DC又有什么作用呢?我们知道,在使用VC开发图形相关的应用程序时,常常需要使用MFC的CDC类直接把图形画在窗口上。

MFC中的CDC 绘图

MFC中的CDC 绘图

MFC中的CDC 绘图绘图一般在视图类的(屏幕/打印机)绘图消息响应函数OnDraw中进行,例如:void CTestView::OnDraw(CDC* /*pDC*/) {CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;// TODO: 在此处为本机数据添加绘制代码}每次需要重绘窗口时(程序启动/窗口大小改变/全部或部分窗口重现/程序员调用RedrawWindow或UpdateWindow),应用程序框架都会调用该CWnd的消息响应成员函数(的覆盖)来绘制窗口客户区。

在Windows中,绘图一般在视图窗口的客户区进行,使用的是MFC的设备上下文(DC = Device-Context)类CDC中各种绘图函数。

在绘图前,必须先得到客户区大小和DC、设置绘图颜色,然后再根据文档数据或用户操作来绘制图形。

1 几何对象的结构和类为了使用绘图函数,应该先了解绘图所用到的几种表示几何对象的结构和类。

这些结构和类分别定义在头文件windef.h和afxwin.h中。

1.点1)点结构POINT点数据结构POINT用来表示一点的x、y坐标:typedef struct tagPOINT {LONG x;LONG y;} POINT;2)点类CPoint点类CPoint为一个没有基类的独立类,封装了POINT结构,有成员变量x和y,其构造函数有5种:CPoint( );CPoint( int initX, int initY );CPoint( POINT initPt );CPoint( SIZE initSize );CPoint( LPARAM dwPoint ); // 低字设为x、高字设为yCPoint类还定义了4个平移和设置函数:void Offset(int xOffset, int yOffset);void Offset(POINT point);void Offset(SIZE size);void SetPoint(int X, int Y);CPoint类还重载了+、-、+=、-=、==、!=等运算符来支持CPoint对象和CPoint、POINT、SIZE对象之间的运算。

CDC绘图

CDC绘图

图形设备接口一、GDI、DC的概念1.GDI:(Graphics Device Interfase)图形设备接口,是一个应用程序与输出设备之间的中介。

一方面,GDI向应用程序提供一个与设备无关的编程环境,另一方面,它又以设备相关的格式和具体的设备打交道。

user32.dll2.DC:(Device Context)设备描述表,是一种Windows数据结构。

包括了与一个设备的绘制属性相关的信息。

所有的绘制操作通过一个设备描述表进行,绘制线条、形状和文本的Windows API 函数都与DC有关。

二、在Windows Application程序中画线1.定义两个全局变量用于记录鼠标按下的(x,y)坐标。

int nOrginX;int nOrginY;2.响应鼠标按下和鼠标抬起的消息:在Swich中加入case WM_LBUTTONDOWN:case WM_LBUTTONUP:3.在鼠标按下时记录鼠标按下的(x,y)坐标,查MSDN得知WM_LBUTTONDOWN lParam的低字存放x坐标,高字存放y坐标,将其取出存入nOrginX,nOrginY。

case WM_LBUTTONDOWN:nOrginX=lParam & 0x0000ffff;nOrginY=lParam >> 16 & 0x0000ffff;break;4.在鼠标抬起时画线:case WM_LBUTTONUP:HDC hdc;hdc=GetDC(hwnd);PAINTSTRUCT ps;::MoveToEx(hdc,nOrginX,nOrginY,NULL);::LineTo(hdc,LOWORD(lParam),HIWORD(lParam) );::ReleaseDC(hwnd,hdc);三、在MFC程序中画线:1.在CxxxView(其中xxx是你的工程名字)中响应鼠标按下和鼠标抬起的消息(因为只有CxxxView中才能接收到鼠标消息):使用ClassWizard加入WM_LBUTTONDOWN,WM_LBUTTONUP的消息响应函数OnLButtonDown, OnLButtonUp。

windows编程技术10GDI编程3—动画

windows编程技术10GDI编程3—动画

第10章 GDI编程3-动画动画是利用人的视觉滞留缺陷(25ms~400ms)和心理认可来动态生成系列相关画面以产生运动视觉的技术。

位图动画是将预先制作好的一系列表示连续画面的位图,按一定的时间间隔一幅接一幅地连续显示,从而产生动画效果。

因为绘制动画所需的图形,以及拍摄和处理图片,需要美术、摄影、数字图像处理、动画设计等知识,我们这里不讲。

本书只介绍如何显示已有的位图(序列)以产生动画效果,以及如何动态绘制不同的简单图形以产生二维图形动画等。

用GDI编程实现动画,一般需要用到计时器(Timer)操作,通常在计时器响应函数OnTimer中(而不要使用OnDraw)绘图来实现动画。

10.1 固定位图动画本节介绍利用一系列的位图资源,在同一个屏幕位置,接连显示位图序列,以达到动画的效果的具体方法。

为此,可在交互绘图程序中添加一个如图10-1所示的位图动画对话框,并添加对应的对话框类CDukeDlg。

也可以创建一个基于对话框的独立的MFC应用程序。

图10-1 位图动画对话框资源当然还需添加相应的“位图动画”菜单项(ID_DUKE)和(为视图类添加)对应的菜单响应函数,并在该函数中创建对话框类的对象,打开对话框来运行动画:#include "DukeDlg.h"void CDrawView::OnDuke() {CDukeDlg dlg;dlg.DoModal();}10.1.1 准备位图、加入位图资源系列公爵(Duke)BMP文件T1.BMP ~ T10.BMP(见图10-2),来自Java吉祥物的GIF 动画文件,可存放在项目的res子目录的Duke子目录中(该位图资源已经打包成Duke.rar 文件后,放到了系里的网站和我的个人网页上)。

T1.BMP T2.BMP T3.BMP T4.BMP T5.BMPT6.BMP T7.BMP T8.BMP T9.BMP T10.BMP图10-2 Duke位图文件用VC的资源编辑器依次加入位图文件:在左边的项目工作区中选“资源视图”页,展开项目的资源列表,在“Bitmap”表项(若无此项,则可直接在项目资源项)上单击鼠标右键,在弹出的浮动菜单中选“添加资源”菜单项,在打开的“添加资源”对话框中,选中左边“资源类型”栏中的“Bitmap”表项,单击右边的“导入”按钮,在弹出的“导入”文件对话框中,定位Duke目录,选中所有Ti.BMP后按“打开”钮,则会自动加入ID为IDB_BITMAPi的位图资源。

VC绘图各种DC之间的区别和用法

VC绘图各种DC之间的区别和用法

VC绘图各种DC之间的区别和⽤法1、设备环境(DC)(1)在Windows中,显⽰⼯作是基于设备环境的。

所谓设备环境(DC)是⼀种Windows数据结构,该结构包含应⽤程序设备输出时所需要的信息。

(2)在使⽤任何绘图函数之前必须建⽴⼀个设备环境对象。

(3)在Visual C++ 6.0的MFC中提供了设备环境类CDC,它封装了绘图所需要的所有函数,其中包括了⼤多数的Windows API中的GDI函数。

2、设备环境类2.1. CDC类(1)CDC类是CObject类的派⽣类,也是所有设备环境类的基类。

CDC类定义了⼀个设备描述对象,并提供了对设备描述对象进⾏操作的成员函数以及对与窗⼝客户区有关的显⽰区进⾏操作的成员函数。

 (2)CDC类提供的成员函数可以⽤于操作设备描述对象、使⽤绘图⼯具、选择图形设备界⾯,以及操作颜⾊和调⾊板,还⽤于取得和设置绘图属性、映射⽅式、视图和窗⼝范围的操作、坐标的转换、区域的使⽤、剪取、画线以及绘制图形和⽂字等操作。

2.2. CPaintDC类(1)CPaintDC类是CDC类的⼀个派⽣类,该类⼀般⽤在响应WM_PAINT消息的函数OnPaint()中。

(2)WM_PAINT消息是当窗⼝的某个区域需要重画时激发的窗⼝消息。

当程序中的消息循环接到WM_PAINT消息时就⾃动调⽤消息处理函数OnPaint(),如果在OnPaint函数内定义了CPaintDC类的对象,通过这个类对象就可以使⽤CDC类的成员函数完成视图客户区中的图形绘制操作。

(3)CPaintDC⽤于响应窗⼝重绘消息(WM_PAINT)时的绘图输出。

CPaintDC在构造函数中调⽤BeginPaint()取得设备上下⽂,在析构函数中调⽤EndPaint()释放设备上下⽂。

EndPaint()除了释放设备上下⽂外,还负责从消息队列中清除WM_PAINT消息。

因此,在处理窗⼝重画时,必须使⽤CPaintDC,否则WM_PAINT消息⽆法从消息队列中清除,将引起不断的窗⼝重画。

MFC中的CDC 绘图(2)

MFC中的CDC 绘图(2)

MFC中的CDC 绘图(2)4.面色(刷)在Windows中,面状图必须用刷(brush)来填充,所以面色是由刷色来确定的。

MFC中的刷类为CBrush(它也是CGDIObject的派生类),刷的创建与使用的步骤与笔的相似。

构造函数有4个:CBrush( ); // 创建一个刷的空对象CBrush( COLORREF crColor ); // 创建颜色为crColor的实心刷CBrush( int nIndex, COLORREF crColor ); // 创建风格由nIndex指定且颜色为crColor的条纹(hatch孵化)刷,其中nIndex可取条纹风格(Hatch Styles)值:符号常量数字常量风格HS_HORIZONTAL 0 水平线HS_VERTICAL 1 垂直线HS_FDIAGONAL 2 正斜线HS_BDIAGONAL 3 反斜线HS_CROSS 4 十字线(正网格)HS_DIAGCROSS 5 斜十字线(斜网格)CBrush( CBitmap* pBitmap ); // 创建位图为pBitmap的图案刷如:pDC->FillRect( &rect, new CBrush( RGB(r, g,b) ) );与构造函数相对应,有多个创建不同类型刷的成员函数:BOOL CreateSolidBrush( COLORREF crColor );BOOL CreateHatchBrush( int nIndex, COLORREF crColor );BOOL CreatePatternBrush( CBitmap* pBitmap );BOOL CreateDIBPatternBrush( HGLOBAL hPackedDIB, UINT nUsage );BOOL CreateDIBPatternBrush( const void* lpPackedDIB, UINT nUsage );BOOL CreateBrushIndirect( const LOGBRUSH* lpLogBrush );BOOL CreateSysColorBrush( int nIndex );预定义的刷对象有BLACK_BRUSH(黑刷)、DKGRAY_BRUSH(暗灰刷)、GRAY_BRUSH(灰刷)、HOLLOW_BRUSH(空刷)、LTGRAY_BRUSH(亮灰刷)、NULL_BRUSH(空刷)、WHITE_BRUSH (白刷)缺省的刷为空刷与笔一样,可以用函数SelectObject或SelectStockObject将自定义的刷或预定义的刷选入DC 中,供绘面状图时使用。

C++_Windows绘图

C++_Windows绘图

5.4.1 与绘图相关的数据类型
2.CRect类和RECT结构 CRect类等同于RECT结构,它用top、left、bottom、 right成员来定义一个矩形区域,RECT的形式是: typedef struct tagRECT { LONG left; LONG top; LONG right; LONG bottom; } RECT;
5.1.2 图形刷新
3.刷新方法 常用的Windows应用程序刷新窗口的方法如下: 在内存中保持一个显示输出的副本,当需要重绘 窗口时,将副本拷贝到相应的窗口中。该方法适 用于刷新位图等复杂图形。 记录曾经发生的事件,在窗口需要刷新时重新调 用窗口执行这个事件。 重新绘制图形,一般对于简单图形常采用重新绘 制图形方法执行刷新。在应用程序中,将图形绘 制处理程序放在消息WM_PAINT的响应模块中, 一旦程序接收到刷新请求即可重绘图形。
GDI是Windows用来管理图形操作的一个与设备 无关的模块。上面提到的Windows的DC也包含在 GDI中,GDI还提供了许多有关图形操作的API函 数,这些函数都与DC有关(DC句柄作为参数之 一)。MFC针对DC提供了CDC类,并且把与DC 有关的图形操作API函数封装进CDC类,作为其 成员函数。针对GDI提供的其他一些实体,如笔、 刷子等绘图工具,MFC均提供了GDI实体类,如 CPen、CBrush类等,这些实体类的抽象基类就 是CGDIObject类。
画笔是用来绘制各种直线和曲线的一种图形工具。 系统默认的画笔具有一个像素宽,风格为实线, 颜色为黑色。系统中共有4种画笔,称为库存画笔。 应用程序可以使用GetStockObject()函数来调用 Windows系统定义的画笔。4种库存画笔分别是 WHITE_PEN、BLACK_PEN、DOC_PEN、 NULL_PEN。用户也可以使用CreatePen()函数创 建出具有各种不同属性的画笔。 画笔的操作包括创建画笔、将画笔选入设备环境 和删除画笔。

C++ CDC画图

C++ CDC画图

CDC继承层次:CObject└CDC定义:CDC类定义的是设备上下文对象的类。

CDC对象提供处理显示器或打印机等设备上下文的成员函数,以及处理与窗口客户区对应的显示上下文的成员。

通过CDC对象的成员函数进行所有的绘图。

类对设备上下文操作提供了成员函数,处理绘图工具。

安全型图形设备接口(GDI)对象收集,以及处理颜色和调色板。

它还为获取和设置绘图属性、映射,处理视点、窗口扩展、转换坐标,处理区域、剪贴、绘制直线及绘制简单椭圆和多边形等形状提供了成员函数。

另外还为绘制文本、处理字体,使用打印机跳转,滚动和播放元文件提供成员函数。

使用CDC对象时要构造它,然后调用与它平等的、使用设备上下文的Windows 函数的成员函数。

注意:Windows 95下所有屏幕坐标限制在16位以内。

因此向CDC成员函数传递的int必须在-32768至32767之间。

为了特定用途,Microsoft基本类库提供了几个CDC派生类。

CPaintDC 包括BeginPaint和EndPaint调用。

CClientDC管理窗口用户区对应的显示上下文。

CWindowDC管理与整个窗口对应的显示上下文,包括它的结构和控件。

CMetaFileDC与带元文件的设备上下文对应。

CDC包含m_hDC和m_hAttribDC两个设备上下文,它们在CDC对象创建时参考同一个设备。

CDC指导所有对m_hDC的输出GDI调用以及对m_hAttribDC的大部分属性GDI调用(GetTextColor是属性调用的例子,而SetTextColor是一个输出调用)。

例如框架使用这两个设备上下文实现CMetaFileDC对象,在从物理设备读取属性期间向元文件发送输出。

打印预览以相同风格在框架中实现。

还可以以相似方法在特殊应用代码中使用这两个设备上下文。

可能多次需要来自m_hDC和m_hAttribDC设备上下文的文本度量信息。

以下几对函数提供了这项功能:使用m_hAttribDC 使用m_hDCGetTextExtent GetOutputTextExtentGetTabbedTextExtent GetOutputTabbedTextExtentGetTextMetrics GetOutputTextMetricsGetCharWidth GetOutputCharWidthCDC类成员数据成员m_hDC CDC对象使用的输出设备上下文m_hAttribDC CDC对象使用的输出属性上下文构造函数CDC 构造一个CDC对象初始化CreateDC 为指定设备创建设备上下文CreateIC 为指定设备创建信息上下文。

利用CDC实现绘图程序v1

利用CDC实现绘图程序v1
设备环境对象用一些默认值创建,可以用它们创建 默认的设备环境。
应用Windows绘制一直线,所需的是一个设备环境 对象的指针和直线坐标,设备环境对象的指针叫做 设备环境句柄(HDC)。
– ::MoveTo(HDC hdc, int x, int y); – ::LineTo(HDC hdc, int x, int y);
–ReleaseDC(pDC);
用户最有可能用通用设备环境来做绘图工作。每 次释放一个通用设备环境时,为它们设置的值都 被丢失。但是,可以用下面两个CDC成员函数保存 和恢复一个设备环境的设置值:
–SaveDC()保存设备环境的当前状态。 –RestoreDC()将设备环境恢复到用SaveDC()保存的状态。
14
3.3画形状
这里的形状是一系列封闭线条。 Rectangle()画一个矩形 Pie()画一个饼状楔形 RoundRect()画一个圆角矩形 Draw3dRect()画一个三维矩形 Polygon()画一个多边形 DrawEdge()画一个矩形的边缘 PolyPolygon()创建一个或多个多边形
因为所有的绘图函数只有一个设备环境,因此,每 个函数可能只使用存储在设备环境中20%的属性。
一个设备环境既可以自身包含一种特定的绘图属性, 也可以指向另一个包含某种特定属性ห้องสมุดไป่ตู้对象。例如, 画一条线的属性(如宽度或颜色)可存储在一个单独 的Pen对象中,而由设备环境指向该对象。
创建这些附加的图形对象,与创建一个窗口对象的 方法一样,先创建MFC类对象,然后调用那个类的 成员函数Create()。附加的图形对象一旦被创建, 需要告诉设备环境运用SelectObject()使用该新对象, SelectObject()只是把设备环境指向新的图形对象。

mfc2019 类库参考手册

mfc2019 类库参考手册

mfc2019 类库参考手册MFC 2019 类库参考手册一、概述MFC(Microsoft Foundation Class)是微软公司为了简化Windows 应用程序开发而开发的类库。

本手册将详细介绍MFC 2019类库的各个模块,包括类的定义、成员函数、属性和示例等内容,为开发人员提供全面且准确的参考。

二、基础类1. CObject类CObject类是MFC类库的基类,所有MFC类都从该类派生。

本节将介绍CObject类的成员函数、构造函数和析构函数。

2. CWnd类CWnd类封装了Windows窗口的操作。

本节将介绍CWnd类的常用成员函数,如Create、ShowWindow和SendMessage等。

3. CWinApp类CWinApp类是一个应用程序对象类,每个MFC应用程序都必须拥有一个CWinApp类的派生类。

本节将介绍CWinApp类的初始化、消息循环和资源管理等功能。

三、窗口和控件类1. CFrameWnd类CFrameWnd类是MFC应用程序的主框架窗口类,它提供了标题栏、菜单、工具栏和状态栏等功能。

本节将介绍CFrameWnd类的创建和布局等操作。

2. CDialog类CDialog类是MFC应用程序中常用的对话框类,用于创建模态或非模态对话框。

本节将介绍CDialog类的创建和消息处理等方法。

3. CButton类CButton类封装了Windows中的按钮控件,提供了按钮的创建、属性设置和消息处理等功能。

本节将介绍CButton类的常用成员函数,如Create、SetCheck和EnableWindow等。

4. CEdit类CEdit类封装了Windows中的编辑框控件,可用于接受用户的输入和显示文本内容。

本节将介绍CEdit类的创建、文本操作和消息处理等方法。

四、绘图和界面类1. CDC类CDC类提供了对设备上下文的封装,用于进行绘图和界面操作。

本节将介绍CDC类的绘图函数,如LineTo、Rectangle和TextOut等。

第8章:利用CDC实现绘图程序

第8章:利用CDC实现绘图程序
CWindowDC允许在显示器的任意位置绘图,坐标原点在整 个窗口的左上角。由于使用CWindowDC可以在整个窗口类绘图, 这给了程序员很大的自由度,但使用不当会带来麻烦。在使用 CWindowDC进行绘图时,一般要调用GetWindowRect函数来获取 整个应用程序窗口区域的大小。
CWindowDC对象的窗口句柄保存在成员变量m_hWnd,为构造 CWindowDC,需将CWnd作为参数传递给构造函数。
Visual C++
2.应用程序架构包含的主要类 该程序主要包含的类有CAboutDlg关于对话框类、 CMainFrame主框架类、CSingleDrawDoc文 档类、CSingleDrawView视图类。
有关绘制功能的实现,一般是在视图类中完成, 因此,这一章的实例都是对视图类 CSingleDrawView的操作。
✓ CPaintDC对象在构造时调用CWnd::BeginPaint函数,并返回 DC用于绘图,在析构时自动调用CWnd::EndPaint函数释放DC。 CPaintDC仅在WM_PAINT消息需要响应时才起作用,通常是 在应用程序的OnPaint响应函数中使用。
8.1.4 续1
Visual C++
在由AppWizard创建的MFC应用程序中,视图类的OnDraw 成员函数是一个处理图形的关键虚函数,它带有一个指向设备环 境对象的指针pDC,MFC的绘图成大多都是通过pDC这个指针来
加以访问的。
下面为CDC类的函数的分类
分类 位图函数 剪裁函数 坐标函数 设备描述表函数
Visual C++
用途 操作位图和像素的函数 定义和操作剪裁设备边界的函数 在物理设备和逻辑设备之间转换的函数 获取有关DC及其属性信息的函数

C++屏幕绘图

C++屏幕绘图

第7 章屏幕绘图及文本显示屏幕是最基本的输出设备,屏幕绘图及文本显示是应用程序最常用的功能,本章讲述VisualC ++中屏幕绘图及文本显示的工作原理及其基本编程方法。

首先介绍GDI与设备描述表,然后介绍CDC类、映射方式等概念,最后介绍基本的绘图函数及文本显示函数的用法。

7.1 GDI与设备描述表Windows 操作系统是一个图形界面的操作系统,为了方便地在屏幕上和打印机上绘制或输出图形与文本,Windows 系统中为用户提供了设备描述表和GDI 函数来实现应用程序与物理设备间的接口。

7.1.1 GDI的基本概念Windows图形设备接口GDI(Graphical Device Interface)是为与设备无关的图形设计的。

所谓设备的无关性,就是操作系统屏蔽了硬件设备的差异,因而设备无关性能使用户编程时无需考虑特殊的硬件设置。

Windows把与绘图工作相关的操作都制作成了函数,GDI提供了用户可以调用的一套用于绘图的函数集。

无论基础硬件如何,同一函数都能够生成相同结果。

例如,调用GDI 函数中的Ellipse函数可以绘制椭圆,调用TextOut函数可以绘制文本,调用Rectangle函数可以绘制矩形等。

除了这些绘图函数之外,GDI还有一套用于绘图的工具(对象),比如画刷、画笔等。

GDI绘图工具的使用在7.4小节中介绍。

文本被看作是图形,这种处理方式虽然在创建文本输出时增加了复杂度,但也增强了灵活性。

可以让原本在文本世界非常困难的工作变得非常轻松。

7.1.2设备描述环境Windows下,有多种输出设备,如各种显示器、打印机、绘图仪等。

由于用来显示图形的实际物理设备的多样性,因此要求程序设计人员具有对所有图形显示设备的编程能力是不现实的。

为了简化应用这些性质不同的设备的访问,实现与设备无关的绘图操作,Windows 提供了一种叫做设备描述表的机制,也称为设备环境DC(Device Context),它是Windows 应用程序与设备驱动程序和输出设备(如打印机、显示器等)之间的接口,用来作为应用程序与控制输出设备的低层之间的通道。

HDC CDC CPaintDC CClientDC CWindowDC 等绘图整理 透明画刷

HDC CDC CPaintDC CClientDC CWindowDC 等绘图整理 透明画刷

DC:device context 设备上下文主要就是指绘图设备HDC:设备上下文句柄属于windows平台SDK 即API中用于绘图数据类型CDC:class of device-context objects 设备上下文类属于MFC封装Windows API生成的(其实就是封装了HDC) 给用户在MFC下绘图类从MSDN Hierarchy Chart可以看到MFC 下CWnd 与CDC (这里顺便说下CWnd)MFC 把窗口相关的封装到CWnd中CWnd它派生于CCmdTarget类是最基本的GUI(图形用户接口)对象作图相关的封装到CDC中 CDC它直接派生于CObjectCDC 下又派生出ClientDC CMetaFileDC CPaintDC CWindowDC以下举例:CPaintDC 用于响应窗口重绘消息(WM_PAINT)是的绘图输出。

CPaintDC在构造函数中调用BeginPaint()取得设备上下文,在析构函数中调用EndPaint()释放设备上下文。

EndPaint()除了释放设备上下文外,还负责从消息队列中清除WM_PAINT消息。

因此,在处理窗口重画时,必须使用CPaintDC,否则WM_PAINT 消息无法从消息队列中清除,将引起不断的窗口重画。

CPaintDC也只能用在WM_PAINT消息处理之中。

所以,CPaintDC和CClientDC、CWindowDC从应用角度来看两回事情,不能拿在一起比较!!CDC类及其子类---CClientDC、CWindowDC和CPaintDC/ccfboy/archive/2009/05/02/4142943.aspxCDC类Windows使用与设备无关的图形设备环境(DC :Device Context) 进行显示。

MFC基础类库定义了设备环境对象类----CDC类。

父类:从CObject 直接继承而来。

继承了CObject类的各种特性,如动态创建等等。

第4章 GDI函数

第4章  GDI函数

4.1 设备环境类
• 本节将介绍设备环境类:CClientDC类和 CWindowsDC类,以及CDC对象及其派生类的构造和 析构。
4.1.1 CDC类及其派生类简介
• Windows应用程序通过为指定的设备(屏幕,打印机等)创 建一个设备描述表(Device Context, DC),并在DC表示 的逻辑意义的“画布”上进行图形的绘制。DC是一种包含 设备信息的数据结构,它包含了物理设备所需的各种状态 信息。Win32程序在绘制图形之前需要获取DC的句柄HDC (Handler DC),并在不继续使用时释放掉。通过CDC的成 员函数可进行一切绘图操作。CDC提供成员函数进行设备描 述表的基本操作,使用绘图工具, 选择类型安全的图形设 备结构(GDI),以及色彩,调色板。除此之外还提供成员 函数获取和设置绘图属性,映射,控制窗口,窗体范围, 转换坐标,区域操作,裁减,划线以及绘制简单图形(椭 圆,多边形等)。成员函数也提供绘制文本,设置字体, 打印机换码,滚动, 处理元文件。
而在大型软件应用中很多软件特别是服务器端软件运行的时间是很长的因此如果出现内存泄漏问题操作系统也无法中途回收在反复的内存泄漏过程中如循环语句内的内存泄漏或多次执行到内存泄漏的代码段系统可用的逻辑内存将逐步被消耗光从而影响整个系统的运行效率
第4章 GDI函数
• 如前文所述,作为Windows程序设计,界面的方便和美观是 前提。Win32 SDK提供了丰富的GDI函数,而MFC则将这些函 数都封装起来,让本来功能强大但不好用的SDK函数变得方 便使用。GDI函数涉及的主要是两个方面:文字和图像,本 章就是基于这两种处理对象来讲解GDI函数的使用。 • 本章涉及的知识点有: • 设备环境类:读者可以了解CClientDC类和CWindowsDC类的 基本概念以及CDC类及其派生类行为的原理。 • 字体的选择和显示:读者可以学到Windows程序设计中的字 体的程序设计。 • 图像编程:读者可以学到位图等理论知识,并使用MFC封装 的图像处理类对位图进行处理。 • 常用的GDI函数:读者可以学会各种常用的GDI函数的使用。

CDC::SelectObject函数

CDC::SelectObject函数

CDC::SelectObject函数SelectObjectVB声明Declare Function SelectObject Lib "gdi32" Alias "SelectObject" (ByVal hdc As Long, ByVal hObject As Long) As Long说明每个设备场景都可能有选⼊其中的图形对象。

其中包括位图、刷⼦、字体、画笔以及区域等等。

⼀次选⼊设备场景的只能有⼀个对象。

选定的对象会在设备场景的绘图操作中使⽤。

例如,当前选定的画笔决定了在设备场景中描绘的线段颜⾊及样式返回值Long,与以前选⼊设备场景的相同hObject类型的⼀个对象的句柄,零表⽰出错。

如选定的对象是⼀个区域(Region),结果就是下列常数之⼀:SIMPLEREGION, COMPLEXREGION 或 NULLREGION 对区域进⾏描述,GDI_ERROR 表⽰出错参数表参数类型及说明hdcLong,⼀个设备场景的句柄hObjectLong,⼀个画笔、位图、刷⼦、字体或区域的句柄注解返回值通常⽤于获得选⼊DC的对象的原始值。

绘图操作完成后,原始的对象通常选回设备场景。

在清除⼀个设备场景前,务必注意恢复原始的对象CDC::SelectObjectCPen* SelectObject (CPen* pPen);CBrush* SelectObject(CBrush* pBrush);virtual CFont* SelectObject(CFont* pFont);CBitmap* SelectObject(CBitmap* pBitmap);int SelectObject (CRgn* pRgn);返回值:返回被替代的对象的指针。

是由⼀个CGdiObject类派⽣出的对象的指针,如CPen ,它取决于使⽤函数的版本。

如果出错,则返回NULL。

CDC类及绘图函数

CDC类及绘图函数

首页 »软件开发 » VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)VS2010/MFC编程入门之四十九(图形图像:CDC类及其屏幕绘图函数)分类标签: 编程入门VS2010VC++MFC上一节中鸡啄米讲了文本输出的知识,本节的主要内容是CDC类及其屏幕绘图函数。

CDC类简介CDC类是一个设备上下文类。

CDC类提供了用来处理显示器或打印机等设备上下文的成员函数,还有处理与窗口客户区关联的显示上下文的成员函数。

使用CDC的成员函数可以进行所有的绘图操作,包括处理绘图工具、GDI对象的选择、颜色和调色板的处理、获取和设置绘图属性、映射、窗口范围、坐标转换、剪切以及绘制直线、简单图形、椭圆和多边形等,另外它还为文本输出、处理字体、使用打印机跳转和滚动等提供了成员函数。

如上所述,CDC类几乎封装了所有的Windows GDI函数,另外,MFC中还有几个由CDC类派生的子类,包括CWindowDC、CPaintDC、CClientDC、CMetaFileDC,它们用来进行一些特定的绘图操作。

一般我们在使用完CDC对象后要记得删除它,否则会有内存泄露。

很多情况下我们可以调用CWnd::GetDC()函数来获取设备上下文指针,即CDC指针,这个时候记得用完后调用CWnd::ReleaseDC()函数释放设备上下文。

CDC类的屏幕绘图成员函数CDC类有很多成员函数,鸡啄米在这里只大概讲下比较常用的绘图函数,包括绘制点、直线、矩形、椭圆、多边形、文本以及位图等的成员函数。

COLORREF SetPixel(int x,int y,COLORREF crColor);COLORREF SetPixel(POINT point,COLORREF crColor);上面两个成员函数用来将指定坐标点的像素设置为指定的颜色,这样就实现了画点功能。

参数x为点的逻辑x坐标;参数y为点的逻辑y坐标;参数crColor为要为点设置的颜色;参数point指定点的逻辑x坐标和逻辑y坐标,可以为其传入POINT结构体变量或者CPoint对象。

GDI DC等简介

GDI DC等简介

/* Bitmap Header Definition */定义了BITMAP位图结构
/* Mapping Modes */定义了DC中的坐标映射方式,包括以下常用函数:
SetMapMode、SetViewportExtEx、SetViewportOrgEx、 SetWindowExtEx 、SetWindowOrgEx。
函数原型为:WINUSERAPI HDC WINAPI BeginPaint( HWND hWnd,LPPAINTSTRUCT lpPaint);
//以下为Win API示例::BeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint);
case WM_PAINT://窗口客户区需要重绘
::EndPaint(hWnd,&ps);
return 0;
}
MFC对BeginPaint进行了封装:
CWnd::BeginPaint,CDC* BeginPaint( LPPAINTSTRUCT lpPaint ); 等价于
::BeginPaint(CWnd::m_hWnd, LPPAINTSTRUCT lpPaint);
从根本上来说,DC它是Windows内部使用的数据结构,它存储着向设备输出时说需要的信息,应用程序利用它定义图形对象及其属性,并实现应用程序、设备驱动程序和输出设备之间绘图命令的转换。要想调用GDI函数向某个区域输出文字或绘制图形,必须先取得或建立设备环境句柄,应用程序每一次绘图操作均按照设备环境中的设置的绘图属性进行。
CWindowDC类成员:
Construction CWindowDC:构造一个CWindowDC对象
Data Members m_hWnd:与这个CWindowDC相关联的HWND句柄

CDC类详解

CDC类详解

CDCCObject└CDCCDC类定义得就是设备上下文对象得类。

CDC对象提供处理显示器或打印机等设备上下文得成员函数,以及处理与窗口客户区对应得显示上下文得成员。

通过CDC对象得成员函数进行所有得绘图。

类对设备上下文操作提供了成员函数,处理绘图工具。

安全型图形设备接口(GDI)对象收集,以及处理颜色与调色板。

它还为获取与设置绘图属性、映射,处理视点、窗口扩展、转换坐标,处理区域、剪贴、绘制直线及绘制简单椭圆与多边形等形状提供了成员函数。

另外还为绘制文本、处理字体,使用打印机跳转,滚动与播放元文件提供成员函数。

使用CDC对象时要构造它,然后调用与它平等得、使用设备上下文得Windows函数得成员函数。

注意:Windows 95下所有屏幕坐标限制在16位以内。

因此向CDC成员函数传递得int必须在-32768至32767之间。

CDC包含m_hDC与m_hAttribDC两个设备上下文,它们在CDC对象创建时参考同一个设备。

CDC指导所有对m_hDC得输出GDI调用以及对m_hAttribDC得大部分属性GDI调用(GetTextColor就是属性调用得例子,而SetTextColor就是一个输出调用)。

例如框架使用这两个设备上下文实现CMetaFileDC对象,在从物理设备读取属性期间向元文件发送输出。

打印预览以相同风格在框架中实现。

还可以以相似方法在特殊应用代码中使用这两个设备上下文。

可能多次需要来自m_hDC与m_hAttribDC设备上下文得文本度量信息。

以下几对函数提供了这项功能:jwZwNFY。

l8SuPrF。

NGAzWSc。

CDC类成员安全型选择帮助器简单绘图函数元文件函数* CClientDC子类1、 CClientDC类只能在客户区绘图;2、所谓客户区指窗口区域中去掉边框、标题栏、菜单栏、工具栏、状态栏等之外得部分,它就是用户可以操作得区域;3、在使用CClientDC进行绘图时,一般要调用GetClientRect()函数来获取客户区域得大小;4、 CClientDC类在构造函数中调用Windows API函数GetDC(),在析构时响应ReleaseDC();5、 CClientDC类得窗口句柄保存在成员变量m_hWnd,为构造CClientDC,需将CWnd作为参数传递给构造函数。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CDC类的主要绘图成员函数CDC类中常用绘图函数1)绘制像素函数原型:COLORREF SetPixel(int x,int y,COLORREF crColor );设置某像素点的RGB值2)获取像素颜色函数原型:COLORREF GetPixel(int x,int y)const;返回值:指定像素的RGB值。

参数说明:得到指定像素的RGB颜色值一、画笔函数画笔是用来绘制直线、曲线或图形的边界线,是绘图工具类之一画笔通常具有线型、宽度和颜色三种属性画笔的线型通常有实线、虚线、点线、点划线、双点划线、不可见线和内框架线7种,这些线型都是以PS_为前缀的预定义标识符默认的画笔是一个像素单位的黑色实线要想更换画笔,可以在创建新画笔对象后,将其选入设备上下文,就可使用新画笔进行绘图。

1)创建画笔函数原型:BOOL CreatePen(int nPenStyle,int nWidth,COLORREF crColor);返回值:非零。

参数说明:第一个参数nPenStyle是画笔的风格代码第二个参数nWidth是画笔的宽度第三个参数crColor是画笔的颜色。

PS_SOLID;实线;宽度任意指定PS_DASH;虚线;宽度1(不可任意指定)PS_DOT;点线;宽度1(不可任意指定)PS_DASHDOT;点划线;宽度1(不可任意指定)PS_DASHDOTDOT;双点画线;宽度1(不可任意指定)PS_NULL;不可见线;宽度1(不可任意指定)PS_INSIDEFRAME;内框架线;宽度任意指定2)选择画笔函数原型:Cpen *SelectObject(Cpen *pPen);返回值:被替代画笔的指针。

参数说明:参数pPen是Cpen类的被选中的新画笔对象指针。

本函数把原画笔换成新画笔,同时返回指向原画笔的指针。

3)删除画笔函数原型:BOOL DeleteObject( );返回值:非零。

参数说明:画笔使用完毕,把已成自由状态的画笔从系统内存中清除。

4)选择一支库画笔函数原型:virtual CGdiObject *SelectStockObject(int nIndex);返回值:被替代的CGdiObject类对象的指针。

参数说明:参数nIndex是库笔代码Windows系统中准备了一些使用频率较高的画笔,不需要创建,可以直接选用。

同样,使用完库画笔时也不需要调用DeleteObject()函数从内存中删除已使用过的画笔。

三种常用库笔:BLACK_PEN宽度为1的黑笔实线笔;WHITE_PEN宽度为1的白笔实线笔;NULL_PEN透明笔二、画刷函数(图形内部进行填充)1)创建实体画刷函数BOOL CreateSolidBrush(COLORREF crColor );选择画刷函数2)CBrush *SelectObject(CBrush *pBrush );删除画刷函数3)BOOL DeleteObject( );创建阴影画刷函数4)BOOL CreateHatchBrush(int nIndex,COLORREF crColor);第一个参数nIndex是阴影样式代码第二个参数crColor是阴影线的颜色5)选择一只库画刷函数virtual CGdiObject *SelectStockObject(int nIndex);参数:LTGRAY_BRUSH:亮灰色画刷;BLACK_BRUSH黑色画刷;NULL_BRUSH:空画刷(相当于HOLLOW_BRUSH);WHITE_BRUSH:白色画刷;DKGRAY_BRUSH 深灰色画刷;GRAY_BRUSH灰色画刷;HOLLOW_BRUSH 中空画刷三、绘制矩形函数原型:BOOL Rectangle(int x1,int y1,int x2,int y2);返回值:非零。

参数说明:该函数使用当前画刷填充矩形内部,并用当前画笔绘制矩形边界线。

CPen MyPen,* OldPen;MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255));OldPen=pDC->SelectObject(&MyPen);CBrush MyBrush,*OldBrush;MyBrush.CreateSolidBrush(RGB(255,0,0));OldBrush=pDC->SelectObject(&MyBrush);pDC->Rectangle(100,100,600,300);//画矩形pDC->SelectObject(OldPen); //画框线为蓝色MyPen.DeleteObject();pDC->SelectObject(OldBrush); //填充为红色MyBrush.DeleteObject();坐标映射:MM_TEXT 每个逻辑单位等于一个设备像素,x向右为正,y向下为正MM_HIENGLISH 每个逻辑单位为0.001英寸,x向右为正,y向上为正MM_LOENGLISH 每个逻辑单位为0.01英寸,x向右为正,y向上为正MM_HIMETRIC 每个逻辑单位为0.01mm,x向右为正,y向上为正MM_LOMETRIC 每个逻辑单位为0.1mm,x向右为正,y向上为正MM_TWIPS每个逻辑单位为一个点的1/20(一个点是1/72英寸),x向右为正,y向上为正MM_ANISOTRPIC x,y 可变比例MM_ISOTROPIC x,y 等比例我们就可以通过调用CDC::SetMapMode(int nMapMode)来设置相应的映射模式。

例如:若将映射模式设置为MM_LOMETRIC,那么不管在什么设备中调用上述语句,都将显示出20*20mm的方块。

而MM_ISOTROPIC 映射模式下:纵横比总是1:1,也就是说,无论比例因子如何变化,圆总是圆的。

但,MM_ANISOTROPIC 映射模式下,x和y的比例因子可以独立地变化,即圆可以被拉扁成椭圆形状。

在映射模式MM_ANISOTROPIC 和MM_ISOTROPIC中,常常可以调用CDC::SetWindowExt(设置窗口大小)和CDC::SetViewportExt(设置视口大小)函数来设置所需要的比例因子。

“窗口”和“视口”的概念往往不易理解。

所谓“窗口”,可以理解是一种逻辑坐标下的窗口,而“视口”是我们实际看到的那个窗口,也就是设备坐标下的窗口,根据“窗口”和“视口”的大小就可以确定x和y的比例因子,它们的关系如下:x比例因子=视口x大小/窗口x大小y比例因子=视口y大小/窗口y大小四、绘制椭圆函数原型:BOOL Ellipse(int x1,int y1,int x2,int y2);返回值:非零。

参数说明:Ellipse函数中,参数x1,y1是限定椭圆范围的外接矩形左上角点的坐标;参数x2,y2是限定椭圆范围的外接矩形右下角点的坐标注意VC++中没有专门的画圆函数,只是把圆绘制为长半轴和短半轴相等的椭圆。

Ellipse函数使用当前画刷填充椭圆内部,并用当前画笔绘制椭圆边界线。

例将一个圆绘制在视区中央,圆的形状依据视区形状而定。

当窗口的形状发生改变时,圆的形状也随之改变。

坐标系的中点位于屏幕中心,X轴向右,Y轴向上。

圆的边界为一像素宽的蓝色边界线,内部填充为红色。

CRect Rect; //定义矩形对象GetClientRect(&Rect); //获得当前窗口的客户区大小pDC->SetMapMode(MM_ANISOTROPIC); //设置MM_ANISOTROPIC映射模式pDC->SetWindowExt(Rect.Width(),-Rect.Height()); //设置窗口范围pDC->SetViewportExt(Rect.right,-Rect.bottom); //设置视区范围pDC->SetViewportOrg(Rect.right/2,Rect.bottom/2); //设置视口原点CPen MyPen,*OldPen;MyPen.CreatePen(PS_SOLID,1,RGB(0,0,255));OldPen=pDC->SelectObject(&MyPen);CBrush MyBrush,*OldBrush;MyBrush.CreateSolidBrush(RGB(255,0,0));OldBrush=pDC->SelectObject(&MyBrush);pDC->Ellipse(-Rect.right/2, -Rect.bottom/2,Rect.right/2,Rect.bottom/2);pDC->SelectObject(OldPen); //蓝边MyPen.DeleteObject();pDC->SelectObject(OldBrush); //填充红色MyBrush.DeleteObject();五、绘制多边形函数BOOL Polygon(LPPOINT lpPoints,int nCount);参数说明:第一个参数lpPoints指定多边形顶点数组中每一个顶点是一个POINT结构或CPoint对象第二个参数nCount指定多边形数组中的顶点个数该函数用当前画笔绘制多边形边界线,用当前画刷填充多边形内部。

例绘制四个顶点分别位于视区上部中点、右部中点、下部中点和左部中点的菱形。

边界线为蓝色,内部用红色填充CRect Rect;GetClientRect(&Rect); //获得客户区CPen PenBlue(PS_SOLID, 5, RGB(0, 0, 255)); //定义粗蓝色画笔,绘制边界线CPen* OldPen=pDC->SelectObject(&PenBlue); //选取画笔CBrush BrushRed(RGB(255, 0, 0)); //定义红色画刷,填充多边形内部CBrush* OldBrush = pDC->SelectObject(&BrushRed); //选取画刷CPoint p[4]; //定义多边形顶点数组p[0].x=Rect.left+Rect.Width()/2;p[0].y=Rect.top; //计算顶部中点p[1].x=Rect.right;p[1].y=Rect.top+Rect.Height()/2; //计算右部中点p[2].x=p[0].x;p[2].y=Rect.bottom; //计算下部中点p[3].x=Rect.left;p[3].y=p[1].y; //计算左部中点pDC->Polygon(p, 4);//绘制多边形pDC->SelectObject(OldPen);//画笔勾边pDC->SelectObject(OldBrush);//画刷填充六、填充函数void FillRect(LPCRECT lpRect,CBrush *pBrush);参数说明:第一个参数lpRect指定矩形,是一个Rect结构或CRect对象第二个参数pBrush指定画刷对象指针。

相关文档
最新文档