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. const和readonly你真的懂吗?

    第二遍文章我打算把const和readonly的区别拿出来讲下,因为写代码这么久我都还没搞清楚这两者的区别,实在有点惭愧,所以这一次我打算搞清楚它. 定义 来看看MSDN的解释: readonly:r ...

  2. R与数据分析旧笔记(⑨)广义线性回归模型

    广义线性回归模型 广义线性回归模型 例题1 R.Norell实验 为研究高压电线对牲畜的影响,R.Norell研究小的电流对农场动物的影响.他在实验中,选择了7头,6种电击强度, 0,1,2,3,4, ...

  3. Java中print、printf、println的区别(转载)

    printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和print基本没什么差别,就是最后会换行 System.out.p ...

  4. linux系统性能监控常用命令

      一.Linux服务器性能关注点 1)CPU -> load:表示cpu在一段时间内正在处理以及等待处理的任务之和统计信息,简单可理解为cpu正处理的线程数和能同时处理的线程数的比值.一般认为 ...

  5. JAVA并发,同步锁性能测试

    测试主要从运行时间差来体现,数据量越大,时间差越明显,例子如下: package com.xt.thinks21_2; /** * 同步锁性能测试 * * @author Administrator ...

  6. C++面试经常涉及的概念1

    1.new.delete.malloc.free关系 delete会调用对象的析构函数,和new对应.free只会释放内存,new调用构造函数.malloc与free是C++/C语言的标准库函数,ne ...

  7. UIWindow 详解

    UIWindow对象是所有UIView的根视图,管理和协调的应用程序的显示.分发事件给View.UIWindow类是UIView的子类,可以看作是特殊的UIView.一般应用程序只有一个UIWindo ...

  8. jquery阻止默认滑动

    $(".swiper-slide").click(function(){ var index = imgarr[$(this).index()]; var content = &q ...

  9. [HDU 4741]Save Labman No.004[计算几何][精度]

    题意: 求两条空间直线的距离,以及对应那条距离线段的两端点坐标. 思路: 有一个参数方程算最短距离的公式, 代入求即可. 但是这题卡精度... 用另外的公式(先算出a直线上到b最近的点p的坐标, 再算 ...

  10. android 围绕中心旋转动画

    本文主要介绍Android中如何使用rotate实现图片不停旋转的效果.Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生动画效果 ...