—前言

本文是学习C# GDI+系列的第一篇文章,简单的介绍了GDI+的一些基本绘图内容,比较粗糙。但本文主要是让大家简单的回顾一下GDI+的基本概念。本篇文章的参考代码请在此下载 。

GDIPTest_Article1_161112_2346.rar

如果有什么疑问,或者建议,请留言联系本人。

1 窗口重绘

—Windows自动处理鼠标拖动窗体、更改窗体大小等用户操作,自动调整窗体所占屏幕区域的大小,并进行重画
当需要重画时,Windows发送消息WM_PAINT
 
窗体对象的Paint事件用于响应WM_PAINT消息
–当窗体被挡住,并再次显示时
–当其他窗体在主窗体上移动时
–当主窗体的尺寸变大时
–Windows只重绘必要的区域,ClipRectangle属性
–调用Invalidate方法主动激发WM_PAINT消息
 

2. 绘图内容

—点  (Point)
—矩形  (Rectangle)
—颜色  (Color)
—笔  (Pen)
—画刷  (Brush)
—字体  (Font)
—路径  (GraphicsPath)
—区域  (Region)
 
—.Net中提供了两个数据结构表示绘图中的一点的坐标值:Point(X,Y)与PointF。其封装了两个变量,一个表示宽度,一个表示高度。
—大多数情况下,代码中指定的坐标、长度和宽度数值均为像素。可以使用Graphics的PageUnit属性来确定其他的单位。
 
Rectangle矩形
—某点是否在矩形内——Contains
—矩形的放大与缩小:Inflate(为正放大,为负缩小)
—求两个矩形的交集:Intersect
—求并集:Union
—平移:Offset
 
—颜色的HSB模型
—Hue:色调0…360
—Saturation:饱和度0…1
—Brightness:亮度0…1
—创建Color对象:
Color clr;
clr= Color.FromArgb(255, 255, 0, 255)
—另一个方法:
—Color.FromKnownColor(…)
—颜色的alpha值表示颜色的透明度。创建透明的对象,须将alpha值设置为小于‘255’、

 
 
—笔(Pen)
用于描绘线条
◦绘制线条、曲线、勾勒形状轮廓
◦创建笔对象后,可通过设置其属性,绘制出不同类型的线条
◦Width, Color
◦StartCap, EndCap:开始及结尾点的形状
◦DashStyle:设置虚线样式
 
—Brushes的类型
—创建Solid及Texture实心形状
—创建Hatch实心形状
—创建Gradient实心形状
—创建PathGradient实心形状
—创建Transparent实心形状
—动手实验:创建Brushes以及填充图形
 
—Brush对象用于填充图形
—SolidBrush: 纯色画刷
—HatchBrush: 图案画刷
◦–Windows提供的典型图案填充图形
—TextureBrush: 纹理画刷
—LinearGradientBrush: 渐变画刷
◦–用平滑过渡的颜色来填充一个图形
—PathGradientBrush: 路径渐变画刷
◦–基于某一路径,用复杂的混合色渐变进行填充
 
 
—使用gradient brush实现渐变的颜色
—使用path gradient brush实现用渐变的颜色填充图形,彩色渐变是从路径的中点到路径的外边界边缘的平滑的彩色渐变.
 
 
—绘制文本
◦需要Brush对象及Font对象
◦调用Graphics对象的DrawString方法绘制文本
—绘制文本技巧
◦指定文本绘制范围:提供矩形对象
◦控制换行:Environment.NewLine
◦绘制竖向文本:使用StringFormat对象
 
—GraphicsPath
此类封装了一系列相连接的直线、曲线、圆弧等围成的图形。
可通过Add系列方法来构造一个路径;通过CloseFigure方法自动完成路径的设置;通过Graphics的DrawPath方法来绘制路径,FillPath方法来填充路径
 
 
—区域(Region)
指绘图表面的一部分
—可以使用Rectangle或GraphicsPath对象来构造一个区域
—使用FillRegion对区域进行填充
—使用MakeInfinite将一个区域转换为无限区域
—可对区域进行类似于集合的操作
—可以使用Region对象得到特殊形状的窗体
 
—屏幕坐标系
 
—平移:
—g.TranslateTransform(100, 75)
—旋转
—g.RotateTransform(45)
 
—缩放:坐标系的缩放是指坐标原点不变,但单位长度所占的像素数目有变化;
—'水平放大两倍,垂直放大三倍
—g.ScaleTransform(2.0F, 3.0F)
 
—Bitmap
◦–位图是位的数组,它指定了像素矩阵中各像素的颜色。
—图形文件格式的类型
◦–BMP, GIF, JPEG, EXIF, PNG, TIFF
—旋转、倾斜及折射图像
◦–使用DrawImage方法并通过指定左上角、右上角、左下角的目标坐标来实现
—通过调用Image对象的GetThumbnailImage方法创建缩略图
 
在图像上输出字
—获取图像对象所在容器的Graphics对象g,然后,调用g的DrawString;

—或是获取图像本身的Graphics对象,并调用DrawString方法。
 
创建图像特效
—图像特效是依靠对图像的像素点直接进行操作实现的。并可对像素进行数学变换。
—其方法是
◦–调用GetPixel得到点的颜色,然后,进行相应处理后,再用SetPixel写回到图像中。
 
 
 
 
 

