Windows SDK(三)GDI图形绘制基础

GDI介绍

GDI:图形设备接口:Windows的子系统,负责在视讯显示器和打印机上显示图形。

GDI常见名词解释:

直线

曲线

填入区域:直线或曲线构成的封闭区域,可以用画刷进行填充

位图:点阵图像

文字

映像模式:不同尺寸绘图的形式

图元:以二进制形式存储的GDI集合

绘图区域:允许绘制任意形状的绘图区域

路径:GDI内部存储直线或曲线的集合

剪裁:剪出不同区域

调色盘:输出设备允许使用颜色的范围

DC:设备上下文缩写,程序里可以进行绘制的部分

HDC:设备上下文句柄,包含有关某个设备(如显示器或打印机)的绘制属性信息的 Windows 数据结构

hDC:DC的句柄,API中的一个类似指针的数据类型,用于表示绘图设备

如图:最外侧是屏幕区域,名称减号叉号等是窗口区域,除此以外是客户区

窗口区左上角是坐标轴x,y等于0的位置,向右向下xy增大

GDI绘图

我们在窗口进行绘制时,需要使用WM_PAINT消息进行绘制

WM_PAINT消息:

产生时间:当窗口需要绘制的时候。

附带信息:wParam : 0,lParam : 0。

专职用法:用于绘图。

case WM_PAINT: 

{

    PAINTSTRUCT ps;

    HDC hdc = BgeinPaint(hWnd, &ps)  填入窗口句柄(hWnd),此处第一种接受窗口句柄的方式

    //HDC hdc2 = GetDC(hWnd); 此处第二种接受窗口句柄的方式

    以下编写我们自定义的代码,也就是正式绘图阶段

    MyPaint(hdc); 此处为自定义绘制窗口的函数

    自定义代码结束,也就是结束绘画阶段

    ReleaseDC(hWnd,hdc2);  释放窗口句柄

}

绘制开始

BOOL MyPaint(HDC hDC){}  此处是绘制窗口的函数,此时可见,该函数并没有被书写

以下我们依次完善这个函数

设置背景板

API:SetBkMode( HDC hdc, int mode );

参数依次:

1.HDC hdc; 当前 DC ( device context ) 的句柄

2.int mode; 要设置的模式,其值可以为 OPAQUE 或 TRANSPARENT

功能:设置指定设备上下文的背景混合模式。

SetBkMode(hDC, TRANSPARENT); 设置透明背景色,不加的话,输出字体的背景一直是白色的

画笔

画笔可以设置绘制线的颜色、线型、线粗。

HPEN作为画笔句柄

画笔的使用流程

1. 创建画笔

2. 将画笔应用到DC中,注意保存原来DC当中画笔

3. 绘图

4. 取出DC中的画笔,将原来的画笔,使用SelectObject函数,放入到设备DC中,就会将我们创建

的画笔取出。

5. 释放画笔

BOOL DeleteObject

(

    HGDIOBJ hObject   GDI绘图对象句柄,画笔句柄

);

只能删除不被DC使用的画笔,所以在释放前,必须将画笔从DC中取出。

设置画笔

画笔用于绘画图像的边框

API:CreatePen(int nPenStyle, int nWidth, COLORREF crColor)

参数依次:

1.nPenStyle:画笔样式

2.nWidth:画笔的宽度

3.crColor:画笔的RGB颜色

功能:指定笔的样式、宽度和颜色创建画笔。

HPEN hBluePen = CreatePen(PS_SOLID, 3, RGB(0, 0, 255)); 创建画笔,并返回句柄

PS_SOILD - 实心线,可以支持多个像素宽其他线型只能是一个像素宽。

画笔的选择

API:SelectObject(HDC hdc, HGDIOBJ hgdiobj);

参数依次:

1.hDC:绘图设备句柄

2.hgdiobj:GDI绘图对象句柄,画笔句柄

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

HGDIOBJ hGdiObj = SelectObject(hDC, hBluePen); 选择画笔,并返回原来的GDI绘图对象句柄

画笔位置初始化

