常用GDI函数(1):绘制线条和图形

1、

CDC::SetPixel()用来绘制一个像素点。

使用Win32 API函数:

    HDC hdc = ::GetDC(m_hWnd);//获得窗口的设备描述表

    ::SetPixel(hdc, 100, 200, RGB(255, 0, 0));

    ::ReleaseDC(m_hWnd, hdc);//释放DC资源

CDC::MoveTo(),CDC::LineTo()用来绘制直线。

使用CDC类:

    CDC* pDC = GetDC();//获得与当前窗口相关联的DC对象  

    pDC->MoveTo(ptOrigin);
    pDC->LineTo(ptEnd);  

    ReleaseDC(pDC);//释放DC资源  

使用CClientDC类:

    CClientDC dc(this);//获得与窗口相关联的DC对象  

    CBrush brush(RGB(255, 0, 0));
    CBrush* pOldBrush = dc.SelectObject(&brush);

    CRect rect(0, 0, 100, 100);
    dc.Rectangle(&rect);

    dc.SelectObject(pOldBrush);

CDC::Rectangle()会使用DC中画刷(默认为白色画刷)来绘制一个带边框的矩形,如果想要改变矩形里的颜色则应该调用CDC::SelectObject()函数将指定颜色的画刷选入到DC中。

CDC::SelectObject()用来将指定的GDI对象(画笔CPen、画刷CBrush、字体CFont、位图CBitmap、调色板CPalette等)选入到DC中,其返回DC中被替换的GDI对象,应该保存该返回的对象用来还原。

如果想要画刷的颜色为透明色,即矩形为透明,则应该将系统空画刷选入到DC中:

    HBRUSH hNull_Brush = (HBRUSH)GetStockObject(NULL_BRUSH);
    CBrush *pBrush = CBrush::FromHandle(hNull_Brush);
    CBrush* pOldBrush = dc.SelectObject(pBrush);

    CRect rect(0, 0, 100, 100);
    dc.Rectangle(&rect);

    dc.SelectObject(pOldBrush);

GetStockObject(int i)可以获得系统标准GDI对象,常用参数有:

NULL_BRUSH 空画刷

ANSI_FIXED_FONT 固定间距(等宽)系统字体

ANSI_VAR_FONT 变间距(比例间距)系统字体;

OEM_FIXED_FONT 原始设备制造商固定间距字体

SYSTEM_FONT 系统字体

DEFAULT_PALETTE 缺省调色板

由于GetStockObject()返回的是HGDIOBJ类型的GDI对象句柄,所以我们应该将其强制转换成具体的HBRUSH或HFONT或HPALETTE,而CDC::SelectObject()的参数类型为GDI对象指针,所以需要由GDI句柄获得GDI对象指针。

CBrush::FromHandle()可以由画刷句柄获得画刷对象的指针,它是一个静态成员函数。同理,对于CPen、CFont、CBitmap、CPalette也可以调用其静态函数由句柄获得对应的指针。

CDC::FillRect()使用指定的画刷绘制一个不带边框的矩形:

    CClientDC dc(this);//获得与窗口相关联的DC对象  

    CBrush brush(RGB(255, 0, 0));
    CRect rect(0, 0, 100, 100);
    dc.FillRect(&rect, &brush);

还可以使用位图画刷来绘制一个矩形区域:使用一个位图来初始化位图画刷,再用这个位图来填充矩形区域

    CClientDC dc(this);

    CBitmap bitmap;
    bitmap.LoadBitmapW(IDB_BITMAP1);//初始化位图对象
    CBrush brush(&bitmap);//构造位图画刷

    CRect rect(0, 0, 100, 100);
    dc.FillRect(&rect, &brush);

使用CPaintDC类

CDC::Ellipse()使用DC中画刷(默认为白色画刷)来绘制一个圆形或椭圆,如果想要改变矩形里的颜色则应该调用CDC::SelectObject()函数将指定颜色的画刷选入到DC中:

    CPaintDC dc(this); 

    CBrush *pBrush = CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));//获得透明画刷
    CBrush *pOldBrush = dc.SelectObject(pBrush);//将透明画刷选入到设备描述表中  

    CRect rect(0, 0, 100, 100);
    dc.Ellipse(&rect);//绘制一个圆型  

    dc.SelectObject(pOldBrush);//还原设备描述表 

使用CWindowDC类

如果想要自定义MoveTo()、LineTo()、Rectangle()、Ellipse()绘制的线条的颜色、粗细、类型(实线PS_SOLID、虚线PS_DASH、点线PS_DOT)则需要将指定的画笔对象选入到当前设备描述表中。需要注意的是虚线、点线的宽度不能大于1。

    CWindowDC dc(this);

    CPen pen(PS_DOT, 1, RGB(255,0,0));//创建一个虚线线条,宽度为1,红色的画笔对象
    CPen* pOldPen = dc.SelectObject(&pen);//将画笔对象选入到设备描述表中  

    dc.MoveTo(100, 0);
    dc.LineTo(100, 200);  

    dc.SelectObject(pOldPen);//恢复设备描述表 

