本系列文章由jadeshu编写,转载请注明出处。http://blog.csdn.net/jadeshu/article/details/22451353

作者:jadeshu   邮箱: jadeshu@qq.com    欢迎邮件交流

很快到第八小节了,前面部分些许晦涩难懂,尤其寄存器和内存几节!先有个概念,慢慢熟悉!接着按下面一节节的学习就行了

这节主要说下绘图基础相关的东西

绘制图形,我们平时在白纸上绘制个图形如一条直线就很简单,但在计算上实现确实很复杂的过程,学习它需要许多图形这块的知识,然后在windows 程序设计这块我们不必太过纠结这些!因为windows系统具有丰富的GDI API供我们使用,直接就可以画出图形出来。关于图形方面的我们后面会介绍的。

学习绘制图形方面需要学习GDI  ,那么我们先来介绍什么是GDI!从我们的角度说GDI是由几百个函数以及相关的一些数据类型,宏和结构组成。GDI主要目的是支持与设备无关的图形。图形输出设备被分为两大类:光栅设备和矢量设备。大多数PC输出的是光栅设备。GDI基本图形包括
线条和曲线,区域,位图,文本。


GDI是图形设备接口(Graphics Device Interface)的英文首字母的简称。
•Windows图形编程就是针对Windows自带的图形设备接口函数库和设备环境(DC)进行操作。通过调用这些函数库中的函数来完成绘制工作。

GDI是一个抽象的接口,是一个关于图形显示的函数库。通过这个接口可以实现对图形的颜色、线条的粗细等属性的控制。它是我们的程序与计算机硬件之间的一个桥梁。

设备环境DC(Device Context 又称为设备上下文,也称为设备描述表)。它是一个关于如何绘制图形的方法的集合,它既可以绘制各种图形,也可以确定在应用窗口中绘制图形的方式,就是绘图模式和映射模式。
在Win32编程中,设备环境是用HDC 来标识。H的意思Handle句柄的意思。  

获取HDC

1通过GetDC函数来获得相应窗口的HDC
GetDC函数适合在窗口现有图形的基础上进行绘制。
{
HDC hDC = ::GetDC(hWnd);
//其他的绘图操作代码
……
::ReleaseDC(hWnd,hDC);
}

GetDC中传入的参数hWnd是窗口的句柄,它返回和这个窗口相关的DC
 
2、通过BeginPaint函数获得所在窗口的HDC

BeginPaint函数是将窗口上所有内容清除干净,然后在上面绘制。

PAINTSTRUCT ps;
HDC hDC = ::BeginPaint(hWnd,&ps);
//其他的绘图操作代码
::EndPaint(hWnd,&ps);

typedef struct tagPAINTSTRUCT {
HDC hdc; // 显示器的设备环境句柄
BOOL fErase; //是否擦除背景
RECT rcPaint; //指定了需要绘图的窗口区域
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[32];
} PAINTSTRUCT, *PPAINTSTRUCT;

3、通过CreateDC和CreateCompatibleDC函数获得HDC


常用的GDI对象的介绍

画笔Pen:
在GDI中,用HPEN来表示画笔。H是代表句柄的意思。
在GDI中,画线,画边框(如矩形边框,圆边框,饼边框)都是采用画笔来操作的。
GDI默认的画笔是黑色,宽度为1,样式为实线的画笔。

画刷Brush:
在GDI中,用HBRUSH来表示画刷。H是代表句柄的意思。
在GDI中,填充矩形,填充圆,填充饼等以及刷窗口背景都是通过画刷来操作的。
GDI默认的画刷是白色的画刷。

字体Font:
在GDI中,用HFONT来表示字体。H是代表句柄的意思。
在GDI中,所有的文本绘制,都是要基于具体的字体对象来绘制的。
GDI中默认的字体,是系统等宽字体,比如对话框标题一般就采用这个字体。

区域Region:
在GDI中,用HRGN来表示区域。H是代表句柄的意思。
在窗口中,一个区域可以是椭圆形,多边形,或是更常见的矩形。

位图Bitmap:
在GDI中,用HBITMAP来表示位图。H是代表句柄的意思。
GDI的绘制,从大体上,分为图形绘制跟图像绘制。对于线,矩形,圆,饼等的绘制是属于图形绘制。而对位图的绘制是属于图像绘制。

HGDIOBJ WINAPI SelectObject(HDC hdc ,//设备DC
HGDIOBJ h //其实是一个void* 。这个函数传入一个新的GDI对象到第一个参数的DC中,并返回该DC的老的相同类型的GDI对象);

SelectObject把GDI对象选入相应的DC中

像画笔(句柄HPEN),画刷(HBURSH),位图(HBITMAP)等都是GID对象。因为画图函数,如画圆,画矩形,画直线,它们所画出图形,默认属性都是不变的,如线的宽度。那么想要改变画出来时线的宽度,比如我想画出来的图形它的线条宽度为5(像素),那么就要创建一个宽度为5的画笔,然后再通过SelectObject函数,给这个画笔选入,就可以了.

选择GDI对象实例

HPEN pen=CreatePen(PS_SOLID,3,RGB(255,78,99));//创建画笔
HBRUSH brush=CreateSolidBrush(RGB(22,182,111));//创建画刷
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps); //BeginPaint只能在响应WM_PAINT
SelectObject(hDC,pen);//选入画笔
SelectObject(hDC,brush);//选入画刷