API:MoveToEx( HDC hdc, int X, int Y, LPPOINT lpPoint );

参数依次:

1.hdc:设备上下文句柄。

2.X:新位置的X坐标。

3.Y:新位置的Y坐标。

4.lpPoint:一个指向POINT结构的指针,用来存放上一个点的位置,若此参数为NULL,则不保存

上一个点的位置

功能:将当前绘图位置移动到某个具体的点,同时也可以获得之前位置的坐标

POINT pt = { 0 }; 画笔当前位置的指针

MoveToEx(hDC, 100, 100, &pt); 移动画笔到起点

线条的绘画

API:LineTo(HDChdc,intX,intY):

参数依次:

1.hdc:设备场景句柄

2.X:线段终点X坐标位置,采用逻辑坐标表示。这个点不会实际画出来;它不属于线段的一部分

3.Y:线段终点Y坐标位置,采用逻辑坐标表示。这个点不会实际画出来;它不属于线段的一部分

功能:用当前画笔画一条线,从当前位置连到一个指定的点。这个函数调用完毕,当前位置变成x,y。

LineTo(hDC, 200, 400); 此函数用于绘制线条

画笔矩形的绘画

API:Rectangle(int left, int top, int right, int bottom);

参数依次:

1.(left ,top )为矩形的左上坐标

2.(right,bottom)为矩形的右下坐标

功能:画一个矩形

Rectangle(hDC, 150, 100, 300, 200); 此函数绘制矩形

画刷

画刷 用于将封闭图形填充颜色、图案

HBRUSH - 画刷句柄 

画刷的使用

1 创建画刷

CreateSolidBrush - 创建实心画刷

CreateHatchBrush - 创建纹理画刷

2 将画刷应用到DC中:SelectObject

3 绘图

4 将画刷从DC中取出:SelectObject

5 删除画刷:DeleteObject

画刷初始化

画刷用于填充图像颜色等等,此处介绍两种不同的画刷

API:CreateSolidBrush(COLORREF crColor)

参数:crColor:刷子的颜色

功能:创建一个具有指定颜色的实心刷子

