it编程 > 编程语言 > Asp.net

C#中的Drawing 类案例详解

36人参与 2025-08-08 Asp.net

一、drawing 是什么?

命名空间

继承链(wpf)

常用派生类:

特点

二、典型用法

三、案例:画一个“带阴影的圆角矩形按钮”

目标:

wpf:

<window x:class="demodrawing.mainwindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        title="drawing 示例" width="300" height="200">
    <grid>
        <!-- 使用 drawingbrush 做背景 -->
        <rectangle x:name="btnrect" width="180" height="60"
                   mouseenter="btnrect_mouseenter"
                   mouseleave="btnrect_mouseleave">
            <rectangle.resources>
                <!-- 阴影 drawing -->
                <geometrydrawing x:key="shadow"
                                 geometry="m 5,5 175,5 175,55 5,55 z"
                                 brush="#80000000">
                    <geometrydrawing.pen>
                        <pen brush="transparent" thickness="1"/>
                    </geometrydrawing.pen>
                </geometrydrawing>
                <!-- 按钮主体 drawing -->
                <geometrydrawing x:key="body" geometry="m 0,0 170,0 170,50 0,50 z">
                    <geometrydrawing.brush>
                        <lineargradientbrush startpoint="0,0" endpoint="0,1">
                            <gradientstop offset="0"  color="#ff4c9aff"/>
                            <gradientstop offset="1"  color="#ff0050dd"/>
                        </lineargradientbrush>
                    </geometrydrawing.brush>
                    <geometrydrawing.pen>
                        <pen brush="#ff003399" thickness="2"/>
                    </geometrydrawing.pen>
                </geometrydrawing>
                <!-- 组合 drawinggroup -->
                <drawinggroup x:key="combined">
                    <!-- 先画阴影 -->
                    <drawinggroup.children>
                        <drawinggroup>
                            <drawinggroup.children>
                                <staticresource resourcekey="shadow"/>
                            </drawinggroup.children>
                            <drawinggroup.bitmapeffect>
                                <blurbitmapeffect radius="5"/>
                            </drawinggroup.bitmapeffect>
                        </drawinggroup>
                        <!-- 再画按钮主体 -->
                        <staticresource resourcekey="body"/>
                    </drawinggroup.children>
                </drawinggroup>
                <!-- 把 drawinggroup 变成 brush -->
                <drawingbrush x:key="btnbrush" drawing="{staticresource combined}"/>
            </rectangle.resources>
            <rectangle.fill>
                <staticresource resourcekey="btnbrush"/>
            </rectangle.fill>
        </rectangle>
    </grid>
</window>

后台代码

public partial class mainwindow : window
{
    public mainwindow()
    {
        initializecomponent();
    }
    private void btnrect_mouseenter(object sender, mouseeventargs e)
    {
        // 找到 drawing 里的渐变刷
        var rect = (rectangle)sender;
        var brush = (drawingbrush)rect.fill;
        var dg = (drawinggroup)brush.drawing;
        var body = (geometrydrawing)((drawinggroup)dg.children[1]).children[0];
        var lg = (lineargradientbrush)body.brush;
        // 动画高亮
        var da = new coloranimation(color.fromrgb(0x6f, 0xba, 0xff),
                                    timespan.frommilliseconds(300));
        lg.gradientstops[0].beginanimation(gradientstop.colorproperty, da);
    }
    private void btnrect_mouseleave(object sender, mouseeventargs e)
    {
        var rect = (rectangle)sender;
        var brush = (drawingbrush)rect.fill;
        var dg = (drawinggroup)brush.drawing;
        var body = (geometrydrawing)((drawinggroup)dg.children[1]).children[0];
        var lg = (lineargradientbrush)body.brush;
        var da = new coloranimation(color.fromrgb(0x4c, 0x9a, 0xff),
                                    timespan.frommilliseconds(300));
        lg.gradientstops[0].beginanimation(gradientstop.colorproperty, da);
    }
}

四、winforms(gdi+)对应写法

winforms 没有 drawing 类,而是 graphicspath + lineargradientbrush + bitmap 的“即时模式”绘制。核心步骤:

protected override void onpaint(painteventargs e)
{
    var g = e.graphics;
    g.smoothingmode = smoothingmode.antialias;
    // 1. 阴影
    using (var path = createroundrect(5, 5, 175, 55, 8))
    using (var brush = new solidbrush(color.fromargb(128, 0, 0, 0)))
    using (var blur = new bitmap(180, 60))
    {
        using (var g2 = graphics.fromimage(blur))
        {
            g2.smoothingmode = smoothingmode.antialias;
            g2.fillpath(brush, path);
        }
        // 手动高斯模糊(略)...
        g.drawimage(blur, 0, 0);
    }
    // 2. 主体
    using (var path = createroundrect(0, 0, 170, 50, 8))
    using (var brush = new lineargradientbrush(
        new point(0, 0), new point(0, 50),
        color.fromargb(255, 0x4c, 0x9a, 0xff),
        color.fromargb(255, 0x00, 0x50, 0xdd)))
    using (var pen = new pen(color.fromargb(255, 0x00, 0x33, 0x99), 2))
    {
        g.fillpath(brush, path);
        g.drawpath(pen, path);
    }
}
private graphicspath createroundrect(float x, float y, float w, float h, float r)
{
    var gp = new graphicspath();
    gp.addarc(x + w - r, y, r, r, 270, 90);
    gp.addarc(x + w - r, y + h - r, r, r, 0, 90);
    gp.addarc(x, y + h - r, r, r, 90, 90);
    gp.addarc(x, y, r, r, 180, 90);
    gp.closefigure();
    return gp;
}

到此这篇关于c#drawing 类详解的文章就介绍到这了,更多相关c# drawing 类内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

您想发表意见!!点此发布评论

推荐阅读

使用C#将DataTable导出为Excel文件的实现教程

08-08

C#实现ESC退出窗口的三种方法

08-11

通过C#调用Windows API的具体方法

08-11

visual studio 如何升级更新版本

08-11

C#实现磁盘空间实时预警监控功能

08-12

C#控制台程序同步调用WebApi实现方式

08-12

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论