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. You raise me up

    You raise me up, so I can stand on mountains;You raise me up, to walk on stormy seas;I am strong, wh ...

  2. hbase 单机安装问题

    报zookeeper exception not found I fixed this by editing the file "/usr/local/hbase-0.94.1/conf/h ...

  3. log4j.xml配置示例

    这是log4j1.x版本讲解,log4j-1.2.16.jar    1. 一般的log4j.xml的两种配置方式: 1.Logger 完成日志信息的处理定义输出的层次和决定信息是否输出DEBUG&l ...

  4. C++_基础_类和对象3

    内容: (1)析构函数 (2)拷贝构造和拷贝赋值 (3)静态成员 (4)成员指针 (5)输入输出运算符重载 1.析构函数 当一个对象被创建时,自动调用构造函数进行初始化 当一个对象被销毁时,自动调用析 ...

  5. 论try/catch的重要性,我们经常遇到代码出现无法调试的错误,程序退出的时候崩溃。这跟我们代码日常保护的习惯息息相关。

    每当构造函数或析构函数中出现溢出,会导致调试非常困难,而使用try/catch来处理构造中的初始化就非常重要了. 如上图,在构造函数中,我们的很多初始化动作会放在这里,但是却忽视了,一旦初始化出错了, ...

  6. BZOJ 1021: [SHOI2008]Debt 循环的债务( dp )

    dp(i, j, k)表示考虑了前i种钱币(从小到大), Alice的钱数为j, Bob的钱数为k, 最小次数. 脑补一下可以发现, 只有A->B.C, B->A.C, C->A.B ...

  7. Java基础之参数传递

    public class ArgsTransfer { /* * 基本数据类型直接存储在变量中,函数参数传递时,是将变量中存储的数据拷贝,函数中改变形参,和调用处的实参是不同的变量,两边互不影响 * ...

  8. MyEclipse中设置智能提示

    在实际的开发当中,编译器没有智能提示,确实是效率很低,下面我就给大家讲一下在MyEclipse中设置智能提示,方便大家的开发,希望能帮到大家. 方法一:首先,在MyEclipse的菜单栏中找到wind ...

  9. 树莓派高级GPIO库,wiringpi2 for python使用笔记(四)实战DHT11解码

    DHT11是一款有已校准数字信号输出的温湿度传感器. 精度湿度+-5%RH, 温度+-2℃,量程湿度20-90%RH, 温度0~50℃. 我买的封装好的模块,上边自带了上拉电阻,直接查到树莓派上即可灰 ...

  10. 了解常见的浏览器内核 Trident,Geckos,Presto,Webkit

    了解常见的浏览器内核 Trident,Geckos,Presto,Webkit 内核只是一个通俗的说法,英文名称为"Layout engine",翻译过来就是"排版引擎& ...