如何使用C#revit精确绘制道路测量文本绘制区域

&&&&文本语言检测 google language detection (c#)
文本语言检测 google language detection (c#)
谷歌的语言检测项目(language detection java) 自己转成C#版
VS2010, .net 4.0, 引用vjslib(好像要有J#才有这个类库)。
可以通过减少profiles 里的文件来减少语言,使语言更准确判断。
若举报审核通过,可奖励20下载分
被举报人:
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
开发技术下载排行if([]) 等价于 if(new Array(0)),判断的是个对象而不是空值,自然是 true。
if([]) 等价于 if(new Array(0)),判断的是个对象而不是空值,自然是 true。
这道理大家讲的都差不多了,就那个意思。这是家长之间要解决的问题,与孩子无关。&br&我个人认为,在孩子长大以前,家长最努力要做的事就是,怎样让自己的孩子有一个美好的值得回忆的童年,让自己成为值得孩子骄傲和信任的父母。&br&人这一辈子最重要的一段时光大概就是童年了吧。&br&人这一辈子最重要的亲人大概就是父母了吧。
这道理大家讲的都差不多了,就那个意思。这是家长之间要解决的问题,与孩子无关。我个人认为,在孩子长大以前,家长最努力要做的事就是,怎样让自己的孩子有一个美好的值得回忆的童年,让自己成为值得孩子骄傲和信任的父母。人这一辈子最重要的一段时光大概…
3T3R 的网卡芯片早几年就有了,BCM4360系列算是相当成熟的方案,未普及的原因,就我个人看法而言:&br&&br&1、坑爹的运营商。&br&目前国内普及的是100M光纤(部分地区试点200M),理论上来说需要千兆网口的光猫和千兆网口的路由才能发挥全速。而网络运营商配的光猫很多都是百兆网口的,依据木桶原理,这种情况下买网卡还不如先换光猫和升级路由器……&br&&br&2、1750 - 1900M 的路由器普及度低。&br&普通家庭对路由器了解不够(SU-MIMO、MU-MIMO是神马?)对某些价格缩水品质也缩水的品牌趋之若鸿,“够用就行了”的想法根深蒂固。1900M路由器价位一般在500以上,几乎不在普通家庭的考虑之内。而刷机、发烧、玩NAS的群体毕竟是少数,很难带动中高端路由器的市场进而带动网卡的市场。现在腾达的AC15、AC18拉低了这个坎儿,so……这个级别的路由器在未来几年内大概会有好一些的市场前景。&br&&br&3、价格降不下来。&br&PCI-E网卡:&br&华硕的PCE-AC68没有国行,即便是在AC88出来以后暂时也没有降价的趋势。而AC88价格贵了一倍,性能目前只提升了10%(主要是其他硬件限制了发挥),对1900级别的网卡市场冲击力度不够大。&br&BCM4360芯片的网卡,会买这个的一般是为了玩黑苹果,可以免驱。搭配PCI-E转接卡也可以用在PC上,所以市面上就有了芯片+转接卡+天线的小工坊产品。价格目前在150-300之间,因芯片的来路不同、规格不一样,所以质量层次不齐(一般认为,FCC标准的4360要比ETSI标准的信号好一些)。&br&BCM43602系列算是4360的升级版,其中943602CS、943602CDP用于苹果机子上,943602BAED用于DELL 2016 XPS系列笔记本上。前两者的PC版驱动不成熟(2.4G上不去450m),价格也略贵,所以目前没市场,普及度不如94360CD。后者有DELL的官方驱动支持,然而单芯片的价格就在300左右,还是拆机片,性价比是相当的低。&br&&br&USB网卡:&br&3x3能上1900的USB网卡目前貌似只有Dlink的DWA-192这一款,虽然是螃蟹的芯片,但是看评测在5G方面的表现要比4360的强。价格目前稳居350左右,虚高。&br&&br&4、网线真的很便宜。&br&现在大部分家庭装修的时候都会预埋网线,光猫和路由器一般放在弱电箱里,而无线网卡发展的再强悍,速度和稳定性也无法和网线直连相比。从这个角度来看,六类、七类网线的市场反而要比网卡有前景的多。so……&br&&br&&br&3T3R带来的不只是网速的提升,然而&想要完全发挥光纤的速度,就要有给力的路由器,相匹配的网卡&,这个概念在很多家庭中是没有的:100m的光纤,即便是百兆网口,也有8M左右的下载速度,看看高清、玩玩游戏完全够用了。对他们来说,别说是2T2R了,1T1R的网卡都能凑合着用。而能让这些人产生换路由器进而换网卡的想法,大概也只有家里人看电视剧刷朋友圈而自己只是玩个LOL还卡的不行不行了的时候吧……
3T3R 的网卡芯片早几年就有了,BCM4360系列算是相当成熟的方案,未普及的原因,就我个人看法而言:1、坑爹的运营商。目前国内普及的是100M光纤(部分地区试点200M),理论上来说需要千兆网口的光猫和千兆网口的路由才能发挥全速。而网络运营商配的光猫很多…
没玩过游戏,不关注娱乐新闻的好处就是可以从普通观众的角度感受这部剧。没期望也就没失望嘛不是。&br&于是可以和古剑、花千骨等仙侠剧做个客观点儿的横向比较了。&br&&br&首先是特效:比古剑好,比花千骨靠谱。&br&古剑的特效从襄铃成了白狐狸开始我就没期待过,凑合着意思到了就行了。&br&花千骨拍成了武侠剧,所以特效有没有没差,人物比划几下手势就算是发招了,呵呵,呵呵。&br&仙五的特效,算是一个小惊喜,魔猿在树上跳来跳去的时候,那树枝摇摆的挺符合物理学定律;灵蜥爬来爬去的动态跟环境比较协调。大概是被太多的5毛特效洗脑了,感觉这部剧的特效怎么也得有个8毛了。&br&so,本来要求就不高,能接受的底限也就越来越低了。&br&&br&其次是音乐:呵呵哒。&br&如果该喜剧的时候放喜剧式的BGM,该战斗的时候放战斗的BGM,该欢乐悲伤的时候放欢乐悲伤的BGM,这是一种套路,那么这部剧的BGM完全就是这种套路,只是为了应个景儿,应个景儿,应个景儿……&br&&br&人物角色:可以接受。&br&太庆幸自己没玩过这个游戏了,所以对拆CP、毁原型、变腹黑等等这些评价毫无代入感,那么我这种普通观众对这部剧的角色又是什么看法呢?我自己的回答是,看了这部剧,有些想玩一玩这个游戏了。&br&看过韩东君演的无心法师,演技是值得肯定的,而且这货有颜值,身材也有料,所以一开始就无阻碍的接受了韩式的姜云凡(除了那身杀马特的造型),山贼的设定还挺好玩的。无心和姜云凡纯属两种性格,韩哥转变的貌似挺好。&br&很喜欢金晨在无心里演的月牙儿了,演技不错。在这部剧里貌似她演了两个角色,对偶这个普通观众而言,自己喜欢的演员镜头越多越好,管它年龄差还是姨叔恋什么的啦。&br&娜扎么,不看娱乐新闻,所以除了天之痕里的小雪感觉还行吧,对她没什么的想法。&br&龙幽啊,原来的设定是啥样的,不清楚,感觉现在这样酷酷的设定挺好。一部剧里逗逼的太多了,需要几个这样的来平衡。两男人在河里打水仗的画面太美,可以想象必定是满屏的弹幕。另外感觉郑元畅是不是整容了?这脸削的,可以插地了。&br&大伯版李逍遥,演员找的还行吧,可喜可怒,收放自如。可惜不是古剑里的紫胤,没颜值,没师尊光环,要你何用~&br&&br&总之,目前看了前六集,整体感觉还是蛮可以的。嘛,矮子里面拔矬子呗。古剑当初不也是被喷剧喷人设么,后来感觉到编剧还算有些诚意,喷子就少了一些。仙五现在貌似也是这个状态,剧情拖沓就拖沓吧,最近缺剧,多拖些还能多看几集……_(:з)∠)_
没玩过游戏,不关注娱乐新闻的好处就是可以从普通观众的角度感受这部剧。没期望也就没失望嘛不是。于是可以和古剑、花千骨等仙侠剧做个客观点儿的横向比较了。首先是特效:比古剑好,比花千骨靠谱。古剑的特效从襄铃成了白狐狸开始我就没期待过,凑合着意思…
get {} 等价于&br&get { xxxx } 不等价于&br&&br&set 类同。
get {} 等价于get { xxxx } 不等价于set 类同。
这问题问的很奇怪。题主从哪些方面觉得【大家】【都】【不喜欢】正则呢?&br&这东西用好了是神器呀。
这问题问的很奇怪。题主从哪些方面觉得【大家】【都】【不喜欢】正则呢?这东西用好了是神器呀。
我自己只看了一本WPF的书:Windows Presentation Foundation 程序设计指南 - A Guide to the Microsoft Windows Presentation Foundation。&br&(英文名:Application=Code+MakeUp)&br&作者:Charles Petzold。&br&这本书分别以 code 和 markup 两个角度来解析 WPF 的实现,全书没有一张图片。&br&作者用一种独特的方式让读者知其然也要知其所以然。
我自己只看了一本WPF的书:Windows Presentation Foundation 程序设计指南 - A Guide to the Microsoft Windows Presentation Foundation。(英文名:Application=Code+MakeUp)作者:Charles Petzold。这本书分别以 code 和 markup 两个角度来解析 WPF 的…
很早以前的动画了,印象已经模糊,犹记得结尾面码被找到的那一瞬间,莫名的鼻子发酸。我觉得与其说每个人的泪点不同,不如说是感性与理性切换的抉择条件不同。&br&面对同一件事的时候,这个人感性为先,那个人理性为主,主导思维的模式不同,看待事物的角度也就不一样。&br&喜欢这部动画,至于为什么喜欢,那种心情随着时光荏苒已经模糊不清了;曾经也为这部动画潸然泪下,在那个时间,那个环境,动画里的某些东西与自己的情感和思想产生了共鸣。过去之后再看一次,这种感动可能不再有,因为在上一次的感动中自己的某些触动已经得到了升华,并不是不会再感动,而是可以平静的触摸当初为什么感动的自己了。&br&那么这部动画的泪点,于我而言,也许就是感慨曾经失去的某些东西,被动画中失而复得然后再次失去的那些,如同伸出去的手,穿过,却又紧握不了,无力而又失败的感觉。&br&然后得到解脱。
很早以前的动画了,印象已经模糊,犹记得结尾面码被找到的那一瞬间,莫名的鼻子发酸。我觉得与其说每个人的泪点不同,不如说是感性与理性切换的抉择条件不同。面对同一件事的时候,这个人感性为先,那个人理性为主,主导思维的模式不同,看待事物的角度也就…
JS 懒人版:&br&&div class=&highlight&&&pre&&code class=&language-js&&&span class=&kd&&var&/span& &span class=&nx&&arr&/span& &span class=&o&&=&/span& &span class=&p&&[],&/span& &span class=&nx&&str&/span& &span class=&o&&=&/span& &span class=&p&&[&/span&&span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&2&/span&&span class=&p&&,&/span& &span class=&mi&&5&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&,&/span& &span class=&mi&&1&/span&&span class=&p&&,&/span& &span class=&mi&&4&/span&&span class=&p&&,&/span& &span class=&mi&&3&/span&&span class=&p&&].&/span&&span class=&nx&&join&/span&&span class=&p&&(&/span&&span class=&s2&&&,&&/span&&span class=&p&&);&/span&
&span class=&nx&&str&/span&&span class=&p&&.&/span&&span class=&nx&&replace&/span&&span class=&p&&(&/span&&span class=&sr&&/\d+/g&/span&&span class=&p&&,&/span& &span class=&kd&&function&/span& &span class=&p&&(&/span&&span class=&nx&&d&/span&&span class=&p&&)&/span&
&span class=&p&&{&/span&
&span class=&kd&&var&/span& &span class=&nx&&rg&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&nb&&RegExp&/span&&span class=&p&&(&/span&&span class=&nx&&d&/span&&span class=&p&&,&/span& &span class=&s2&&&g&&/span&&span class=&p&&),&/span& &span class=&nx&&re&/span& &span class=&o&&=&/span& &span class=&nx&&str&/span&&span class=&p&&.&/span&&span class=&nx&&match&/span&&span class=&p&&(&/span&&span class=&nx&&rg&/span&&span class=&p&&);&/span&
&span class=&k&&if&/span& &span class=&p&&(&/span&&span class=&nx&&re&/span& &span class=&o&&!=&/span& &span class=&kc&&null&/span&&span class=&p&&)&/span& &span class=&nx&&arr&/span&&span class=&p&&.&/span&&span class=&nx&&push&/span&&span class=&p&&(&/span&&span class=&nx&&re&/span&&span class=&p&&);&/span&
&span class=&nx&&str&/span& &span class=&o&&=&/span& &span class=&nx&&str&/span&&span class=&p&&.&/span&&span class=&nx&&replace&/span&&span class=&p&&(&/span&&span class=&nx&&rg&/span&&span class=&p&&,&/span& &span class=&s2&&&&&/span&&span class=&p&&);&/span&
&span class=&k&&return&/span& &span class=&s2&&&&&/span&&span class=&p&&;&/span&
&span class=&p&&});&/span&
&span class=&nx&&alert&/span&&span class=&p&&(&/span&&span class=&nx&&arr&/span&&span class=&p&&);&/span&
&/code&&/pre&&/div&
JS 懒人版:var arr = [], str = [1, 2, 5, 3, 1, 4, 3].join(",");
str.replace(/\d+/g, function (d)
var rg = new RegExp(d, "g"), re = str.match(rg);
if (re != null) arr.push(re);
str = str.replace(rg, "");
return "";
alert(arr);
href 里写 JS,目的不外乎就是为了执行 JS 语句而已。&br&比如 &a href=&javascript:void(0)& onclick=&doing()&&link&/a& ,是为了点击链接不会跳转,同时执行 onclick 里面的 JS。&br&带 onclick 的好处是可以获取控件本身,比如 onclick=&doing(this)&,这个 this 参数就是这个 &a&&/a& 控件,然后就可以在 doing 这个函数里操作这个控件。&br&写成 href=&javascript:doing()& 就是省略了 onclick 的写法。
href 里写 JS,目的不外乎就是为了执行 JS 语句而已。比如 &a href="javascript:void(0)" onclick="doing()"&link&/a& ,是为了点击链接不会跳转,同时执行 onclick 里面的 JS。带 onclick 的好处是可以获取控件本身,比如 onclick="doing(this)",这个 thi…
貌似不需要那么复杂。你只是要获取渲染后的长度是吧,在 WPF 里可以这样写:&br&&div class=&highlight&&&pre&&code class=&language-text&&var tb = new TextBlock()
FontFamily = new FontFamily(&宋体&),
FontSize = 16,
TextWrapping = TextWrapping.NoWrap,
Text = &字符串balabalabala....&
tb.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity));
&/code&&/pre&&/div&&br&tb.ActualWidth 就是长度。&br&供参考。
貌似不需要那么复杂。你只是要获取渲染后的长度是吧,在 WPF 里可以这样写:var tb = new TextBlock()
FontFamily = new FontFamily("宋体"),
FontSize = 16,
TextWrapping = TextWrapping.NoWrap, //不换行
Text = "字符串balabalabala...."
ArrayList 是泛型出来前的旧物,有了 List&T& 以后就用不上了。并且各种测试下来 List 的效率更高。
ArrayList 是泛型出来前的旧物,有了 List&T& 以后就用不上了。并且各种测试下来 List 的效率更高。
Tuple能做的struct也能做,虽然代码量要多一些。什么时候可以像JS那样直接 { T1, T2, T3, .... } 会考虑用用看。
Tuple能做的struct也能做,虽然代码量要多一些。什么时候可以像JS那样直接 { T1, T2, T3, .... } 会考虑用用看。
除了 dynamic 是运行时确定,其他类型在编译时确定,包括 var 和 delegate。
除了 dynamic 是运行时确定,其他类型在编译时确定,包括 var 和 delegate。
是说这个文本要显示到哪里?&br&假设是 TextBlock:&br&&div class=&highlight&&&pre&&code class=&language-text&&tb.Text = &测&;
tb.Measure(new Size());
var tbWidth = tb.ActualW
var tbHeight = tb.ActualH
&/code&&/pre&&/div&
是说这个文本要显示到哪里?假设是 TextBlock:tb.Text = "测";
tb.Measure(new Size());
var tbWidth = tb.ActualW
var tbHeight = tb.ActualH
忘了是哪一版IE开始不支持显示本地图片了,以前可以用Flash曲线救国,现在建议用Html5。
忘了是哪一版IE开始不支持显示本地图片了,以前可以用Flash曲线救国,现在建议用Html5。
用单引号:&br&&br&&div class=&highlight&&&pre&&code class=&language-text&&'{&total&:1,&rows&:[{' + ['&id&:&' + row.id + '&,&data&:&' + row.thing, '&id&:&' + row.id2 + '&,&data&:&' + row.thing2].join('},{') + '&}]}';
&/code&&/pre&&/div&&br&循环输出:&br&&br&&div class=&highlight&&&pre&&code class=&language-text&&var arr = [];
for(var i = 0, l = row. i & i++)
arr[i] = '&id&:&' + row[i].id + '&,&data&:&' + row[i].
console.log('{&total&:1,&rows&:[{' + arr.join('},{') + '&}]}');
&/code&&/pre&&/div&
用单引号:'{"total":1,"rows":[{' + ['"id":"' + row.id + '","data":"' + row.thing, '"id":"' + row.id2 + '","data":"' + row.thing2].join('},{') + '"}]}';
循环输出:var arr = [];
for(var i = 0, l = row. i & i++)
arr[i] = '"id":"…
看到题目进来,没时间看前面的回答,这里说一下方案,可能会跟前面的答案重复。&br&1、你需要有一个支持双线模式的路由器,比如华硕的几款,或者可以刷 openwrt、tomatodual 固件的路由都可以。&br&2、进入路由器的双线模式管理页面,这里你可以将路由器的某一个 LAN 口设置成 WAN接口(也有原生带两个 WAN 口的路由器,可以跳过这一步),在两个wan口上插入电话线(或光纤线),然后分别设置两个宽带拨号账号和密码,线路模式选择【负载均衡】。&br&3、重启路由器后就可以实现宽带叠加了。
看到题目进来,没时间看前面的回答,这里说一下方案,可能会跟前面的答案重复。1、你需要有一个支持双线模式的路由器,比如华硕的几款,或者可以刷 openwrt、tomatodual 固件的路由都可以。2、进入路由器的双线模式管理页面,这里你可以将路由器的某一个 LA…
函数式编程的概念很早就有了,可以说 C# 在有匿名委托后才真正意义上的满足了函数式编程的大环境。 lambda 表达式作为语法糖,不同的语言有不同的实现方式,C# 本身就有 delegate,与 lambda 这个后来者苟且在一起就顺其自然了。&br&delegate 是一种类型,地位和 string、int... 一样,lambda 的工作是创建这个类型的一个实例,这部分工作由编译器隐藏起来了,所以大部分时候 lambda 是可以当作匿名函数看待的:&br&&div class=&highlight&&&pre&&code class=&language-text&&
public Form1()
var a = new Action(() =& { }); //都是 Action 类型的实例
Action b = () =& { };
Action c = delegate() { };
var d = (Action)(() =& { });
(new Action(() =& { }))(); //闭包
a += b += c += d += (new Action(() =& { }));
&/code&&/pre&&/div&&br&C# 是强类型的,即便是匿名函数,实际上也是由编译器来识别具体类型,所以下面的代码是错误的,因为最基本的 delegate 需要签名:&br&&div class=&highlight&&&pre&&code class=&language-text&&var f = (Delegate)(() =& { });
//编译错误
&/code&&/pre&&/div&&br&如果写成这样就是没问题:&br&&div class=&highlight&&&pre&&code class=&language-text&&
delegate void action();
public Form1()
var e = (action)(() =& { });
//编译通过
&/code&&/pre&&/div&&br&C#的多播委托虽然不完美,但有其存在的意义,尤其是跟 event 联系紧密,比如观察者模式、动态监听事件、动态加载插件、模块化(module)、解耦。。。这些其他语言也能实现,而 C# 的实现更加简洁,直观(编译器背后要做的工作量很大……)。&br&&br&大部分其他语言也不是没有 delegate,只不过各有各的表达方式,个人最喜欢的是 JS 这种动态语言的实现方式(不考虑性能和安全性):&br&&div class=&highlight&&&pre&&code class=&language-text&&(function() {})();
&/code&&/pre&&/div&
函数式编程的概念很早就有了,可以说 C# 在有匿名委托后才真正意义上的满足了函数式编程的大环境。 lambda 表达式作为语法糖,不同的语言有不同的实现方式,C# 本身就有 delegate,与 lambda 这个后来者苟且在一起就顺其自然了。delegate 是一种类型,地位…
第一个想到的就是霍去病,虚岁24病殁。
第一个想到的就是霍去病,虚岁24病殁。
已有帐号?
无法登录?
社交帐号登录下次自动登录
现在的位置:
& 综合 & 正文
C#利用GDI+绘制旋转文字,矩形内可以根据布局方式排列文本
C#中利用GDI+绘制旋转文本的文字,网上有很多资料,基本都使用矩阵旋转的方式实现。但基本都只提及按点旋转,若要实现在矩形范围内旋转文本,资料较少。经过琢磨,可以将矩形内旋转转化为按点旋转,不过需要经过不少的计算过程。利用下面的类可以实现该功能。
using System.Collections.G
using System.D
using System.Drawing.Drawing2D;
namespace RotateText
public class GraphicsText
private Graphics _
public GraphicsText()
public Graphics Graphics
get { return _ }
set { _graphics = }
/// &summary&
/// 绘制根据矩形旋转文本
/// &/summary&
/// &param name="s"&文本&/param&
/// &param name="font"&字体&/param&
/// &param name="brush"&填充&/param&
/// &param name="layoutRectangle"&局部矩形&/param&
/// &param name="format"&布局方式&/param&
/// &param name="angle"&角度&/param&
public void DrawString(string s, Font font, Brush brush, RectangleF layoutRectangle, StringFormat format, float angle)
// 求取字符串大小
SizeF size = _graphics.MeasureString(s, font);
// 根据旋转角度,求取旋转后字符串大小
SizeF sizeRotate = ConvertSize(size, angle);
// 根据旋转后尺寸、布局矩形、布局方式计算文本旋转点
PointF rotatePt = GetRotatePoint(sizeRotate, layoutRectangle, format);
// 重设布局方式都为Center
StringFormat newFormat = new StringFormat(format);
newFormat.Alignment = StringAlignment.C
newFormat.LineAlignment = StringAlignment.C
// 绘制旋转后文本
DrawString(s, font, brush, rotatePt, newFormat, angle);
/// &summary&
/// 绘制根据点旋转文本,一般旋转点给定位文本包围盒中心点
/// &/summary&
/// &param name="s"&文本&/param&
/// &param name="font"&字体&/param&
/// &param name="brush"&填充&/param&
/// &param name="point"&旋转点&/param&
/// &param name="format"&布局方式&/param&
/// &param name="angle"&角度&/param&
public void DrawString(string s, Font font, Brush brush, PointF point, StringFormat format, float angle)
// Save the matrix
Matrix mtxSave = _graphics.T
Matrix mtxRotate = _graphics.T
mtxRotate.RotateAt(angle, point);
_graphics.Transform = mtxR
_graphics.DrawString(s, font, brush, point, format);
// Reset the matrix
_graphics.Transform = mtxS
private SizeF ConvertSize(SizeF size, float angle)
Matrix matrix = new Matrix();
matrix.Rotate(angle);
// 旋转矩形四个顶点
PointF[] pts = new PointF[4];
pts[0].X = -size.Width / 2f;
pts[0].Y = -size.Height / 2f;
pts[1].X = -size.Width / 2f;
pts[1].Y = size.Height / 2f;
pts[2].X = size.Width / 2f;
pts[2].Y = size.Height / 2f;
pts[3].X = size.Width / 2f;
pts[3].Y = -size.Height / 2f;
matrix.TransformPoints(pts);
// 求取四个顶点的包围盒
float left = float.MaxV
float right = float.MinV
float top = float.MaxV
float bottom = float.MinV
foreach(PointF pt in pts)
// 求取并集
if(pt.X & left)
left = pt.X;
if(pt.X & right)
right = pt.X;
if(pt.Y & top)
top = pt.Y;
if(pt.Y & bottom)
bottom = pt.Y;
SizeF result = new SizeF(right - left, bottom - top);
private PointF GetRotatePoint(SizeF size, RectangleF layoutRectangle, StringFormat format)
PointF pt = new PointF();
switch (format.Alignment)
case StringAlignment.Near:
pt.X = layoutRectangle.Left + size.Width / 2f;
case StringAlignment.Center:
pt.X = (layoutRectangle.Left + layoutRectangle.Right) / 2f;
case StringAlignment.Far:
pt.X = layoutRectangle.Right - size.Width / 2f;
switch (format.LineAlignment)
case StringAlignment.Near:
pt.Y = layoutRectangle.Top + size.Height / 2f;
case StringAlignment.Center:
pt.Y = (layoutRectangle.Top + layoutRectangle.Bottom) / 2f;
case StringAlignment.Far:
pt.Y = layoutRectangle.Bottom - size.Height / 2f;
测试如下:
using System.Collections.G
using System.D
using System.D
using System.Windows.F
namespace RotateText
public partial class FormMain : Form
private Font _font = new Font("Arial", 12);
private Brush _brush = new SolidBrush(Color.Black);
private Pen _pen = new Pen(Color.Black, 1f);
private string _text = "Crow Soft";
public FormMain()
InitializeComponent();
protected override void OnPaint(PaintEventArgs e)
base.OnPaint(e);
GraphicsText graphicsText = new GraphicsText();
graphicsText.Graphics = e.G
// 绘制围绕点旋转的文本
StringFormat format = new StringFormat();
format.Alignment = StringAlignment.C
format.LineAlignment = StringAlignment.C
graphicsText.DrawString(_text, _font, _brush, new PointF(100, 80), format, 45f);
graphicsText.DrawString(_text, _font, _brush, new PointF(200, 80), format, -45f);
graphicsText.DrawString(_text, _font, _brush, new PointF(300, 80), format, 90f);
graphicsText.DrawString(_text, _font, _brush, new PointF(400, 80), format, -60f);
// 绘制矩形内旋转的文本
// First line
RectangleF rc = RectangleF.FromLTRB(50, 150, 200, 230);
RectangleF rect =
format.Alignment = StringAlignment.N
e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height);
graphicsText.DrawString(_text, _font, _brush, rect, format, 30);
rect.Location += new SizeF(180, 0);
format.LineAlignment = StringAlignment.N
e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height);
graphicsText.DrawString(_text, _font, _brush, rect, format, -30);
rect.Location += new SizeF(180, 0);
format.LineAlignment = StringAlignment.C
e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height);
graphicsText.DrawString(_text, _font, _brush, rect, format, -90);
rect.Location += new SizeF(180, 0);
format.LineAlignment = StringAlignment.F
e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height);
graphicsText.DrawString(_text, _font, _brush, rect, format, 70);
// Second line
rect.Location += new SizeF(0, 100);
format.Alignment = StringAlignment.C
e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height);
graphicsText.DrawString(_text, _font, _brush, rect, format, 40);
rect.Location += new SizeF(180, 0);
format.LineAlignment = StringAlignment.N
e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height);
graphicsText.DrawString(_text, _font, _brush, rect, format, 30);
rect.Location += new SizeF(180, 0);
format.LineAlignment = StringAlignment.C
e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height);
graphicsText.DrawString(_text, _font, _brush, rect, format, -70);
rect.Location += new SizeF(180, 0);
format.LineAlignment = StringAlignment.F
e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height);
graphicsText.DrawString(_text, _font, _brush, rect, format, 60);
// Third line
rect.Location += new SizeF(0, 200);
format.Alignment = StringAlignment.F
e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height);
graphicsText.DrawString(_text, _font, _brush, rect, format, -30);
rect.Location += new SizeF(180, 0);
format.LineAlignment = StringAlignment.N
e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height);
graphicsText.DrawString(_text, _font, _brush, rect, format, -30);
rect.Location += new SizeF(180, 0);
format.LineAlignment = StringAlignment.C
e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height);
graphicsText.DrawString(_text, _font, _brush, rect, format, 90);
rect.Location += new SizeF(180, 0);
format.LineAlignment = StringAlignment.F
e.Graphics.DrawRectangle(_pen, rect.Left, rect.Top, rect.Width, rect.Height);
graphicsText.DrawString(_text, _font, _brush, rect, format, 45);
效果如下图:
资源地址:http://download.csdn.net/detail/alicehyxx/6626473
&&&&推荐文章:
【上篇】【下篇】}

我要回帖

更多关于 word绘制文本框 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信