这几天老是上不了CSDN ,郁闷中。
到网上四处搜索,看到网友发文说“CSDN被和谐了”!百度贴吧(http://tieba.baidu.com/f?kz=462464543)里有人说:“据可靠消息称,8月8日,因机房内一网站非法播放奥运开幕式视频,世纪互联北京机房相关网段被封锁,导致网段内包括多家著名网站目前不能访问。”
很意外啊,我一直以为 CSDN 实力雄厚,肯定有多处镜像服务器。结果一个机房查封就歇火了~~
北京奥运是件喜事,但带来的烦恼也好多啊。特别是奥运封网实现“连坐”酷刑,是不是有点过头了?
编码是一种娱乐。我不仅以此谋生,还把它看成一种玩具。设计复杂的、多功能的软件的确很有价值,但小巧的程序更具娱乐性。
看到一个小程序 ZoomIt,可以放大屏幕、在屏幕上标注等等。这些有趣的功能在演示时很有用!接下来我用 C#.NET 设计一个类似的程序“演示助手”。今天先来实现在屏幕上涂鸦的功能。
(有任何疑问或建议请联系我:Email: chuangen@126.com, website: http://chuangen.name/ )
屏幕绘图的原理是,启动一个全屏窗体,将当前屏幕的截图作为背景图片,在窗体上进行绘制。
选择要绘制的屏幕:
[code lang="csharp"]Screen screen = Screen.PrimaryScreen;[/code]
要启动全屏窗口,设置窗体如下属性:
[code lang="csharp"]this.FormBorderStyle = FormBorderStyle.None;//无边框
this.ShowInTaskbar = false;
this.TopMost = true;//保持在最前面
this.Bounds = screen.Bounds;//设置正好铺满整个屏幕[/code]
.NET2.0中提供了 Graphics.CopyFromScreen 方法,使屏幕拷贝代码很简洁。下面代码演示将主屏幕的截图写入到 Bitmap 实例。
[code lang="csharp"]Rectangle bounds = screen.Bounds;
backImage = new Bitmap(bounds.Width, bounds.Height);
Graphics g = Graphics.FromImage(backImage);
g.CopyFromScreen(bounds.Location, new Point(0, 0), bounds.Size);
g.Dispose();[/code]
绘制的重载窗体的 OnMouseDown 、 OnMouseUp 和 OnMouseMove 方法,获取鼠标拖动的轨迹,用一个Point[] 数组存储一段曲线。当鼠标移动时,如果鼠标已经按下,添加鼠标坐标到曲线中。
因为绘制的各条曲线可能具有不同的颜色、线宽等属性,我们可以定义类存储曲线数据,如下:
[code lang="csharp"]///
///
public class CurveData
{
Color color = Color.Black;
float width = 1.0F;
Point[] points;
///
///
public Color Color
{
get { return color; }
}
///
///
public float Width
{
get { return width; }
}
///
///
public Pen Pen
{
get { return new Pen(color,width); }
}
///
///
public Point[] Points
{
get { return points; }
}
///
///
///
曲线的颜色
///
线条的宽度
///
坐标点数据
public CurveData(Color color, float width,Point[] points)
{
this.color = color;
this.width = width;
this.points = points;
}
}[/code]
可以将各条曲线存储在 List<> 中,方便添加、删除等操作:
[code lang="csharp"]List
重载 OnPaint 方法,先绘制屏幕截图,再绘制各条曲线,就实现涂鸦功能了。效果如下图所示(图中曲线为标注效果):
1. 每当一个点被添加到曲线中,你只需要绘制从原曲线最后一个点到该点的线段即可。只有当屏幕刷新时才需要绘制所有曲线。
2. 一定要启用窗体的双缓冲设置(DoubleBuffered),以减少或避免屏幕闪烁。
(有任何疑问或建议请联系我:Email: chuangen@126.com, website: http://chuangen.name/ )
“屏幕标注”功能完成了。下次再来实现“演示助手”的其他功能。
RtfEditor v1.0 提供下载 点击下载(包括 RtfEditor.dll、Wordpad 和 Wordpad 程序源代码)
在应用程序设计中,大家经常会用 RichTextBox 控件显示、输入和操作带有格式的文本。该控件功能完整,但为了让用户使用这些功能,你不得不添加大量的工具栏和菜单,而这类工作很繁琐。为此,我设计了 RTF Editor 控件,它是一个可嵌入到 WinForm 窗体的编辑器。它完整地实现了 RTF 文档编辑功能。您可以创建和编辑文本文档或有复杂格式和图形的文档,并可以将文件保存为普通文本文档(*.txt)或多信息文本文件(*.rtf)。具有如下特性:
该控件具有大部分常用菜单和工具栏,你可以方便地将它用于你的应用程序中,省去大量的工作。控件界面如下图所示:
该控件是免费的,无任何功能限制(不提供源代码,但使用该控件设计的写字板程序源代码提供下载)。有任何问题可留言给我(email: chuangen@126.com,website: http://chuangen.name )
类定义:public class RtfEditor : UserControl
说明:RTF 编辑器控件。
|
名称 |
访问 |
摘要 |
|
RtfEditor() |
public |
构造方法 |
|
名称 |
访问 |
摘要 |
|
CopyrightVisible : Boolean |
public |
是否显示设计者信息。 |
|
FileFullName : String |
public |
当前编辑文档的全路径名称。 |
|
MenuBarVisible : Boolean |
public |
是否显示 菜单栏。 |
|
Modified : Boolean |
public |
获取或设置一个值,该值指示自创建文本框控件或上次设置该控件的内容后,用户修改了该控件。 |
|
ReadOnly : Boolean |
public |
获取或设置一个值,该值指示编辑器中的文本是否为只读。 |
|
RenderMode : ToolStripRenderMode |
public |
获取或设置要应用于 RtfEditor 的绘制样式。 |
|
RtfDocument : String |
public |
获取或设置 RtfEditor 正在编辑的文本,包括所有 RTF 格式代码。 |
|
StatusBarVisible : Boolean |
public |
是否显示 状态栏。 |
|
TextDocument : String |
public |
获取或设置 RtfEditor 正在编辑的纯文本。 |
|
ToolBarFormatVisible : Boolean |
public |
是否显示 工具栏-格式。 |
|
ToolBarStandardVisible : Boolean |
public |
是否显示 工具栏-常用。 |
|
名称 |
访问 |
摘要 |
|
LoadFile() : Void |
public |
打开指定文件 |
|
SaveFile() : Void |
public |
将 RtfEditor 控件的内容保存到开放式数据流。 |
|
SaveFile() : Void |
public |
将 RtfEditor 的内容保存到 RTF 格式文件。 |
|
SaveFile() : Void |
public |
将 RtfEditor 的内容保存到特定类型的文件中。 |
RTF Editor控件包含在 RtfEditor.dll 中。在 WinForm 窗体中使用该控件的步骤(嵌入到窗体):
例如,你从数据库读取一段 RTF 格式文本,想要显示到 RtfEditor 中,则:
[code lang="csharp"]rtfEditor.RtfDocument = strRtf;[/code]
更多功能使用方法,请参阅演示程序 Wordpad.exe 的源代码。
Wordpad.exe 主要目的是演示 RtfEditor 控件使用效果,它的源代码提供下载。它可以接受一个文件名或特定开关项(如“-test”)做参数,示例如下:
WordpadForm 窗体类实现了完整的写字板功能,你可以使用该窗体启动“写字板”样式的独立编辑窗体。运行界面如下:
WordpadForm.cs 源代码如下。
[code lang="csharp"]using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;
using FCG.Windows.Forms;
namespace Wordpad
{
public partial class WordpadForm : Form
{
public WordpadForm()
{
InitializeComponent();
}
///
///
internal RtfEditor RtfEditor
{
get
{
return rtfEditor;
}
}
void rtfEditor_FileNameChanged(object sender, EventArgs e)
{
string FileName = Path.GetFileName(rtfEditor.FileFullName);
if (FileName == "")
FileName = "未命名";
this.Text = FileName + " - " + Application.ProductName;
}
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
string[] args =Environment.GetCommandLineArgs();
if (args.Length < 2)//arg[0]=exepath , arg[1] = filename
{
//File_Func_NewFile();
}
else
{
string filename =args[1];
if(filename.Trim().ToLower()!="-test")
rtfEditor.LoadFile(filename);
}
rtfEditor.FileNameChanged += new EventHandler(rtfEditor_FileNameChanged);
rtfEditor_FileNameChanged(this, null);
}
///
///
private void App_Closing(FormClosingEventArgs e)
{
if (rtfEditor.Modified)
{//文档被修改过
DialogResult result = MessageBox.Show("文件内容已更改,想保存文件吗?", "提示", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Information);
switch (result)
{
case DialogResult.Yes: //“保存”,则执行保存文件的操作
//如果没有选择要保存的文件名,则弹出保存对话框,由用户选择要保存的文件名后保存文本
if (saveFileDialog.FileName == "")
{
if (saveFileDialog.ShowDialog(this.TopLevelControl) == DialogResult.OK)
{
rtfEditor.SaveFile(saveFileDialog.FileName, RichTextBoxStreamType.PlainText);
}
}
else
{//如果已经选择了要保存的文件名,则保存文本到文件中
rtfEditor.SaveFile(saveFileDialog.FileName, RichTextBoxStreamType.PlainText);
}
break;
case DialogResult.No://不保存
break;
default://取消操作
e.Cancel = true;
break;
}
}
}
///
///
///
protected override void OnFormClosing(FormClosingEventArgs e)
{
base.OnFormClosing(e);
if (!this.Modal)
App_Closing(e);
}
}
}[/code]
PostEditForm 窗体类演示 RtfEditor 控件的使用,运行界面:
1. 写字板.NET,发表于 2007年05月14日 14:10:00
Url: http://blog.csdn.net/chuangen/archive/2007/05/14/1608187.aspx
MSDN中,对方法 Math.Round 的描述有两处错误:
错误一:使用 Math.Round,你可以指定返回值精确到小数点后几位,但MSDN中表述为“有效数字”,混淆了概念。
错误二:参数 decimals 的范围为 0-15,而不是这里描述的0-28。
chuangen@126.com, 2008-6-28 11:17
附:
有效数字的概念:
一般而言,对一个数据取其可靠位数的全部数字加上第一位可疑数字,就称为这个数据的有效数字。一个近似数据的有效位数是该数中有效数字的个数,指从该数左方第一个非零数字算起到最末一个数字(包括零)的个数,它不取决于小数点的位置。
MSDN for VS2005 中对 Math.Round的描述
Math.Round 方法 (Decimal, Int32, MidpointRounding)
注意:此方法在 .NET Framework 2.0 版中是新增的。
将小数值舍入到指定精度。一个参数,指定当一个值正好处于另两个数中间时如何舍入这个值。
public static decimal Round ( decimal d, int decimals, MidpointRounding mode )
参数
d
要舍入的小数。
decimals
返回值中的有效数字位数(精度)。
mode
d 在两个数字之间时如何舍入的规范。
返回值
精度等于 decimals,最接近 d 的数字。如果 d 是两个数字的中值,这两个数字一个为偶数,另一个为奇数,则 mode 确定返回两个数字中的哪一个。如果 d 的精度小于 decimals,则返回 d 而不做更改。
备注
decimals 参数指定返回值的有效小数位数,其范围在 0 到 28 之间。如果 decimals 为零,则返回一个整数。
此方法的行为遵循 IEEE 标准 754 的第 4 节。这种 mode 为 ToEven 时执行的舍入有时称为就近舍入或银行家舍入。
__
发表于CSDN博客(http://blog.csdn.net/chuangen/) 2008年07月08日 16:55:00
http://blog.csdn.net/chuangen/archive/2008/07/08/2625534.aspx
我要将数据通过网络传输,因此需要将各种类型的数值转成byte[]。在.NET中,方法有两个:序列化和转换为Byte数组。
序列化:
[code lang="csharp"]BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(mytream, doubleValue);[/code]
反序列化:
[code lang="csharp"]BinaryFormatter bf = new BinaryFormatter();
double doubleValue=(double)bf.Deserialize(mystream);[/code]
转成Byte Array:
[code lang="csharp"]BinaryWriter binWriter = new BinaryWriter (mystream);
binWriter.Write(doubleValue);[/code]
读取:
[code lang="csharp"]binReader.BaseStream.Position = 0;
BinaryReader binReader = new BinaryReader(mystream);
double doubleValue= binReader.ReadDouble();[/code]
序列化是将对象状态转换为可保持或传输的格式的过程。与序列化相对的是反序列化,它将流转换为对象。这两个过程结合起来,可以轻松地存储和传输数据。
如果在NET程序间交换数据,显然序列化是首选,尽管序列化后需要占用更多的存储空间。如果与其他程序交换,如NET和MFC程序间网络传输,则不可行,应该手动序列化或转换成Byte数组传输。
使用Visual Studio帮助时,通常会把一些感兴趣的内容添加到帮助收藏夹中。
问题是在重装系统时怎么备份这些收藏哪?我没找到 Visual Studio 中相关的导出功能,但发现收藏夹、搜索过滤等帮助设置以XML文件存放在目录
C:\Documents and Settings\{你的Windows帐号}\Application Data\Microsoft\VisualStudio\8.0\VS Help Data
下。如帮助收藏夹为Favorites.xml。备份这几个文件就达到目的了。我想Microsoft应该提供了更好的方法,哪位朋友发现了请告诉我一下,谢谢
————
__
发表于CSDN博客(http://blog.csdn.net/chuangen/) 2007年05月19日 23:10:00
URL: http://blog.csdn.net/chuangen/archive/2007/05/19/1616986.aspx
图片管理器,算是图片浏览器的升级版本,呵呵。使用 Access 数据库。开发编写时用的SQL Server,后来发觉犯了个低级错误:这种小程序怎么可能要求大家装上硕大的SQL Server啊,哈哈。
__
发表于CSDN博客(http://blog.csdn.net/chuangen/) 2007年05月14日 14:32:00
http://blog.csdn.net/chuangen/archive/2007/05/14/1608243.aspx
我曾将很多资料刻录光盘存储。当需要某个文件时,却很难找到它,于是编写了“光盘索引管理器”。当时是在Visual Studio .NET 2003 下编写的。现在我写了这个.NET2.0的版本,界面比先前美观些。
索引数据以 XML 文件存储,因此不需要本程序也可以浏览索引内容。
__
发表于CSDN博客(http://blog.csdn.net/chuangen/) 2007年05月14日 14:25:00
http://blog.csdn.net/chuangen/archive/2007/05/14/1608229.aspx
__
发表于CSDN博客(http://blog.csdn.net/chuangen/) 2007年05月14日 14:17:00
http://blog.csdn.net/chuangen/archive/2007/05/14/1608207.aspx
“写字板.NET”是为另一程序集提供编辑功能而开发的独立类库,运行于.NET 2.0平台,命名空间为:FCG.Wordpad 。它完整地实现了 RTF 文档编辑功能。您可以创建和编辑文本文档或有复杂格式和图形的文档,并可以将文件保存为普通文本文档(*.txt)或多信息文本文件(*.rtf)。
·可以插入图片
·格式化文本
·打印支持
所见即所得编辑;支持页面设置和打印预览。
·在其他 .NET 项目中引用
该程序可以独立运行,也可以作为类库被引用。创建 FCG.Wordpad.WordpadDialog 实例后,你可以启动编辑界面,并通过 Document 属性访问正在编辑的内容。
你可以任意传播该副本,亦可在项目中引用。
下载:
主程序:FCG.Wordpad.exe
引用示例程序:FCG.Wordpad_Test.exe
引用示例源码:FCG.Wordpad_Test_Source.rar
软件截图:
__
发表于CSDN博客(http://blog.csdn.net/chuangen/) 2007年05月14日 14:10:00
http://blog.csdn.net/chuangen/archive/2007/05/14/1608187.aspx