.net的字体属性的改变
前几天看见XX写代码时,对于字体属性的设置发费了一番功夫却结果不对。他要完成一个类似编辑器的功能,可以设置字体的如加粗,斜体,下划线的通用属性。
他的代码差不多如下:
源程序中还有很多对象处理字体对象。我们先不考虑那些代码,但上面的代码就存在很多问题:如果原来font既是加粗的,又是有下划线的,则font.Bold!=true却是成立的。而且这种操作模式对一些功能很难进行,如:如何进行样式的叠加(加粗还要加下划线),如何把已经加粗的字体去掉加粗等等。
看到这些代码时,我忽然想现在新的编程人员,特别是使用.net,java开发企业应用程序的编程人员,很少有人能对位运算的应用很熟悉了,甚至能在实际中想到它的使用。其实字体样式在框架是定义成位枚举的[flag],意味着它可以使用位运算符来进行操作。
下面是加粗的实现,它自动改变字体的加粗情况,还保留字体的原来其它样式:
这些都是位操作的基本技巧,但却被很多人遗忘了!
他的代码差不多如下:
1if (font.Bold != true)
2 font = new Font(font, FontStyle.Bold);
3 //........很长,但却很难处理
2 font = new Font(font, FontStyle.Bold);
3 //........很长,但却很难处理
源程序中还有很多对象处理字体对象。我们先不考虑那些代码,但上面的代码就存在很多问题:如果原来font既是加粗的,又是有下划线的,则font.Bold!=true却是成立的。而且这种操作模式对一些功能很难进行,如:如何进行样式的叠加(加粗还要加下划线),如何把已经加粗的字体去掉加粗等等。
看到这些代码时,我忽然想现在新的编程人员,特别是使用.net,java开发企业应用程序的编程人员,很少有人能对位运算的应用很熟悉了,甚至能在实际中想到它的使用。其实字体样式在框架是定义成位枚举的[flag],意味着它可以使用位运算符来进行操作。
下面是加粗的实现,它自动改变字体的加粗情况,还保留字体的原来其它样式:
1FontStyle fs = font.Style;
2fs ^= FontStyle.Bold;
3font = new Font(fs);
如果只是判断当前字体是否是加粗,而不考虑是否有了其它样式设置,可以使用&运算,然后再与FontStyle.Bold相等比较。如下:2fs ^= FontStyle.Bold;
3font = new Font(fs);
1if(font.Style&FontStyle.Bold==FontStyle.Bold)
2 //字体是加粗的
3else
4 //字体不是加粗的
2 //字体是加粗的
3else
4 //字体不是加粗的
这些都是位操作的基本技巧,但却被很多人遗忘了!