CPF NetCore跨平台UI框架,增加了Vlc支持跨平台播放视频。

系列教程

CPF 入门教程(一)

CPF 入门教程 - 数据绑定和命令绑定(二)

CPF 入门教程 - 样式和动画(三)

CPF 入门教程 - 绘图(四)

一般来说是不需要自己写绘图代码的,大部分UI效果通过控件元素(CPF.Shapes提供基础图形控件)组合和SVG组合就可以实现。

如果需要自定义控件绘制特殊的控件,可以继承Control或者UIElement重写OnRender方法来绘制自己需要的效果。调用 Invalidate 或者在依赖属性上设置AffectsRender来刷新界面。

        /// <summary>
/// 背景填充
/// </summary>
[UIPropertyMetadata(null, UIPropertyOptions.AffectsRender)]//属性变化之后自动刷新
public ViewFill Background
{
get { return (ViewFill)GetValue(); }
set { SetValue(value); }
}
        protected override void OnRender(DrawingContext dc)
{
var s = ActualSize; var rect = new Rect(0, 0, s.Width, s.Height); var ba = Background;
if (ba != null)
{//填充背景
using (var brush = ba.CreateBrush(rect, Root.RenderScaling))
{
dc.FillRectangle(brush, rect);
}
}
}

其中BackgroundViewFill 类型,ViewFill和Brush区别就是ViewFill和UI元素相关,可以支持相对或者绝对的效果,以及DPI的缩放。

绘图使用DrawingContext来操作,支持常规的图形绘制,比如线条,文字,路径等等。

使用剪辑区域的时候需要PushClip和PopClip配对,就是当你设置一个剪辑区域,使用完了之后你需要把你这个剪辑区域删除。可以设置多次剪辑区域,像括号一样配对和范围。

         dc.PushClip(rect);//设置一个剪辑区域
//绘图操作
dc.DrawImage(bmp, rect, rect.......
//..........
dc.PopClip();

矩阵使用

var old = dc.Transform;//获取原来的矩阵
var eff = old;
eff.Translate(-off.X + effectOffset.X, -off.Y + effectOffset.Y);//矩阵变换
dc.Transform = eff;//应用新矩阵 //绘图操作 dc.Transform = old;//恢复原来的

PathGeometry 支持WPF和SVG的path里的字符串格式数据,隐式转换。可以组合贝塞尔曲线,圆弧,线段等等用来绘制各种复杂的图形效果。再通过DrawingContext绘制出来

比如:

PathGeometry path="m85.33333,682.66667l853.33334,0l0,21.33333l-853.33334,0l0,-21.33333z";

在位图里绘图

 using (Bitmap bmp = new Bitmap(width, height))
{
using (var dc = DrawingContext.FromBitmap(bmp))
{
//绘图操作
}
}

Bitmap的指针和像素操作

        /// <summary>
/// 将图片转换成黑白色效果
/// </summary>
/// <param name="bmp">原图</param>
public static unsafe void GrayScale(Bitmap bmp)
{
//确定图像的宽和高
int height = bmp.Height;
int width = bmp.Width; using (var l = bmp.Lock())
{//l.DataPointer就是数据指针,一般不建议直接使用,因为不同平台,不同图形适配器,不同位图格式,数据格式不一样,那你就需要判断不同格式来遍历指针数据处理了
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
l.GetPixel(x, y, out byte a, out byte r, out byte g, out byte b);
var p = (byte)Math.Min(255, 0.7 * r + (0.2 * g) + (0.1 * b));
l.SetPixel(x, y, a, p, p, p);
} // x
} // y
}
}

