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. jquery $.post 返回json数据

    $(function () { $("#prompt").hide(); $("#searchIpt").keyup(function () { var key ...

  2. SGU 134.Centroid( 树形dp )

    一道入门树dp, 求一棵树的重心...我是有多无聊去写这种题...傻X题写了也没啥卵用以后还是少写好.. ----------------------------------------------- ...

  3. 获取select赋值

    <select class="sel-ul-add" id="xuanzhe"> <option>A</option> &l ...

  4. 汉化testlink

    testlink版本:1.9.13 1.登录testlink后,打开my setting(左上角小人人) 2.Locale 选择chinese,然后点击save 3.over,汉化完毕

  5. windows下安装testlink

    因为项目中一直没有使用任何测试用例管理工具,如果需要的时候都是个人写在的excle里各自保存,因为没有系统的记录当时测试方法和测试用例,每次需要再次测试已有的功能时,因为时间太长,而往往记不得当时是怎 ...

  6. 富文本编辑器ckeditor继承

    新建一个web项目ckfinder,导入lib包 加入java包,编码格式UTF-8 在WebRoot下添加ckedtior以及ckfinder两个文件夹,将config.xml拷入WEB-INF中 ...

  7. Java的static详解

    static ['stætɪk] n. 静电:静电干扰 adj. 静态的:静电的:静力的 在计算机上我们译为:静态的.在Java种根据它修饰对象不同,我们可以划分为 1. static对象 2. st ...

  8. Netty那点事: 概述, Netty中的buffer, Channel与Pipeline

    Netty那点事(一)概述 Netty和Mina是Java世界非常知名的通讯框架.它们都出自同一个作者,Mina诞生略早,属于Apache基金会,而Netty开始在Jboss名下,后来出来自立门户ne ...

  9. 第八届acm省赛 A挑战密室(模拟)

    10406: A.挑战密室 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 29  Solved: 10 [Submit][Status][Web Bo ...

  10. js发送post请求下载文件

    大家都知道ajax是不能直接下载文件的,所以一般都是通过一个超链接的形式去下载一个文件 但是当牵扯到需要发送很多数据到服务器上再下载的时候超链接的形式就有些太过勉强了 如下是一个工具方法(依赖jque ...