Win32 GDI基础(笔记)
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基础(笔记)的更多相关文章
- Java基础笔记 – Annotation注解的介绍和使用 自定义注解
Java基础笔记 – Annotation注解的介绍和使用 自定义注解 本文由arthinking发表于5年前 | Java基础 | 评论数 7 | 被围观 25,969 views+ 1.Anno ...
- php代码审计基础笔记
出处: 九零SEC连接:http://forum.90sec.org/forum.php?mod=viewthread&tid=8059 --------------------------- ...
- MYSQL基础笔记(六)- 数据类型一
数据类型(列类型) 所谓数据烈性,就是对数据进行统一的分类.从系统角度出发时为了能够使用统一的方式进行管理,更好的利用有限的空间. SQL中讲数据类型分成三大类:1.数值类型,2.字符串类型和时间日期 ...
- MYSQL基础笔记(五)- 练习作业:站点统计练习
作业:站点统计 1.将用户的访问信息记录到文件中,独占一行,记录IP地址 <?php //站点统计 header('Content-type:text/html;charset=utf-8'); ...
- MYSQL基础笔记(四)-数据基本操作
数据操作 新增数据:两种方案. 1.方案一,给全表字段插入数据,不需要指定字段列表,要求数据的值出现的顺序必须与表中设计的字段出现的顺序一致.凡是非数值数据,到需要使用引号(建议使用单引号)包裹. i ...
- MYSQL基础笔记(三)-表操作基础
数据表的操作 表与字段是密不可分的. 新增数据表 Create table [if not exists] 表名( 字段名 数据类型, 字段名 数据类型, 字段n 数据类型 --最后一行不需要加逗号 ...
- MYSQL基础笔记(二)-SQL基本操作
SQL基本操作 基本操作:CRUD,增删改查 将SQL的基本操作根据操作对象进行分类: 1.库操作 2.表操作 3.数据操作 库操作: 对数据库的增删改查 新增数据库: 基本语法: Create da ...
- MYSQL基础笔记(一)
关系型数据库概念: 1.什么是关系型数据库? 关系型数据库:是一种建立在关系模型(数学模型)上的数据库 关系模型:一种所谓建立在关系上的模型. 关系模型包含三个方面: 1.数据结构:数据存储的问题,二 ...
- JavaScript基础笔记二
一.函数返回值1.什么是函数返回值 函数的执行结果2. 可以没有return // 没有return或者return后面为空则会返回undefined3.一个函数应该只返回一种类型的值 二.可变 ...
随机推荐
- BZOJ 1935: [Shoi2007]Tree 园丁的烦恼( 差分 + 离散化 + 树状数组 )
假如矩阵范围小一点就可以直接用二维树状数组维护. 这道题, 差分答案, 然后一维排序, 另一维离散化然后树状数组维护就OK了. ----------------------------------- ...
- 50句高级SQL语句
一个题目涉及到的50个Sql语句 --(下面表的结构以给出,自己在数据库中建立表.并且添加相应的数据,数据要全面些. 其中Student表中,SId为学生的ID) ------------------ ...
- codeforces 55D. Beautiful numbers 数位dp
题目链接 一个数, 他的所有位上的数都可以被这个数整除, 求出范围内满足条件的数的个数. dp[i][j][k], i表示第i位, j表示前几位的lcm是几, k表示这个数mod2520, 2520是 ...
- codeforces 377B Preparing for the Contest 二分+优先队列
题目链接 给你m个bug, 每个bug都有一个复杂度.n个人, 每个人有两个值, 一个是能力值, 当能力值>=bug的复杂度时才可以修复这个bug, 另一个是雇佣他需要的钱,掏一次钱就可以永久雇 ...
- MacOS copy图标shell脚本
不会shell 同学做的... 可以看见在当前文件夹下创建了一个icons文件夹 最后还压缩了文件夹 #!/bin/bash # readPlist [plist] [key] function r ...
- Windows Phone 8.1 发送http 网络请求。
在windows phone 8.1 中可以用 HttpClient 类来发送http 请求. 例子: try { Uri uri = new Uri(@"http://api.map.ba ...
- Linux 中执行命令
第一步: 在txt文件(文件名为cmd_file)中写入代码:echo this is content! 第二步: 授权chmod 555 cmd_file 第三步: 运行 ./cmd_file -- ...
- 查看ORACLE 数据库及表信息
-- 查看ORACLE 数据库中本用户下的所有表 SELECT table_name FROM user_tables; -- 查看ORACLE 数据库中所有用户下的所有表 select user,t ...
- ONFI闪存数据通道接口标准
早期的闪存产品每个厂家的设计标准各有不同,会碰到各种各样的问题,特别是到了06年之后,闪存产业市场需求开始发力,造成了迫切需要一个统一的标准来改变这个问题. 2007年1月,以英特尔,镁光,海力士,意 ...
- 深度探索QT窗口系统(五篇)
窗口作为界面编程中最重要的部分,没有窗口就没有界面,是窗口让我们摆脱了DOS时代,按钮是一个窗口,文本框是一个窗口,标签页是一个窗口,...一个窗口可以由多个窗口组成,每天我们都在与窗口打交道,当你打 ...