CPF 入门教程 - 绘图(四)的更多相关文章

  1. CPF 入门教程 - 控件布局(六)

    CPF netcore跨平台桌面UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) C ...

  2. CPF 入门教程 - 设计器和模板库的使用(五)

    CPF netcore跨平台UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) CPF ...

  3. CPF 入门教程 - 属性和事件(七)

    CPF C#跨平台桌面UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) CPF 入门 ...

  4. CPF 入门教程 - 各个控件介绍(八)

    CPF C#跨平台桌面UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) CPF 入门 ...

  5. CPF 入门教程 - 各平台各系统发布说明(九)

    CPF C#跨平台桌面UI框架,支持Windows,Mac,Linux,支持龙芯.飞腾等CPU 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - ...

  6. WCF入门教程(四)通过Host代码方式来承载服务

    WCF入门教程(四)通过Host代码方式来承载服务 之前已经讲过WCF对外发布服务的具体方式. WCF入门教程(一)简介 Host承载,可以是web,也可以是控制台程序等等.比WebService有更 ...

  7. Docker入门教程(四)Docker Registry

    Docker入门教程(四)Docker Registry [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第四篇,介绍了Docker Registry,它 ...

  8. 无废话ExtJs 入门教程十四[文本编辑器:Editor]

    无废话ExtJs 入门教程十四[文本编辑器:Editor] extjs技术交流,欢迎加群(201926085) ExtJs自带的编辑器没有图片上传的功能,大部分时候能够满足我们的需要. 但有时候这个功 ...

  9. SQLite 入门教程(四)增删改查,有讲究 (转)

    转于: SQLite 入门教程(四)增删改查,有讲究 一.插入数据 INSERT INTO 表(列...) VALUES(值...) 根据前面几篇的内容,我们可以很轻送的创建一个数据表,并向其中插入一 ...

随机推荐

  1. JDBC | 第一章: 快速开始使用JDBC连接Mysql数据库?

    开始使用基于java的JDBC技术来连接mysql进行msyql数据库简单的CRUD操作 下载对应mysql驱动包 这里我创建maven项目基于maven下载 <!--mysql 驱动--> ...

  2. Python 控制台输出时刷新当前行内容而不是输出新行

    需求目标 执行Python程序的时候在控制台输出内容的时候只显示一行,然后自动刷新内容,像这样: Downloading File FooFile.txt [%] 而不是这样: Downloading ...

  3. 企业站如何做长尾关键词seo优化

    http://www.wocaoseo.com/thread-315-1-1.html     很多企业站,优化到一定程度后网站的流量很快就上去了,但是之后网站就无法更进一步.那么对于普通中小型企业站 ...

  4. vue-x和axios的学习

    axios的使用 使用原因:因为vue本身就带有处理dom的功能,不希望再有其他操作dom的插件,所以用axios代替了jquery 功能:发送xhr请求 下载: $ npm install axio ...

  5. 力扣Leetcode 560. 和为K的子数组

    和为K的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数. 示例 : 输入:nums = [1,1,1], k = 2 输出: 2 , [1,1] 与 [1,1 ...

  6. mysql 安装卸载自动化脚本

    #!/bin/sh #mkdir /root/mysql #tar -xvf mysql-5.7.-.el7.x86_64.rpm-bundle.tar -C /root/mysql #cd /roo ...

  7. [ASP.NET Core开发实战]基础篇04 主机

    主机定义 主机是封闭应用资源的对象. 设置主机 主机通常由 Program 类中的代码配置.生成和运行. HTTP项目(ASP.NET Core项目)创建泛型主机: public class Prog ...

  8. Android开发,java开发程序员常见面试题,求100-200之间的质数,java逻辑代码

    public class aa{ public static void main (String args []){ //author:qq986945193 for (int i = 100;i&l ...

  9. layaair

    LayaAir之设置反向遮罩镂空遮罩挖洞模式 https://blog.csdn.net/qq_20342915/article/details/100690786 Sprite--新手引导 http ...

  10. cordova 环境配制和创建插件

    环境配制 英文网站:http://cordova.apache.org/ 中文网站:http://cordova.axuer.com/ 安装Cordova Cordova的命令行运行在Node.js ...