GetDesktopWindow()函数可以获得桌面窗口的句柄,所以就可以在当前屏幕上画图:

    CWindowDC dc(GetDesktopWindow());//获得与当前桌面窗口相关联的CWindowDC对象

    dc.MoveTo(100, 100);
    dc.LineTo(100, 800); 

2、

Windows中显示是基于设备环境(DC)的,在使用GDI函数之前必须先创建一个DC对象,MFC的设备环境类CDC封装了绘图所需要的所有函数。CClientDC、CWindowDC、CPaintDC都是从CDC类派生而来。还有一个CMetaFileDC类,它对图像的保存比像素更精确,因而往往在要求较高的场合下使用,例如AutoCAD的图形保存等。

从上面来看,如果使用Win32 SDK来绘图的话需要调用GetDC()(WM_PAINT消息响应代码块中为BeginPaint)获得指定窗口的DC句柄,绘制结束后还要调用ReleaseDC()(EndPaint())来释放DC资源。如果使用MFC的DC对象则方便了很多,而且资源释放在DC对象的析构函数中自动执行。

CClientDC获得的是窗口客户区的DC,所以只能在客户区画图,其原点坐标为客户区左上角;CWindowDC获得的是整个窗口的DC,包括标题栏、边框等,其原点坐标也是整个窗口的左上角;CPaintDC只用在窗口重绘消息响应函数中;

3、

CDC::SetROP2(int nDrawMode)用来设置画笔绘画的模式,其参数可以为R2_NOTXORPEN、R2_NOT等绘图模式。R2_NOTXORPEN绘图模式就是先把画笔颜色与屏幕颜色异或,异或之后再取反最后得到一个颜色值显示在屏幕上,而这种做法就会产生一个效果:比如用画笔画了一条线,然后再用画笔画这条线就会擦除原来画的线。R2_NOT绘画模式同样有在同一个地方画两次相当于什么都没画的功能,不过R2_NOT绘画模式第一次画的时候显示颜色并不是你选定的画笔颜色,而是系统默认画笔颜色。

4、

CPen是画笔类,用来在DC上完成绘制线条的任务,常用的构造函数:

CPen(Int style,int width ,COLORREF color);

style:画笔样式,可以为以下样式:

PS_SOLID 实线

PS_DASH 虚线,该值只有当画笔宽度等于1个设备单位或更小时才有效

PS_DOT 点线,该值只有当画笔宽度等于1个设备单位或更小时才有效

PS_DASHDOT 点和虚线交替,该值只有当画笔宽度等于1个设备单位或更小时才有效

PS_DASHDOTDOT 双点线和虚线交替,该值只有当画笔宽度等于1个设备单位或更小时才有效

PS_NULL 空画笔

PS_GEOMETRIC 几何画笔

.......

width:画笔宽度。

color:画笔颜色。

如果CPen在定义的时候没有被初始化,那么在使用之前应该调用其以下的初始化函数来进行初始化。

CreatePen()用指定的样式、宽度、颜色初始化画笔。

CreatePenIndirect()用结构LOGPEN 中指定的风格初始化画笔。

CBrush为画刷类,画刷通常用来填充一块区域,常用的构造函数:

CBrush( COLORREF crColor ); //普通画刷

CBrush( int nIndex, COLORREF crColor ); //阴影线画刷

CBrush( CBitmap* pBitmap ); //位图画刷

crColor:画刷或阴影线的颜色

nIndex:阴影线的风格,有以下风格可选:

HS_HORIZONTAL 水平的阴影线
            HS_VERTICAL 垂直的阴影线
            HS_CROSS 水平和垂直方向以网格线作出阴影
            HS_BDIAGONAL 45度的向下影线(从左到右)
            HS_FDIAGONAL 45度的向上阴影线(从左到右)
            HS_DIAGCROSS 45度的网格线阴影

同CPen一样,如果CBrush在定义的时候没有被初始化,那么在使用之前应该调用其以下的初始化函数来进行初始化:

CreateSolidBrush() 用指定的颜色初始化画刷。
 CreateHatchBrush() 用指定的阴影线初始化画刷。
 CreateBrushIndirect() 用结构LOGBRUSH中指定的风格、颜色和模式初始化画刷。
 CreatePatternBrush() 用位图指定的模式初始化画刷。
 CreateDIBPatternBrush() 用独立于设备的位图(DIB)初始化画刷。
 CreateSysColorBrush() 创建一个使用系统缺省颜色的画刷。

5、

CDC::FrameRect(LPCRECT lpRect, CBrush* pBrush)用来绘制一个矩形的边框,需要注意的是其参数指向的画刷必须是使用CreateSolidBrush()、CreateHatchBrush()或CreatePattemBrush()所初始化或GetStockObject()获得的。

CDC::Polyline(const POINT* lpPoints, int nCount)用来绘制一系列线段,即折线,lpPoints是指向要连结的那些点的数组的指针,nCount为点的个数。如果nCount为2的话其相当于MoveTo()和LineTo()绘制一条直线。

