1、GDI名字的意义

GDI Graphic Device Interface,我说不清和GUI有什么区别。可能一种针对设备,一种针对用户而言吧,反正以后都说GDI,也就是Windows的图形编程。

2、设备描述上下文HDC

Handle Device Context

这个是关键的关键,可以理解成画图的环境,何谓环境,画板,纸,笔,尺寸,字体,颜色,区域等。反正包括你能想到的和未能想到的了。

要画出不同的图形,很大程度上是对HDC的修改。

3、HDC的创建方式

WM_PAINT消息来的时候,用:

hdc = BeginPaint(hwnd, &ps);

//......

EndPaint(hwnd, &ps);

结束后ps区域自动变有效。还有:

hdc = GetDC(hwnd);

//......

ReleaseDC(hwnd, hdc);

这一对需要调用ValidateRect()函数来使得区域有效。

还有别的办法,但不常用,这里略过。不过有一个还是值得一说,那就是取得Window HDC的办法,用它可以在Windows非客户区画图:

hdcWindow = GetWindowDC(hwnd);

//......

ReleaseDC(hwnd, hdcWindow);

4、获取HDC信息

GetDeviceCaps()

其中比较重要的指标是:

HORZRES(horizontal resolution)

VERTRES(vertical resolution)

BITSPIXEL(色深)

5、保存HDC与还原HDC

SaveDC(hdc);

RestoreDC(hdc, -1);

6、画图画图!

SetPixel(hdc, x, y, crColor);

crColor = GetPixel(hdc, x, y);

画点

取点颜色

直线

MoveToEx(hdc, x, y, lpPrevPoint);

LineTo(hdc, x, y);

Polyline(hdc, lpPoint, cPointNum);

PolylineTo(hdc, lpPoint, cPointNum);

PolyPolyline(hdc, lppt, lpNum, cCount);

最后一参数为NULL表示不返回最后点

画线

画多线,不移动当前点

画多线,移动当前点

画多组多线

曲线

Arc(...);

PolyBezier(...);

PolyBezierTo(...);

画椭圆线

画比泽尔曲线,不移动但前点

画比泽尔曲线,移动当前点

区域

Rectangle(...);

Ellipse(...);

RoundRect(...);

Pie(...);

Chord(...);

画矩形

画椭圆

画带圆角的矩形

画扇

画弓

7、画笔HPEN(改变线条)

方法1:

HPEN hPen = GetStockObject(ARGUMENTS);

ARGUMENTS为:BLACK_PEN 黑笔WHITE_PEN 白笔

用法:HPEN hPen = SelectObject(hdc, GetStockObject(WHITE_PEN));

DelectObject(hPen);

方法2:

HPEN hPen = CreatePen(iPenStyle, iWidth, crColor);

iPenStyle为:PS_SOLID实线PS_DASH虚线PS_DOT点线PS_DASHDOT虚点线PS_DASHDOTDOT虚双点线PS_NULL空线PS_INSIDEFRAME??

用法:DeleteObject(SelectObject(hdc, GetStockObject(BLACK_PEN)));

获取画笔信息:

GetObject(hPen, sizeof(LOGPEN), (LPVOID)&logpen);

选出HDC中的画笔:

hPen = GetCurrentObject(hdc, OBJ_PEN);

8、背景模式

改变背景模式,也就是制定虚线间间隙的填充问题了:

SetBkColor(hdc, crColor);

SetBkMode(hdc, TRANSPARENT);

SetBkMode(hdc, OPAQUE);

有Set嘛,相应地有Get了,这里略过。

9、叠加模式

SetROP2(hdc, iDrawMode);

iDrawMode = GetROP2(hdc);

10、画刷HBRUSH(改变填充)

画刷能指明区域填充模式。

方法1:

HBRUSH hBrush = GetStockObject(GRAY_BRUSH);

使用:SelectObject(hdc, hBrush);

方法2:

HBRUSH hBrush = CreateSolidBrush(crColor);

HBRUSH hBrush = CreateHatchBrush(iHatchStyle, crColor);

11、多边形填充模式及画多边形

SetPolyFillMode(hdc, iMode);

iMode:ALTERNAME WINDING

Polygon(...);

12、区域HRGN(绘画范围)

HRGN hRgn = CreateRectRgn(x1, y1, x2, y2);

HRGN hRgn = CreateRectRgnIndirect(&rect);

HRGN hRgn = CreateEllipticRgn(x1, y1, x2, y2);

HRGN hRgn = CreateEllipticRgnIndirect(&rect);

区域合并

CombineRgn(hDestRgn, hSrcRgn1, hSrcRgn2, iCombine);

iCombine: RGN_AND, RGN_OR, RGN_XOR, RGN_DIFF, RGN_COPY

注意:hDestRgn, hSrcRgn1, hSrcRgn2都必须有效。

使用:

FillRgn(); 填充区域。

FrameRgn(); 给区域画边。

InvertRgn(); 反转区域。

HRGN hRgnPrev = SelectObject(hdc, hRgn); 将区域放置入HDC。

使区域无效/有效:

