您好,欢迎访问一九零五行业门户网

C# GDI+编程(三)

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+编程(三)。
其它类似信息

推荐信息