windows游戏编程<八> 绘图基础

本系列文章由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对象);

SelectObjectGDI对象选入相应的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对象,库存对象有如下图:



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
画出GraphItem类的UML类图: #ifndef GRAPHITEM_H #define GRAPHITEM_H #include <QGraphicsItem> #include <QVector> #include <QPointF> #include <QtMath> #include <QTimer> #include <QPaintEvent> #include <QPushButton> #include "mainwindow.h" #include <QObject> class MainWindow; // 前向声明 class GraphItem : public QGraphicsItem { public: //构造函数,接受带权无向图临界矩阵adjMatrix和一个parent GraphItem(const QVector<QVector<int>> &adjMatrix, const QVector<int> &shortestPath, QGraphicsItem *parent = nullptr); //纯虚函数,在.cpp中重新编写以实现图形项的边界框绘制 QRectF boundingRect() const override; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; QVector<QPointF> m_nodePositions;//存储节点的位置信息 QVector<int> m_shortestPath; // 最短路径 QVector<int> m_userCity; QVector<int> m_userSchool; bool m_drawArrow; // 是否需要绘制箭头 bool m_draw1; bool m_draw2; bool m_draw3; private: MainWindow * m_mainWindow; // 指向MainWindow对象的指针 QVector<QVector<int>> m_adjMatrix;//存储带权无向图的邻接矩阵 QPointF startPoint; QPointF endPoint; QPainter * m_painter; QPainter * m_drawNodes; void initializeNodePositions();//初始化节点位置信息 void drawEdges(QPainter * painter);//用于绘制边 void drawNodes1(QPainter * painter);//用于绘制节点 void drawNodes2(QPainter * painter);//用于绘制节点 void drawNodes3(QPainter * painter);//用于绘制节点 void paintArrow(QPainter * painter); }; #endif // GRAPHITEM_H
最新发布
07-14

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值