原文:在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中制作正圆形公章的更多相关文章

  1. WPF中制作无边框窗体

    原文:WPF中制作无边框窗体 众所周知,在WinForm中,如果要制作一个无边框窗体,可以将窗体的FormBorderStyle属性设置为None来完成.如果要制作成异形窗体,则需要使用图片或者使用G ...

  2. WPF中制作立体效果的文字或LOGO图形(续)

    原文:WPF中制作立体效果的文字或LOGO图形(续) 上篇"WPF中制作立体效果的文字或LOGO图形"(http://blog.csdn.net/johnsuna/archive/ ...

  3. WPF中制作立体效果的文字或LOGO图形

    原文:WPF中制作立体效果的文字或LOGO图形 较久之前,我曾写过一篇:"WPF绘制党徽(立体效果,Cool) "的博文.有感兴趣的朋友来EMAIL问是怎么制作的?本文解决此类问题 ...

  4. WPF中制作带中国农历的万年历

    原文:WPF中制作带中国农历的万年历 本例应用.net 2.0中的ChineseLunisolarCalendar类,制作出带中国农历的万年历.  先看看效果图片(已缩小,原始图片为:http://p ...

  5. 01.WPF中制作无边框窗体

    [引用:]http://blog.csdn.net/johnsuna/article/details/1893319   众所周知,在WinForm中,如果要制作一个无边框窗体,可以将窗体的FormB ...

  6. 用OxyPlot在WPF中演示正演磁异常的变化规律

    为了在展示实验成果时动态演示理论球体磁异常随其埋深.磁化倾角的变化规律,我用WPF写了一个小程序来作演示. MatLab计算磁异常数据 首先是计算理论球体磁异常数据,在Matlab中可以很方便地计算. ...

  7. 【WinRT】【译】【加工】在 XAML 中制作圆形图片

    原文:[WinRT][译][加工]在 XAML 中制作圆形图片 原文地址:http://timheuer.com/blog/archive/2015/05/06/making-circular-ima ...

  8. WPF中桌面屏保的制作(主要代码)

    原文:WPF中桌面屏保的制作(主要代码) 制作要点:(1) 使用System.Windows.Threading.DispatcherTimer;(2) 将Window属性设置为:      this ...

  9. 在WPF设计工具Blend2中制作立方体图片效果

    原文:在WPF设计工具Blend2中制作立方体图片效果 ------------------------------------------------------------------------ ...

随机推荐

  1. java 封装解析 Json数据。

    import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; im ...

  2. Hadoop文件的基本操作 分类: A1_HADOOP 2014-12-05 11:36 392人阅读 评论(0) 收藏

    Hadoop提供了大量的API对文件系统中的文件进行操作,主要包括: (1)读取文件 (2)写文件 (3)读取文件属性 (4)列出文件 (5)删除文件 1、读取文件 以下示例中,将hdfs中的一个文件 ...

  3. 将String转化为Long,并将Long转化为Date 分类: B1_JAVA 2014-06-30 16:23 1249人阅读 评论(0) 收藏

    package org.ljh.test.javaee; import java.text.SimpleDateFormat; import java.util.Date; public class ...

  4. Intent七大属性之总结 分类: H1_ANDROID 2013-11-10 09:41 1074人阅读 评论(0) 收藏

    参考<疯狂android讲义>第5章 1.Intent 用于封装程序的"调用意图",不管想启动一个Acitivity.Service还是BroadcastReceive ...

  5. 并发队列ConcurrentLinkedQueue 和 阻塞队列LinkedBlockingQueue用法

    在Java多线程应用中,队列的使用率很高,多数生产消费模型的首选数据结构就是队列(先进先出).Java提供的线程安全的Queue可以分为阻塞队列和非阻塞队列,其中阻塞队列的典型例子是BlockingQ ...

  6. 后台返回的HTML整个页面代码打开方法

    后台返回的html代码片段,需要插入html标签中,而返回的整个html文档,则需要重写整个页面. 解决方法: 需要一个中转页面,用document.write()方法重写整个页面: // POST任 ...

  7. 前端Js框架汇总(工具多看)

    前端Js框架汇总(工具多看) 一.总结 一句话总结: 二.前端Js框架汇总 概述: 有些日子没有正襟危坐写博客了,互联网飞速发展的时代,技术更新迭代的速度也在加快.看着Java.Js.Swift在各领 ...

  8. 百度消息推送REST API探究

    一.百度云推送介绍 云推送(Push)是百度开放云向开发者提供的消息推送服务:通过利用云端与客户端之间建立稳定.可靠的长连接来为开发者提供向客户端应用推送实时消息服务. 百度云推送服务支持推送三种类型 ...

  9. [SVG] Optimize SVGs for Better Performance using svgo

    Just like a bitmap image, you can compress an SVG by removing various pieces of code that aren’t nec ...

  10. Expression Blend 的点滴(1)--ListBox华丽大变身

    原文:Expression Blend 的点滴(1)--ListBox华丽大变身 最近,在园子里有不少朋友写了关于Blend的优秀并且实用的文章,在此,我先代表silverlight的爱好者感谢他们的 ...