在WPF中制作正圆形公章
原文:在WPF中制作正圆形公章
之前,我利用C#与GDI+程序制作过正圆形公章(利用C#制作公章 ,C#制作公章[续])并将它集成到一个小软件中(个性印章及公章的画法及实现),今天我们来探讨一下WPF中如何制作正圆形公章。
先看大致效果:
图1
制作前,我们首先来分析技术难点和要点:
1、首先,我们需要设置公章的起始位置,公章的直径等。
2、再根据这些来确定公章的中心点。有了中心点之后,我们才可以计算中间正五角星的中心以及公章中文字的旋转中心点。
3、计算公章中每个文字的旋转角度,然后复制、复制、再复制。
从上图中可以看出,当文字为英文字母时,会有位置偏移问题,后面我将说明如何解决这种问题。最终解决结果类似于下图(注意字母A居于正中间):
图2
制作步骤:(这里只是相关XAML代码的展示,未含C#代码)
1. 首先画外面的正圆:
<Ellipse Margin="0,1,0,0" VerticalAlignment="Top" Height="248" Fill="{x:Null}" Stroke="#FFFF0000" x:Name="EllipseBorder" HorizontalAlignment="Left" Width="248" StrokeThickness="1"/>
这里没什么好说的,正圆的高、宽度均为248,边线使用#FFFF0000(红色),边框宽度为1,如果你认为外框还不够粗,可以将StrokeThickness设置为合适的值,比如2。
2. 制作一个公章文字作为“样本”。
先制作一个样本,后面的部分利用程序COPY即可。为了更方便讲述,我们先假设公章文字个数为奇数,这样,最中间的一个文字就正好放在圆形的正上方。如果公章文字个数不是奇数而是偶数,我们后面利用程序来做。
这里,制作正中间的文字,如下图的正中间最上方那个“科”字。
这是XAML代码:
<TextBlock RenderTransformOrigin="0.500,2.925" HorizontalAlignment="Left" Margin="104.333,4.332,0,0" x:Name="TopCenter" VerticalAlignment="Top" Width="36" Height="40" FontSize="36" Text="科" TextWrapping="Wrap" Foreground="#FFFF0000" TextAlignment="Center">
<TextBlock.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="0.8" ScaleY="1"/>
<SkewTransform AngleX="0" AngleY="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform X="0" Y="0"/>
</TransformGroup>
</TextBlock.RenderTransform>
</TextBlock>
注意上面代码中的加粗部分:
(1)RenderTransformOrigin属性
它指明文字旋转的中心点。这里0.5,2.925是对文字的正常字身高而言的。这就意味着此值是旋转中心点(这里就是下图中正五角星之正中间所示的圆形白点处)在离TextBlock左上角相对于正常字身高的水平、垂直比率。请仔细观察下图旋转中心点相对于“科”字左上角的X,Y方向的比率。想想看,假如是在文字正中间进行旋转呢?(此时,RenderTransformOrigin属性值大致应该是0.5,0.5)
图3
(2)TextAlignment属性
它指明文字相对于TextBlock外框(它的宽度 Width="36",高度Height="40")的文本对齐位置。
(3)ScaleTransform:
这里有 ScaleX和ScaleY属性。其中,ScaleX控制文字的水平缩放比率,这里是"0.8",即缩放为正常FontSize字身的80%;同理,ScaleY控制文字的垂直方向的比率,这里是"1",即不缩放。
(4)RotateTransform:
它有一个 Angle属性,用来设置旋转的角度值,单位为“度”,一周为360度,不旋转时为0。这里为"0",表示不旋转。顺时针计算为正值,逆时针为负值。
3、按照“样本”,依葫芦画瓢。
由于下面的均使用C#代码进行控制,所以,我这里只是简单列出一个左下角的第一个公章文字的XAML代码:
<TextBlock RenderTransformOrigin="0.500,2.942" x:Name="TopCenter_Copy" Width="36" Height="40" FontSize="36" Text="科" TextWrapping="Wrap" Foreground="#FFFF0000" HorizontalAlignment="Left" Margin="105.667,6.333,0,0" VerticalAlignment="Top" TextAlignment="Center">
<TextBlock.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="0.8" ScaleY="1"/>
<SkewTransform AngleX="0" AngleY="0"/>
<RotateTransform Angle="-120"/>
<TranslateTransform X="0" Y="0"/>
</TransformGroup>
</TextBlock.RenderTransform>
</TextBlock>
(其他的文字我们在后面用C#代码进行控制)
4、画中间的正五角星:
<Path StrokeThickness="1.000000" Stroke="{x:Null}" Fill="#FFFF0000" Data="F1 M 55.467773,1.628906 L 68.130859,40.893066 L 109.385742,40.802734 L 75.957031,64.979004 L 88.791016,104.187500 L 55.467773,79.865234 L 22.144531,104.187500 L 34.978516,64.979004 L 1.549805,40.802734 L 42.804688,40.893066 L 55.467773,1.628906 Z" Margin="68,68,0,0" RenderTransformOrigin="0.5,0.5" HorizontalAlignment="Left" VerticalAlignment="Top" Width="Auto" Height="Auto">
<Path.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleX="0.68" ScaleY="0.68"/>
<SkewTransform AngleX="0" AngleY="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform X="0" Y="0"/>
</TransformGroup>
</Path.RenderTransform>
</Path>
这里使用了WPF中的Path,它相当于GDI+中的GraphicsPath,其中:
(1)Fill属性指定内部填充颜色,这里是红色(#FFFF0000),如果你对颜色不太了解,可以看看这篇《GDI+与WPF中的颜色简析》。
(2)Data属性设置路径的相关数据。
(3)上面还对路径进行了缩放,水平和垂直大小均缩放为原来的0.68倍。
接下来的问题是:如何用C#代码来进行自动控制?
因此,我们需要将上面的XAML代码转换为C#代码,并程序绘制上述未完成的部分。由于篇幅及时间限制,就在下一篇中讲述吧。
本文的后续版本:
WPF正圆形公章制作之2 (http://blog.csdn.net/johnsuna/archive/2008/04/28/2336495.aspx)
在WPF中制作正圆形公章的更多相关文章
- WPF中制作无边框窗体
原文:WPF中制作无边框窗体 众所周知,在WinForm中,如果要制作一个无边框窗体,可以将窗体的FormBorderStyle属性设置为None来完成.如果要制作成异形窗体,则需要使用图片或者使用G ...
- WPF中制作立体效果的文字或LOGO图形(续)
原文:WPF中制作立体效果的文字或LOGO图形(续) 上篇"WPF中制作立体效果的文字或LOGO图形"(http://blog.csdn.net/johnsuna/archive/ ...
- WPF中制作立体效果的文字或LOGO图形
原文:WPF中制作立体效果的文字或LOGO图形 较久之前,我曾写过一篇:"WPF绘制党徽(立体效果,Cool) "的博文.有感兴趣的朋友来EMAIL问是怎么制作的?本文解决此类问题 ...
- WPF中制作带中国农历的万年历
原文:WPF中制作带中国农历的万年历 本例应用.net 2.0中的ChineseLunisolarCalendar类,制作出带中国农历的万年历. 先看看效果图片(已缩小,原始图片为:http://p ...
- 01.WPF中制作无边框窗体
[引用:]http://blog.csdn.net/johnsuna/article/details/1893319 众所周知,在WinForm中,如果要制作一个无边框窗体,可以将窗体的FormB ...
- 用OxyPlot在WPF中演示正演磁异常的变化规律
为了在展示实验成果时动态演示理论球体磁异常随其埋深.磁化倾角的变化规律,我用WPF写了一个小程序来作演示. MatLab计算磁异常数据 首先是计算理论球体磁异常数据,在Matlab中可以很方便地计算. ...
- 【WinRT】【译】【加工】在 XAML 中制作圆形图片
原文:[WinRT][译][加工]在 XAML 中制作圆形图片 原文地址:http://timheuer.com/blog/archive/2015/05/06/making-circular-ima ...
- WPF中桌面屏保的制作(主要代码)
原文:WPF中桌面屏保的制作(主要代码) 制作要点:(1) 使用System.Windows.Threading.DispatcherTimer;(2) 将Window属性设置为: this ...
- 在WPF设计工具Blend2中制作立方体图片效果
原文:在WPF设计工具Blend2中制作立方体图片效果 ------------------------------------------------------------------------ ...
随机推荐
- 【EasyUi】页面设计必学之Layout
接触EasyUi也快一年了.非常多时候都把重心放在实现功能方面.要显示大量数据了就用DataGrid,要实现分页效果了就想着Tabs,如此等等,再接下来就是考虑CSS.js怎样让这个功能实现的更好. ...
- 使用u盘量产工具修复写保护的u盘
自己的u盘突然提示写保护,而且也没有写保护开关,怎么都写不进文件,试了很多办法都无法去除写保护,最后找了一个u盘量产工具,搞定: 插上u盘后,会检测到u盘,点“开始"后静静等待它完成,u盘又 ...
- 关于心理的二十五种倾向(查理·芒格)-3
9)回馈倾向人们早就发现.和猿类,猴类,狗类等其它很多认知能力较为低下的物种同样,人类身上也有以德报德,以牙还牙的极端倾向:这样的倾向明显能够促进有利于成员利益的团体合作.这跟非常多社会性的动物的基因 ...
- 从Set里面取出有序的记录
Set里面的记录是无序的.假设想使用Set,然后又想里面的记录是有序的,就能够使用TreeSet.而不是HashSet.在使用TreeSet的时候,里面的元素必须是实现了Comparable接口的,T ...
- Linux 系统挂载数据盘 分类: B3_LINUX 2015-01-30 18:13 228人阅读 评论(0) 收藏
适用系统:Linux(Redhat , CentOS,Debian,Ubuntu) * Linux的云服务器数据盘未做分区和格式化,可以根据以下步骤进行分区以及格式化操作. 下面的操作将会把数据盘划 ...
- linux的任务计划 定时任务 计划任务
例如要定时访问一个指定的url 先看看系统有没有crontab
- 创建ListView的基本步骤 分类: H1_ANDROID 2013-10-31 23:25 1276人阅读 评论(0) 收藏
参考<疯狂android讲义>第2.5节P94 1.创建一个或者多个ListView <LinearLayout xmlns:android="http://schemas ...
- c# 读/写文件(各种格式)
最简单的: --------写 //content是要写入文本的字符串 //(@txtPath + @"\" + rid + ".txt");要被写入的TXT ...
- php课程 5-19 php数据结构函数和常用函数有哪些
php课程 5-19 php数据结构函数和常用函数有哪些 一.总结 一句话总结: 1.php数据结构函数有哪些(四个)? • array_pop();从最后弹出一个值,返回弹出值• array_pus ...
- js判断是否微信客户端
上周接到个需求,需求是这样的:用户扫一扫二维码会产生一个链接,该链接会向后端发送个请求,返回一个 apk 的下载地址,用户点击下载按钮可以下载此 apk.然后就发生了问题,经过测试,发现用微信扫一扫打 ...