API:CreateHatchBrush((int fnStyle, COLORREF clrref)

参数依次:

1.fnStyle:指定刷子的阴影样式

2.cirref:指定用于阴影的刷子的前景色。

功能:创建一个具有指定阴影模式和颜色的阴影刷子

HBRUSH hSolidBrush = CreateSolidBrush(RGB(0, 0, 255)); 创建实心画刷

HBRUSH hHatchBrush = CreateHatchBrush(HS_DIAGCROSS, RGB(0, 0, 255)); 创建阴影画刷

画刷矩形的绘画

HGDIOBJ hGdiObj2 = SelectObject(hDC, hHatchBrush); 选择阴影画刷

Rectangle(hDC, 150, 100, 300, 200); 绘制矩形,该函数临近原则,最近的hdc选择是哪个就用哪

个,此处是阴影画刷

DeleteObject(hGdiObj2); 使用完毕后,删除选择的工具,此处为阴影画刷

弧线的绘画

弧线输出:设计思路 n个点连成弧线

POINT pi[4] = {

10,120,

180,300,

300,180,

120,10

}; 申请多个点的数组

API:PolyBezier(HDC hdc, CONST POINT *lppt, DWORD cPoints);

参数依次:

1.hdc:指定的设备环境句柄。

2.lppt:POINT结构数组指针,包括了样条端点和控制点的坐标,其顺序是起点的坐标、起点的

控制点的坐标、终点的控制点的坐标和终点的坐标。

3.cPoints:指明数组中的点的个数。

功能:用于画贝赛尔样条曲线

PolyBezier(hDC, pi, 4);  绘画一个贝塞尔曲线

圆的绘画

设计思路:利用一个矩形的对角点,延申出来圆

API:BOOL Arc( HDC hdc, int xLeft, int yTop, int xRight, int yBottom, int XStart, int YStart, int 

XEnd, int YEnd);

参数依次:

1.hdc 绘画的窗口句柄

2.xLeft和nyTopt指定外接矩形左上角坐标

3.xRight和yBottom指定外接矩形右下角坐标

4.xStart和nyStart指定圆弧开始坐标

5.xEnd和nyEnd指定圆弧结束坐标

功能:画一个圆

Arc(hDC, 100, 200, 200, 100, 350, 50, 350, 350); 画一个圆

设置字体颜色

API:SetTextColor(HDC hdc, COLORREF crColor);

参数依次:

1.hdc; 当前DC的句柄

2.crColor; 要设置的颜色,可以使用RGB宏根据红绿蓝分量合成颜色值

SetTextColor(hDC, RGB(0, 0, 255)); 设置字体颜色

绘制普通文本

文本绘制:将文字绘制在指定坐标位置

API:TextOut( HDC hdc,int nXStart, int nYStart, LPCTSTR lpString, int cbString);

参数依次:

1.hdc:设备环境的句柄

2.nXStart:指定用于字符串对齐的基准点的逻辑X坐标。

3.nYStart:指定用于字符串对齐的基准点的逻辑Y坐标。

4.lpString:指向将被绘制字符串的指针。此字符串不必为以\0结束的,因为cbString中指定了字符

串的长度。

5.cbString:指定了字符串的长度。

TextOut(hDC, 100, 100, L"dfsf", wcslen(L"dfsf")); 窗口写字

字体的使用

1 创建字体

2 应用字体到:DCSelectObject

3 绘制文字:DrawText/TextOut

4 取出字体:SelectObject

5 删除字体:DeleteObject

设置高级字体

HFONT hFont = CreateFont(100, 50, 0, 0, 0, 0, 0, 0, GB2312_CHARSET, 0, 0, 0, 0, L"宋体"); 创

建高级文字,参数依次 字体的高度 宽度 剩下填0 字符集即字符编码 剩下填0 本地字体

SetTextColor(hDC, RGB(255, 0, 255)); 设置文字的颜色

选择字体

SelectObject(hDC, hFont); 选择字体

输出文字位置初始化

RECT rect; 定义输入文字的位置

API:SetRect(LPRECT lprc, int xLeft, int yTop, int xRight, int yBottom);

参数依次:

1.lprc:指向RECT 结构的指针,该指针包含了所要设置的矩形。

2.xLeft:指定矩形左上角的X坐标。

3.yTop:指定矩形左上角的Y坐标。

4.xRight:指定矩形右下角的X坐标。

5.yBottom:指定矩形右下角的Y坐标。

功能:设置指定矩形的坐标

SetRect(&rect, 30, 300, 400, 200); 设置文字位置

文字输出

API:DrawText(HDC hDC, LPCTSTR lpString, int nCount, LPRECT lpRect, UINT uFormat );

参数依次:

1.hDC:设备描述表句柄

2.lpString:将要绘制的字符串,如果nCount为-1,则lpString指向的字符串被认为是以\0结束的

3.nCount:字符串的长度,当其为-1时表示该文字多长都可以

4.lpRect:指向矩形结构RECT的指针

5.uFormat:正文的绘制选项

功能:在指定的矩形里写入格式化文本,根据指定的方法对文本格式化

DrawText(hDC, L"这是一个实例", -1, &rect, DT_NOCLIP); 书写一个文字

DeleteObject(hFont); 文字输出完毕后,释放字体内存

位图

位图有以下几种:

光栅图形用于记录图像中每一点的颜色等信息。

矢量图形用于记录图像算法、绘图指令等。

HBITMAP为位图句柄

位图的使用

1 在资源中添加位图资源

2 从资源中加载位图LoadBitmap

3 创建一个与当前DC相匹配的DC(内存DC)

HDC CreateCompatibleDC

(

    HDC hdc   当前DC句柄,可以为NULL(使用屏幕DC)

  ); 返回创建好的DC句柄

4 将位图放入匹配的DC中  SelectObject

5 成像(1:1)

6 取出位图:SelectObject

7. 释放位图:DeleteObject

8 释放匹配的DC:DeleteDC

 

加载位图

API:LoadImage(HINSTANCE hinst,LPCTSTR lpszName,UINT uType,int cxDesired,int cyDesired,UINT fuLoad);

参数依次:

1.hinst:处理包含被装载图像模块的实例。若要装载OEM图像,则设此参数值为0。

2.lpszName:处理图像装载。

3.uType:指定被装载图像类型

4.cxDesired:指定图标或光标的宽度,以像素为单位。

5.cyDesired:指定图标或光标的高度,以像素为单位。

6.fuLoad:根据复合值列表指定函数值。

功能:装载图标,光标,或位图。

HBITMAP hBitMap = (HBITMAP)LoadImage(NULL, L"bg.bmp", IMAGE_BITMAP, 500, 500,

LR_LOADFROMFILE);  将位图加载进来

设置dc

API:CreateCompatibleDC(HDC hdc);

参数hdc:现有设备上下文环境的句柄

功能:创建一个与指定设备兼容的内存设备上下文环境

HDC hMemoryDC = CreateCompatibleDC(hDC); 设置一个兼容设备环境的内存dc

选择对象

SelectObject(hMemoryDC, hBitMap); 

贴图

API:BitBlt(HDC hdcDest, int nXDest,int nYDest,  int nWidth, int nHeight,  HDC hdcSrc, 

int nXSrc, int nYSrc,DWORD dwRop);

参数依次:

1.hDestDC:指向目标设备环境的句柄

2.x:指定目标矩形区域左上角的X轴逻辑坐标。

3.y:指定目标矩形区域左上角的Y轴逻辑坐标。

4.nWidth:指定源在目标矩形区域的逻辑宽度。

5.nHeight:指定源在目标矩形区域的逻辑高度。

6.hSrcDC:指向源设备环境的句柄。

7.xSrc:指定源矩形区域左上角的X轴逻辑坐标。

8.ySrc:指定源矩形区域左上角的Y轴逻辑坐标。

9.dwRop:指定光栅操作代码。这些代码将定义源矩形区域的颜色数据,如何与目标矩形区域的颜色数据组合以完成最后的颜色。

功能:对指定的源设备环境区域中的像素进行位块(bit_block)转换,以传送到目标设备环境。

BitBlt(hDC, 0, 0, 500, 500, hMemoryDC, 0, 0, SRCCOPY);贴图

  • 26
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Microsoft Windows GDI+是为C/C++开发者提供的一个基于类的应用程序编程接口(API)。它使得程序可以同时在视频显示器和打印机上使用图形和格式化文本。基于Microsoft Win32的应用程序不能直接访问图形硬件,而是通过GDI+来协调设备驱动和程序动作的交互。GDI+同样支持Microsoft Win64。 适用范围 GDI适用于所有的Window应用程序。GDI+是包含于Windows XP和Windows Server 2003中的一项新技术。运行于Microsoft Windows NT 4.0 SP6、Windows 2000、Windows 98 和 Windows Me操作系统的应用程序在分发的时候需要包含GDI+。 适用读者 GDI+ C++ 基类接口是为C/C++开发者所设计。需要精通Windows图形用户接口和消息驱动机制。 目录 序言 - 4 - 目标. - 4 - 适用范围 - 4 - 适用读者 - 4 - 运行环境 - 4 - 文档组织 - 4 - 相关主题 - 4 - GDI+的安全考虑 - 6 - 检验构造函数调用成功与否 - 6 - 分配缓冲区 - 6 - 错误校验 - 7 - 线程同步 - 9 - 相关主题 - 10 - 关于GDI+ - 11 - GDI+ 介绍 - 11 - GDI+ 概览. - 11 - GDI+ 的个组成部分 . - 11 - 基于类的接口架构 - 12 - GDI+提供了哪些新东西? - 12 - 新特征 - 12 - 编程模式的改变 - 15 - 线条、曲线和图形 - 19 - 矢量图概览 - 19 - 钢笔、线条和矩形 - 20 - 椭圆和弧 - 22 - 多边形 - 22 - 基数样条 - 23 - 贝塞尔样条 - 24 - 路径 - 25 - 画刷和填充图形 - 27 - 开放与闭合曲线 - 29 - 区域 - 30 - 裁剪 - 31 - 路径平直化 - 32 - 线条和曲线的抗锯齿功能 - 32 - 图象、位图和图元文件 - 33 - 位图类型 - 34 - 图元文件 - 37 - 绘制、定位和复制图片 - 39 - 裁剪和缩放图象 - 40 - 坐标系统和转换 - 42 - 坐标系统类型 - 42 - - 2 - 以矩阵来表示转换 - 44 - 全局和局部转换 - 48 - 图形容器 - 51 - 使用GDI+ - 56 - 使用入门 - 56 - 绘制线条 - 56 - 绘制字符串 - 58 - 使用钢笔绘制线条和形状 - 59 - 使用钢笔绘制线条和矩形 - 59 - 设置钢笔的宽度和对齐方式 - 60 - 绘制具有线帽的线条 - 61 - 联接线条 - 62 - 绘制自定义虚线 - 62 - 绘制用纹理填充的线条 - 63 - 使用画笔填充形状 - 63 - 用纯色填充形状 - 64 - 用阴影图案填充形状 - 64 - 用图像纹理填充形状 - 64 - 在形状中平铺图像 - 65 - 用渐变色填充形状 - 68 - 使用图像、位图和图元文件 - 68 - 加载和显示位图 - 68 - 加载和显示图元文件 - 69 - 记录图元文件 - 69 - 剪裁和缩放图像 - 71 - 旋转、反射和扭曲图像 - 72 - 缩放时使用插值模式控制图像质量 - 73 - 创建缩略图像 - 75 - 采用高速缓存位图来提高性能 - 76 - 通过避免自动缩放改善性能 - 76 - 读取图像元数据 - 77 - 使用图像编码器和解码器 - 83 - 列出已安装的编码器 - 83 - 列出已安装的解码器 - 84 - 获取解码器的类标识符 - 86 - 获取编码器的参数列表 - 88 - 将BMP图像转换为PNG图像 . - 100 - 设定JPEG的压缩等级 - 101 - 对JPEG图像进行无损变换 - 102 - 创建和保存多帧图像 - 105 - 从多帧图像中复制单帧 - 107 - Alpha 混合线条和填充 - 109 - 绘制不透明和半透明的线条 - 109 - 用不透明和半透明的画笔绘制 - 110 - - 3 - 使用复合模式控制 Alpha 混合 . - 111 - 使用颜色矩阵设置图像中的 Alpha 值 . - 112 - 设置单个象素的alpha值 . - 114 - 使用字体和文本 - 115 - 构造字体系列和字体 - 115 - 绘制文本 - 116 - 格式化文本 - 117 - 枚举已安装的字体 - 120 - 创建专用的字体集合 - 122 - 获取字体规格 - 126 - 对文本使用消除锯齿效果 - 130 - 构造并绘制曲线 - 131 - 绘制基数样条曲线 - 131 - 绘制贝塞尔样条 - 133 - 用渐变画刷填充形状 - 134 - 创建线性渐变 - 134 - 创建路径渐变 - 137 - 将 Gamma 校正应用于渐变 - 144 - 构造并绘制路径 - 145 - 使用线条、曲线和形状创建图形 - 145 - 填充开放式图形 - 147 - 使用图形容器 - 147 - 管理 Graphics 对象的状态 - 148 - 使用嵌套的 Graphics 容器 - 151 - 变换. - 154 - 使用世界变换 - 154 - 为什么变换顺序非常重要 - 155 - 使用区域 - 156 - 对区域使用点击检测 - 156 - 对区域使用剪辑 - 157 - 对图像重新着色 - 158 - 使用颜色矩阵对单色进行变换 - 158 - 转换图像颜色 - 160 - 缩放颜色 - 161 - 旋转颜色 - 164 - 剪取颜色 - 166 - 使用颜色重映射表 - 168 - 打印. - 169 - 将GDI+输出至打印机 - 169 - 显示一个打印对话框 - 172 - 通过提供打印机句柄优化打印 - 173 - 附录:GDI+ 参考 - 176 -

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值