C# GDI+学习笔记1的更多相关文章

  1. GDI+学习笔记(六)渐变画笔

    刷,顾名思义,它是一样的刷.提请设备,还记得常唱歌曲,"我是一个画家.." 好吧.跑题了. 本系列博客希望尽可能简单的描写叙述每项功能,而不希望把每一个參数都介绍的详具体细,假设须 ...

  2. GDI+学习笔记

    7.1.1 GDI+概述 GDI+是微软在Windows 2000以后操作系统中提供的新的图形设备接口,其通过一套部署为托管代码的类来展现, 这套类被称为GDI+的“托管类接口”,GDI+主要提供了以 ...

  3. GDI+学习笔记(九)带插件的排序算法演示器(MFC中的GDI+实例)

    带插件的排序算法演示器 请尊重本人的工作成果,转载请留言.并说明转载地址,谢谢. 地址例如以下: http://blog.csdn.net/fukainankai/article/details/27 ...

  4. 学习笔记:利用GDI+生成简单的验证码图片

    学习笔记:利用GDI+生成简单的验证码图片 /// <summary> /// 单击图片时切换图片 /// </summary> /// <param name=&quo ...

  5. KTHREAD 线程调度 SDT TEB SEH shellcode中DLL模块机制动态获取 《寒江独钓》内核学习笔记(5)

    目录 . 相关阅读材料 . <加密与解密3> . [经典文章翻译]A_Crash_Course_on_the_Depths_of_Win32_Structured_Exception_Ha ...

  6. EPROCESS 进程/线程优先级 句柄表 GDT LDT 页表 《寒江独钓》内核学习笔记(2)

    在学习笔记(1)中,我们学习了IRP的数据结构的相关知识,接下来我们继续来学习内核中很重要的另一批数据结构: EPROCESS/KPROCESS/PEB.把它们放到一起是因为这三个数据结构及其外延和w ...

  7. .NET GC机制学习笔记

    学习笔记内容来自网络资料摘录http://www.cnblogs.com/springyangwc/archive/2011/06/13/2080149.html 1.GC介绍 Garbage Col ...

  8. C++内存管理学习笔记(6)

    /****************************************************************/ /*            学习是合作和分享式的! /* Auth ...

  9. Java学习笔记4

    Java学习笔记4 1. JDK.JRE和JVM分别是什么,区别是什么? 答: ①.JDK 是整个Java的核心,包括了Java运行环境.Java工具和Java基础类库. ②.JRE(Java Run ...

随机推荐

  1. How to say "no"?

    How to say "no"?7招教你如何拒绝别人      Do you have a hard time saying no to others? Do you say “y ...

  2. Android核心分析 之十Android GWES之基本原理篇

    Android GWES基本框架篇 我这里的GWES这个术语实际上从Microsoft 的Window上移植过来的,用GWES来表示Android的窗口事件系统不是那么准确,在Android中Wind ...

  3. stringbuffer与stringbuilder的区别?

    1. 在执行速度方面的比较:StringBuilder > StringBuffer 2. StringBuffer与StringBuilder,他们是字符串变量,是可改变的对象,每当我们用它们 ...

  4. QT中可以用QProgressBar或着QProgressDialog来实现进度条

    QProgressBar的使用 首先在designer中拖一个按钮和进度条部件,按下面初始化 //补充:下面两句写在MainWindow的构造函数里进行初始化 ui->progressBar-& ...

  5. QScrollArea可以帮助我们实现让一个widget的内容带有滚动条(QWidget里内置QScrollArea,QScrollArea里再内置其它QWidget)

    使用QScrollArea可以帮助我们实现让一个widget的内容带有滚动条,用户可以通过拖动滚动条来查看更多内容, 代码示例如下: 1.带有滚动条的widget列表 #include "w ...

  6. Oracle ->> 行转列, 列转行

    除了Pivot和Unpivot这两个函数,还有像CASE WHEN + 聚合函数像MAX,SUM这类的来完成.今天发现Oracle下居然有这样一个和SQL SERVER 2012以后新增的新函数叫II ...

  7. 卷积神经网络CNN全面解析

    卷积神经网络(CNN)概述 从多层感知器(MLP)说起 感知器 多层感知器 输入层-隐层 隐层-输出层 Back Propagation 存在的问题 从MLP到CNN CNN的前世今生 CNN的预测过 ...

  8. Grunt :任务自动管理工具

    来自<JavaScript 标准参考教程(alpha)>,by 阮一峰 在Javascript的开发过程中,经常会遇到一些重复性的任务,比如合并文件.压缩代码.检查语法错误.将Sass代码 ...

  9. Java安全编码之用户输入

    0x00 安全引言 1.传统Web应用与新兴移动应用 (1)传统Web应用:浏览器 HTTP 服务器(2)新兴移动应用:APP HTTP 服务器 从安全角度看,传统Web应用与新兴移动应用没有本质区别 ...

  10. find a filename from a filehandle in Perl

    my $filename='/tmp/tmp.txt';open my $fh, '>', $filename;my $fd = fileno $fh;print readlink(" ...