color的alpha值
color也可以设定alpha值,也就是透明度。如color.fromargb(120,255,255,255)。fromargb有四个参数,第一个就指定了alpha值。
后面三个是颜色值rgb。
alpha值的范围是0~255,0表示完全透明,255表示不透明。
看一个半透明的画刷示例吧:
private void formpaint(object sender, painteventargs e)
{
//创建路径
graphicspath path = new graphicspath();
rectangle rect = new rectangle(0, 0, 100, 100);
solidbrush strbrush=new solidbrush(color.orange);
e.graphics.drawstring(abcdefghijk, new font(黑体, 20f), strbrush, rect);
path.addrectangle(rect);
//创建路径画刷
pathgradientbrush brush = new pathgradientbrush(path);
//中心点颜色
brush.centercolor = color.fromargb(120,255,255,255);
//路径(点)上的颜色
brush.surroundcolors = new color[] { color.fromargb(120,0,0,0)};
//用路径画刷填充一个矩形
e.graphics.fillrectangle(brush, rect);
}
如果画刷的颜色没有设置alpha(透明)值,那么是看不到显示的字符串的。
反锯齿
消除线条的锯齿,通过设置graphics类里的smoothingmode属性成员来完成,这是一个枚举类型。
设置消除锯齿的示例语句: e.graphics.smoothingmode = smoothingmode.antialias;
消除了锯齿,线条看起来就平滑了许多。
对应代码是:
pen pen=new pen(color.green,2);
rectangle rect1 = new rectangle(0, 0, 100, 100);
e.graphics.drawellipse(pen, rect1);
//消除锯齿
e.graphics.smoothingmode = smoothingmode.antialias;
//100宽,100高
rectangle rect2 = new rectangle(100, 0, 100, 100);
e.graphics.drawellipse(pen, rect2);
smoothingmode枚举还有一些其它成员,可以设置不同程度的反锯齿,也可以设置不消除锯齿。
文本反锯齿
显示的文本要消除锯齿设置textrenderinghint就可以了。
示例代码:
private void formpaint(object sender, painteventargs e)
{
solidbrush brush = new solidbrush(color.green);
e.graphics.drawstring(abcdefghijkl, new font(宋体, 15f), brush, 0, 20);
//消除锯齿
e.graphics.textrenderinghint = system.drawing.text.textrenderinghint.antialias;
e.graphics.drawstring(abcdefghijkl, new font(宋体, 15f), brush, 0, 50);
}
区域
这些函数最好了解一下,因为c#也可以调用这些api的。而且里面的概念很多都是相通的。比如窗口句柄,区域句柄。
如region类里的gethrgn函数,可以获得区域句柄。
另外说一下区域跟路径的关系,这样就可以更好的理解区域是怎么一回事了,区域跟路径的关系就像填充图形跟图形的关系,
可以用路径和矩形来创建一个区域。通过region的构造函数。
如下示例,用矩形创建两个区域,并填充这两个区域。
private void formpaint(object sender, painteventargs e)
{
//两个100宽高的矩形区域
region region1=new region(new rectangle(0,0,100,100));
region region2=new region(new rectangle(50,50,100,100));
//创建画刷1,并填充区域1,颜色的alpha值是125
solidbrush brush1 = new solidbrush(color.fromargb(125, 255, 0, 0));
e.graphics.fillregion(brush1, region1);
//创建画刷2,并填充区域2
solidbrush brush2 = new solidbrush(color.fromargb(125, 0, 255, 0));
e.graphics.fillregion(brush2, region2);
}
另外也可以合并两个区域,合并区域在第九十五个函数combinergn里也讲过了,可以参考一下那个函数。
combinergn api函数的最后一个参数ncombinemode指明如何合并两个区域,那么region类里的合并也应该有类似的功能。
指明如何合并,不过region类不是用参数来指明,region是直接调用不同的函数。
比如region.intersect函数就是rgn_and ,region.union就是rgn_or方式合并。。region1.exclude是rgn_diff ,
region.xor是rgn_xor方式合并
关于ncombinemode参数的解释:
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>来自api combinergn函数>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
rgn_and 两个区域的重叠部分
rgn_or 组合两个区域
rgn_diff hsrcrgn1未重叠的部分
rgn_xor hsrcrgn1和hsrcrgn2未重叠的部分
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
region类里还有个函数complement,用这个函数合并得到的区域是区域2未重叠的部分。
看示例吧:
private void formpaint(object sender, painteventargs e)
{
//两个100宽高的矩形区域
region region1=new region(new rectangle(0,0,100,100));
region region2=new region(new rectangle(50,50,100,100));
//用xor函数合并区域,得到的是两个区域未重叠部分的区域。
region1.xor(region2);
//创建画刷,填充合并后的区域
solidbrush brush = new solidbrush(color.green);
e.graphics.fillregion(brush, region1);
}
设置窗口显示区域:
指定form类里的region属性成员就行了,比如显示一个圆形窗口:
public form1()
{
initializecomponent();
//创建一个圆形路径
graphicspath path = new graphicspath();
path.addellipse(0, 0, 100, 100);
//通过路径创建区域
region region = new region(path);
//指定窗口显示区域
this.region = region;
}
region.isvisible判断一个点(或者矩形)是否在区域内
看示例,例子中创建了一个圆形区域,只要鼠标一进入这个圆形区域,这个区域就显示红色。
public partial class form1 : form
{
//区域正常状态下填充的画刷
public solidbrush norbrush=new solidbrush(color.green);
//鼠标在区域内时填充的画刷
public solidbrush hovbrush = new solidbrush(color.red);
//标明鼠标是否在区域内
public bool hovflag = false;
//圆形区域
public region region;
public form1()
{
initializecomponent();
//创建圆形路径
graphicspath path = new graphicspath();
path.addellipse(50, 50, 100, 100);
//通过路径创建区域
region = new region(path);
//添加事件处理
this.paint += formpaint;
//鼠标移动事件
this.mousemove += frommousemove;
}
private void formpaint(object sender, painteventargs e)
{
if (hovflag)
{
e.graphics.fillregion(hovbrush, region);
}
else
{
e.graphics.fillregion(norbrush, region);
}
}
//鼠标移动事件处理函数
private void frommousemove(object sender, mouseeventargs e)
{
graphics graphics = this.creategraphics();
//鼠标初次进入区域
if (region.isvisible(e.x, e.y) && hovflag != true)
{
hovflag = true;
graphics.fillregion(hovbrush, region);
}
//鼠标离开区域了
else if (region.isvisible(e.x, e.y) != true && hovflag)
{
hovflag = false;
graphics.fillregion(norbrush, region);
}
}
}
更多 c# gdi+编程(三)。