GDI
GDI:即图形设备接口,英文全称 Graphics Device Interface,简称GDI,GDI绘图效率低,是和Directx和openGL相比,
GDI+
GDI+ 由于是GDI基础上再次开发,比GDI高层,也就是距离底层远,执行效率低,GDI+不适合应用游戏
GDI特定
GDI 实现一套通用的图形对象,来向屏幕,内存甚至打印机进行绘图操作,GDI的特点:
- 不允许程序直接访问物理显示硬件,通过称为“设备环境”的抽象接口间接访问显示硬件
- 程序需要与显示硬件进行通讯时,必须首先获得与特定窗口相关联的设备环境
- 用户无需关系具体的物理设备类型
- windows参考设备环境的数据结构完成数据的输出
GDI中的基本图形
GDI中显示的“基本图形”:
- 直线和曲线:GID支持直线,矩形,椭圆等图形
- 填入区域:当一系列直线或者曲线封闭了一个区域,这个区域使用GID画刷对象进行填图
- 位图:位的矩形数组,位对应于显示设备上的像素,位映像图形的基础工具
- 文字
- 映像模式和变化
- 图元
- 绘图区域
- 路径
- 裁剪
- 调色盘
- 打印
GDI的函数分类
大体来看:GDI就是由几百个函数组成,那么它们的分类是:
- 取得和释放设备上下文的函数
- 取得有关设备上下文信息的函数
- 绘图函数
- 设定和取得设备上下文参数的函数
- 使用GDI对象的函数
设备环境DC
设备环境DC,DC就是程序可以进行绘图的地方,如果在屏幕上绘图,DC就是窗口上可以绘图的地方,系统中可以具有多个设备环境每个设备环境都有一个与之对应的关联设备;
如果将图形输出到特定的设备,只需要创建相应类型的设备句柄(HDC)就可,所以GDI绘图的时候,必须先取得设备环境的句柄,取得句柄的两种方式:
获得句柄的两种方式
第一种方法:需要在窗口过程函数处理WM_PAINT消息的case之后使用,在这里需要使用BeginPaint和EndPaint这两个函数
HDC BeginPaint( // 它为指定的窗口进行绘图工作,并将绘图有关的信息填充到 PAINTSTRUCT结构中
_In_ HWND hWnd, //HWND 类型的hund,填写获取设备环境句柄的那个窗口句柄
_Out_ LPPAINTSTRUCT lpPaint);//LPPAINTSTRUCT类型的lpPaint
对于结构体LPPAINTSTRUCT,这个结构体包含了用来绘制它所拥有的窗口客户区所需要的消息:
typedef struct tagPAINTSTRUCT {
HDC hdc; //绘制的句柄
BOOL fErase; //非零擦除背景,否则不擦除
RECT rcPaint; //制定左上角和右上角坐下确定矩形范围
BOOL fRestore;
BOOL fIncUpdate;
BYTE rgbReserved[32]; //系统预留
} PAINTSTRUCT, *PPAINTSTRUCT, *NPPAINTSTRUCT, *LPPAINTSTRUCT;
对应BeginPaint的EndPaint函数,表示指定窗口的绘画过程结束:
BOOL EndPaint(
_In_ HWND hWnd, //被重画窗口的句柄
_In_ CONST PAINTSTRUCT *lpPaint); // BeginPaint中的结构体
ValidateRect函数。它用于更新指定窗口无效矩形的区域,使之有效
BOOL WINAPI ValidateRect(
_In_opt_ HWND hWnd, //标识想要修改状态的窗口,若为NULL,系统更新所有窗口
_In_opt_ CONST RECT *lpRect); // 指向有关包含需要生效的矩形更新区域坐标的RECT,为NULL,则客户区域将会生效
第二种方法:使用GetDC来获得句柄,调用GetDC后调用ReleaseDC对设备环境释放
HDC WINAPI GetDC(
_In_opt_ HWND hWnd); //窗口句柄,根据提供的窗口句柄返回对应窗口的设备上下文DC
与之对应的RealeaseDC,释放上下文的函数
int WINAPI ReleaseDC(
_In_opt_ HWND hWnd, //指定释放设备上下环境所在窗口的句柄
_In_ HDC hDC); //指向要释放的设备上下文环境的句柄
一个GDI程序的通过框架
//-----------------------------------【程序说明】----------------------------------------------
// 程序名称::GDIdemoCore
// 描述:GDI基本几何绘图示例程序
//------------------------------------------------------------------------------------------------
//-----------------------------------【头文件包含部分】-----------------------