CDC::Arc()绘制弧线。

CDC::RoundRect()绘制一个带圆角的矩形,即矩形的四个角是弧形的。

CDC::Invertrect()通过对矩形内部的像素点进行逻辑NOT操作而将窗口中的矩形反转。比如它会将将白色像素变为黑色,将黑色像素变为白色,对同一块矩形调用两次InvertRect()相当于什么也没做。

CDC::Polygon()用来绘制多边形。

时间: 2024-09-27 15:38:48

常用GDI函数(1):绘制线条和图形的相关文章

常用GDI函数(2):绘制文本

1.TextOut()和DrawText()函数 CDC::TextOut()使用当前字体在窗口的指定位置处输出文本,函数声明: virtual BOOL TextOut(int x, int y, LPCTSTR lpszString, int nCount); BOOL TextOut(int x, int y, const CString& str); CPaintDC dc(this); dc.TextOut(0, 100, _T("hello word"), 5);

C# winform如何清除由Graphics类绘制出来的所有线条或图形

在C#winform应用程序中,可以用GDI绘制出线条或图形. 1.在主窗体上绘制线条或图形 using (Graphics g = this.CreateGraphics())      {            g.DrawLine(Pens.Blue, new Point(10, 10), new Point(100, 100));      } 2.在指定的容器上绘制线条或图形,如在panel1上绘制 using (Graphics g = this.panel1.CreateGraph

HTML5 Canvas 学习笔记(canvas绘制线条、矩形、多边形、圆形、圆环、组合图形、文字、自定义图像)

学习资源:http://www.w3school.com.cn/html5/html_5_canvas.asp   http://blog.csdn.net/clh604/article/details/8536059   http://www.jb51.net/html5/70307.html 一.对 canvas 的理解 <canvas>标签是 HTML5 中的新标签,像所有的 dom 对象一样它有自己本身的属性.方法和事件. canvas 是用来在网页上绘制图形的(我们通常称之为画布),

GDI+入门——带你走进Windows图形的世界

一.GDI+基础 1.GDI+简介 GDI+是微软的新一代二维图形系统,它完全面向对象,要在Windows窗体中显示字体或绘制图形必须要使用GDI+.GDI+提供了多种画笔.画刷.图像等图形对象,此外还包括一些新的绘图功能,比如渐变.除锯齿.纹理等. GDI+包括三部分:二维矢量图形的绘制.图像处理和文字显示.GDI+使用的各种类大都包含在命名空间system::Drawing中. 2.常用的数据结构 在使用GDI+显示文字和绘制图形时,需要用到一些数据结构,例如Size.Point.Recta

HTML5 canvas 绘制精美的图形

HTML5 是一个新兴标准,它正在以越来越快的速度替代久经考验的 HTML4.HTML5 是一个 W3C “工作草案” — 意味着它仍然处于开发阶段 — 它包含丰富的元素和属性,它们都支持现行的 HTML 4.01 版本规范.它还引入了几个新元素和属性,它们适用许多使用 web 页面的领域 — 音频.视频.图形.数据存储.内容呈现,等等.本文主要关注图形方面的增强:canvas. 新的 HTML5 canvas 是一个原生 HTML 绘图簿,用于 JavaScript 代码,不使用第三方工具.跨

canvas详解----绘制线条

<!DOCTYPE html> <html> <head> <title>canvas详解</title> </head> <body> <canvas id="canvas" width="1024" height="768" style="border:1px solid #aaa;display:block;margin:50 auto;&q

Delphi 常用API 函数

Delphi 常用API 函数 AdjustWindowRect 给定一种窗口样式,计算获得目标客户区矩形所需的窗口大小 AnyPopup 判断屏幕上是否存在任何弹出式窗口 ArrangeIconicWindows 排列一个父窗口的最小化子窗口 AttachThreadInput 连接线程输入函数 BeginDeferWindowPos 启动构建一系列新窗口位置的过程 BringWindowToTop 将指定的窗口带至窗口列表顶部 CascadeWindows 以层叠方式排列窗口 ChildWi

?canvas绘制线条详解

<!DOCTYPE html> <html> <head> <title>canvas详解</title> </head> <body> <canvas id="canvas" width="1024" height="768" style="border:1px solid #aaa;display:block;margin:50 auto;&q

Canvas绘制线条模糊的解决方案

前段时间,做一个跨平台app项目,需要绘制分时图和K线图.找了很多开源的js的图表库,包括echarts.highcharts等等,都不是很满意,原因有2: 1.太臃肿,我实际上只要一个分时和一个K线图表,最多搭配几个线形图 2.不满足需求.主要就是分时图,国内玩的js图表库,几乎都没有分时图.都是用1分钟线的收盘价线来做的,和中国股民的使用习惯完全不搭界. 多年前有人开源了一个js绘制股票图形的库,叫做html54stock,图像表现上很符合中国人的使用习惯,但是也有问题: 1.封装不好,很多