CPF 入门教程 - 绘图(四)
CPF NetCore跨平台UI框架,增加了Vlc支持跨平台播放视频。
系列教程
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);
}
}
}
其中Background 是 ViewFill 类型,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 入门教程 - 绘图(四)的更多相关文章
- CPF 入门教程 - 控件布局(六)
CPF netcore跨平台桌面UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) C ...
- CPF 入门教程 - 设计器和模板库的使用(五)
CPF netcore跨平台UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) CPF ...
- CPF 入门教程 - 属性和事件(七)
CPF C#跨平台桌面UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) CPF 入门 ...
- CPF 入门教程 - 各个控件介绍(八)
CPF C#跨平台桌面UI框架 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - 样式和动画(三) CPF 入门教程 - 绘图(四) CPF 入门 ...
- CPF 入门教程 - 各平台各系统发布说明(九)
CPF C#跨平台桌面UI框架,支持Windows,Mac,Linux,支持龙芯.飞腾等CPU 系列教程 CPF 入门教程(一) CPF 入门教程 - 数据绑定和命令绑定(二) CPF 入门教程 - ...
- WCF入门教程(四)通过Host代码方式来承载服务
WCF入门教程(四)通过Host代码方式来承载服务 之前已经讲过WCF对外发布服务的具体方式. WCF入门教程(一)简介 Host承载,可以是web,也可以是控制台程序等等.比WebService有更 ...
- Docker入门教程(四)Docker Registry
Docker入门教程(四)Docker Registry [编者的话]DockerOne组织翻译了Flux7的Docker入门教程,本文是系列入门教程的第四篇,介绍了Docker Registry,它 ...
- 无废话ExtJs 入门教程十四[文本编辑器:Editor]
无废话ExtJs 入门教程十四[文本编辑器:Editor] extjs技术交流,欢迎加群(201926085) ExtJs自带的编辑器没有图片上传的功能,大部分时候能够满足我们的需要. 但有时候这个功 ...
- SQLite 入门教程(四)增删改查,有讲究 (转)
转于: SQLite 入门教程(四)增删改查,有讲究 一.插入数据 INSERT INTO 表(列...) VALUES(值...) 根据前面几篇的内容,我们可以很轻送的创建一个数据表,并向其中插入一 ...
随机推荐
- Vue管理系统前端系列六动态路由-权限管理实现
目录 为什么要使用动态路由? 主流的两种实现方式 前端控制 后端控制 后端控制路由 实现 添加菜单接口 及 菜单状态管理 根据得到的菜单生成动态路由 根据 vuex 中的暂存的菜单生成侧边菜单栏 退出 ...
- pandas参数设置小技巧
在日常使用pandas的过程中,由于我们所分析的数据表规模.格式上的差异,使得同样的函数或方法作用在不同数据上的效果存在差异. 而pandas有着自己的一套参数设置系统,可以帮助我们在遇到不同的数据时 ...
- 精讲响应式WebClient第4篇-文件上传与下载
本文是精讲响应式WebClient第4篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方 ...
- Docker 学习笔记(一)
Docker 入门 Docker 学习 概述 安装 命令 镜像命令 容器命令 操作命令 Docker 镜像 容器数据卷 DockerFile Docker网络原理 IDEA 整合Docker 单机版D ...
- Python最火的第三方开源测试框架 ——pytest
一.介绍 本篇文章是介绍的是Python 世界中最火的第三方单元测试框架:pytest.它有如下主要特性: assert 断言失败时输出详细信息(再也不用去记忆 self.assert* 名称了) 自 ...
- [ASP.NET Core开发实战]基础篇03 中间件
什么是中间件 中间件是一种装配到应用管道,以处理请求和响应的组件.每个中间件: 选择是否将请求传递到管道中的下一个中间件. 可在管道中的下一个中间件前后执行. ASP.NET Core请求管道包含一系 ...
- Unity调试外部DLL
1.更改DLL的.csproj工程配置文件,在里面添加如下属性:<PropertyGroup Condition=" '$(OS)' == 'Unix' "> ...
- Commando War (贪心)
Waiting for orders we held in the wood, word from the front never came By evening the sound of the g ...
- Activiti7 提交任务
package com.itheima.activiti; import org.activiti.engine.ProcessEngine; import org.activiti.engine.P ...
- 仅显示sessionid,servername,serverport的一个springboot小程序
下载地址:https://files.cnblogs.com/files/xiandedanteng/sessionid20191227-1.zip --END-- 2019-12-2710:07