选用库存GDI对象,库存对象有如下图:



windows游戏编程 绘图基础的更多相关文章

  1. Windows游戏编程之从零开始d

    Windows游戏编程之从零开始d I'm back~~恩,几个月不见,大家还好吗? 这段时间真的好多童鞋在博客里留言说或者发邮件说浅墨你回来继续更新博客吧. woxiangnifrr童鞋说每天都在来 ...

  2. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记5——Direct3D中的顶点缓存和索引缓存

    第12章 Direct3D绘制基础 1. 顶点缓存 计算机所描绘的3D图形是通过多边形网格来构成的,网网格勾勒出轮廓,然后在网格轮廓的表面上贴上相应的图片,这样就构成了一个3D模型.三角形网格是构建物 ...

  3. windows游戏编程 创建WIN32一个HelloWOrld程序

    本系列文章由jadeshu编写,转载请注明出处.http://blog.csdn.net/jadeshu/article/details/22449085 作者:jadeshu   邮箱: jades ...

  4. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记2——透明贴图,动画技术

    第5章 透明贴图 像这样直接贴图会产生这种情况,所以我们需要透明贴图. 透明遮罩法:主要利用BitBlt函数中Raser(光栅)值的运算,需要准备素材图和遮罩图: 这个方法的原理解释见书131页. 示 ...

  5. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记3——输入消息处理,物理建模与粒子系统初步

    第7章 Windows游戏输入消息处理 1. 键盘消息处理 之前提到的窗口过程函数有两参数与消息输出有关——wParam和llParam LRESULT CALLBACK WindowProc( _I ...

  6. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记4——Direct3D编程基础

    第11章 Direct3D编程基础 2D游戏是贴图的艺术,3D游戏是渲染的艺术.这句话在我学过了之前的GDI编程之后,前一句算是有所体会,现在是来理解后一句的时候了. 安装DirectX SDK配置啥 ...

  7. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记1——创建窗口&GDI

    第1章 创建窗口 步骤: 窗口类的设计 窗口类的注册 窗口的正式创建 窗口的显示与更新 消息循环体系 窗口过程函数处理消息 1. 设计:使用WNDCLASSEX结构体,这里注意的是C++中的结构体中的 ...

  8. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记10——三维天空的构建&三维粒子的实现&多游戏模型的载入

    第23章 三维天空的构建 目前描述三维天空的技术主要包括三种类型,直接来介绍使用最广泛的模拟技术,详细的描述可以见作者的博文. 天空盒(Sky Box),即放到场景的是一个立方体.它是目前使用最广泛的 ...

  9. 《逐梦旅程 WINDOWS游戏编程之从零开始》笔记6——四大变换&光照与材质

    第13章 四大变换 在Direct3D中,如果为进行任何空间坐标变换而直接绘图的话,图形将始终处于应用程序窗口的中心位置,默认这个位置就成为世界坐标系的原点(0,0,0).而且我们也不能改变观察图形的 ...

随机推荐

  1. 轻松搭建CAS 5.x系列(9)-登录后显示通知信息

    概述说明 用户在账号名密码认证通过后,CAS可以跳转到登陆完成页面前,显示相关的通知页面. 搭建步骤 `1. 首先,您需要有个CAS Server端 如果您没有,可以按照我之前写的文章<轻松搭建 ...

  2. (二)easyUI之消息提示框

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  3. (二十五)JSP九大内置对象(转)

    --转载自孤傲苍狼博客 一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质 ...

  4. (二)Struts.xml文件详解

    一.Struts.xml文件 Struts.xml文件构成 如图,<Struts>标签内共有5个子标签. 1.1 struts-default.xml 查看Struts的内容可知,Stru ...

  5. Android 自定义控件之 日期选择控件

    效果如下: 调用的代码: @OnClick(R.id.btn0) public void btn0() { final AlertDialog dialog = new AlertDialog.Bui ...

  6. Sqlserver查询每组数据中最大的一条数据

    select * from ( SELECT ROW_NUMBER() over (PARTITION By name order by val) as rowId,tb_test.* FROM tb ...

  7. JVM学习笔记——类加载过程

    JVM学习笔记——类加载过程 类加载模型——双亲委派模型(Parents Delegation Model)也可称为“溯源委派加载模型” Java的类加载器是一个运行时核心基础设施模块,主要是启动之初 ...

  8. java jdk1.8 API

    里面有 中英文 jdk 1.8 API    还有 jdk1.6 和1.7 英文 API 链接:https://pan.baidu.com/s/1tchABVX7htJCaO3quENP1g提取码:y ...

  9. linux物理地址和虚拟地址定义

    线性地址(Linear Address) 是逻辑地址到物理地址变换之间的中间层 如果启用了分页机制,那么线性地址可以再经过变换以产生一个物理地址:如果没有启用分页机制,那么线性地址直接就是物理地址 分 ...

  10. openpyxl 设置单元格颜色

    在处理excel数据格式的时候,需要对特定单元格进行颜色标注,方便相关人员查看 醒目 # -*- coding: utf-8 -*- from openpyxl import load_workboo ...