InvalidateRgn(hRgn);

ValidateRgn(hRgn);

Win32 GDI基础(笔记)的更多相关文章

  1. Java基础笔记 – Annotation注解的介绍和使用 自定义注解

    Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 |  被围观 25,969 views+ 1.Anno ...

  2. php代码审计基础笔记

    出处: 九零SEC连接:http://forum.90sec.org/forum.php?mod=viewthread&tid=8059 --------------------------- ...

  3. MYSQL基础笔记(六)- 数据类型一

    数据类型(列类型) 所谓数据烈性,就是对数据进行统一的分类.从系统角度出发时为了能够使用统一的方式进行管理,更好的利用有限的空间. SQL中讲数据类型分成三大类:1.数值类型,2.字符串类型和时间日期 ...

  4. MYSQL基础笔记(五)- 练习作业:站点统计练习

    作业:站点统计 1.将用户的访问信息记录到文件中,独占一行,记录IP地址 <?php //站点统计 header('Content-type:text/html;charset=utf-8'); ...

  5. MYSQL基础笔记(四)-数据基本操作

    数据操作 新增数据:两种方案. 1.方案一,给全表字段插入数据,不需要指定字段列表,要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致.凡是非数值数据,到需要使用引号(建议使用单引号)包裹. i ...

  6. MYSQL基础笔记(三)-表操作基础

    数据表的操作 表与字段是密不可分的. 新增数据表 Create table [if not exists] 表名( 字段名 数据类型, 字段名 数据类型, 字段n 数据类型 --最后一行不需要加逗号 ...

  7. MYSQL基础笔记(二)-SQL基本操作

    SQL基本操作 基本操作:CRUD,增删改查 将SQL的基本操作根据操作对象进行分类: 1.库操作 2.表操作 3.数据操作 库操作: 对数据库的增删改查 新增数据库: 基本语法: Create da ...

  8. MYSQL基础笔记(一)

    关系型数据库概念: 1.什么是关系型数据库? 关系型数据库:是一种建立在关系模型(数学模型)上的数据库 关系模型:一种所谓建立在关系上的模型. 关系模型包含三个方面: 1.数据结构:数据存储的问题,二 ...

  9. JavaScript基础笔记二

    一.函数返回值1.什么是函数返回值    函数的执行结果2. 可以没有return // 没有return或者return后面为空则会返回undefined3.一个函数应该只返回一种类型的值 二.可变 ...

随机推荐

  1. 实现一个简单的邮箱地址爬虫(python)

    我经常收到关于email爬虫的问题.有迹象表明那些想从网页上抓取联系方式的人对这个问题很感兴趣.在这篇文章里,我想演示一下如何使用python实现一个简单的邮箱爬虫.这个爬虫很简单,但从这个例子中你可 ...

  2. JavaSE学习总结第13天_API常用对象3

      13.01 StringBuffer的概述 StringBuffer类概述:线程安全的可变字符序列.一个类似于 String 的字符串缓冲区,但不能修改.虽然在任意时间点上它都包含某种特定的字符序 ...

  3. Hadoop学习之YARN框架

    转自:http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop-yarn/,非常感谢分享! 对于业界的大数据存储及分布式处理系统来说,H ...

  4. 服务器搭建纪录linux+mysql+nginx+php

    新的项目启动 第一版 首先买了阿里云,选好环境镜像包,一键安装. 第一版php打算不用框架,完全手写,主要的功能点 数据交互和图片传输. 后台搭建好后,使用PHP的Laravel, web端还是选定b ...

  5. php框架

    使用composer构建的php框架 github: https://github.com/Ev2le0/LeoFramework 实现功能: 1)路由 2)ORM 3)视图

  6. Windows 8.1 正式版微软官方原版镜像下载(新增10/17新版下载)

    中文版:中国区OEM预装版本,特定国家版,锁定语言,其它功能和核心版没有区别.简体中文单语言版:锁定语言,其它功能和核心版没有区别.专业版+核心版[零售版][推荐]:镜像内包含专业版(Professi ...

  7. C# WinForm判断Win7下是否是管理员身份运行

    原文:C# WinForm判断Win7下是否是管理员身份运行 如果程序不是以管理员身份运行,操作本地文件会提示:System.UnauthorizedAccessException异常 Vista 和 ...

  8. easyui-layout中的收缩层无法显示标题问题解决

    先看问题描述效果图片: 如上,我的查询条件是放在layout下面的一个可收缩层中,初始是收缩的,title显示不出来的话对使用者很不方便,代码如下: <div id="__MODULE ...

  9. Windows Azure 上 Linux VM 中的交换空间 – 第 2 部分

    本文章由 Azure CAT 团队的 Piyush Ranjan (MSFT) 撰写. 在前一篇文章 Windows Azure 上Linux VM 中的交换空间第 1 部分中,我介绍了在默认情况下, ...

  10. SQL Server索引进阶:第九级,读懂执行计划

    原文地址: Stairway to SQL Server Indexes: Level 9,Reading Query Plans 本文是SQL Server索引进阶系列(Stairway to SQ ...