CSDN 挂挂了

By 范 传根 on 八月 14th, 2008

这几天老是上不了CSDN ,郁闷中。
到网上四处搜索,看到网友发文说“CSDN被和谐了”!百度贴吧(http://tieba.baidu.com/f?kz=462464543)里有人说:“据可靠消息称,8月8日,因机房内一网站非法播放奥运开幕式视频,世纪互联北京机房相关网段被封锁,导致网段内包括多家著名网站目前不能访问。”
很意外啊,我一直以为 CSDN 实力雄厚,肯定有多处镜像服务器。结果一个机房查封就歇火了~~
北京奥运是件喜事,但带来的烦恼也好多啊。特别是奥运封网实现“连坐”酷刑,是不是有点过头了?

演示助手程序设计(一) -屏幕标注(.NET实现)

By 范 传根 on 八月 2nd, 2008

编码是一种娱乐。我不仅以此谋生,还把它看成一种玩具。设计复杂的、多功能的软件的确很有价值,但小巧的程序更具娱乐性。

看到一个小程序 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 curves = new List();[/code]

绘制数据

重载 OnPaint 方法,先绘制屏幕截图,再绘制各条曲线,就实现涂鸦功能了。效果如下图所示(图中曲线为标注效果):

需要注意的地方

1. 每当一个点被添加到曲线中,你只需要绘制从原曲线最后一个点到该点的线段即可。只有当屏幕刷新时才需要绘制所有曲线。

2. 一定要启用窗体的双缓冲设置(DoubleBuffered),以减少或避免屏幕闪烁。

(有任何疑问或建议请联系我:Email: chuangen@126.com, website: http://chuangen.name/ )

“屏幕标注”功能完成了。下次再来实现“演示助手”的其他功能。

RTF Editor 控件(.NET 2.0, v1.0)

By 范 传根 on 七月 26th, 2008

RtfEditor v1.0 提供下载 点击下载(包括 RtfEditor.dll、Wordpad 和 Wordpad 程序源代码)

一、介绍

在应用程序设计中,大家经常会用 RichTextBox 控件显示、输入和操作带有格式的文本。该控件功能完整,但为了让用户使用这些功能,你不得不添加大量的工具栏和菜单,而这类工作很繁琐。为此,我设计了 RTF Editor 控件,它是一个可嵌入到 WinForm 窗体的编辑器。它完整地实现了 RTF 文档编辑功能。您可以创建和编辑文本文档或有复杂格式和图形的文档,并可以将文件保存为普通文本文档(*.txt)或多信息文本文件(*.rtf)。具有如下特性:

  • 可以插入图片
  • 格式化文本
  • 打印支持
  • 所见即所得编辑;支持页面设置和打印预览。
  • 在其他 .NET 项目中引用

该控件具有大部分常用菜单和工具栏,你可以方便地将它用于你的应用程序中,省去大量的工作。控件界面如下图所示:

该控件是免费的,无任何功能限制(不提供源代码,但使用该控件设计的写字板程序源代码提供下载)。有任何问题可留言给我(email: chuangen@126.com,website: http://chuangen.name

二、RtfEditor 类

类定义: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 窗体中使用该控件的步骤(嵌入到窗体):

  1. 在你的项目中添加对 RtfEditor.dll 的引用;
  2. 将该DLL中的“RtfEditor”控件添加到工具箱备用;
  3. 在设计模式,将“RtfEditor”控件从工具箱拖放到你的窗体上,并进行编辑。
  4. 编写代码。

例如,你从数据库读取一段 RTF 格式文本,想要显示到 RtfEditor 中,则:

[code lang="csharp"]rtfEditor.RtfDocument = strRtf;[/code]

更多功能使用方法,请参阅演示程序 Wordpad.exe 的源代码。

 

四、演示程序说明

Wordpad.exe 主要目的是演示 RtfEditor 控件使用效果,它的源代码提供下载。它可以接受一个文件名或特定开关项(如“-test”)做参数,示例如下:

  • wordpad.exe 启动写字板,新建文档;
  • wordpad.exe file.txt 使用写字板打开文本文档;
  • wordpad.exe file.rtf 使用写字板打开 RTF 文档;
  • wordpad.exe -test 启动 RTF Editor 控件的演示程序。

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();
}

///

/// 获取文档编辑区域使用的 RtfEditor 实例。
///

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的描述有误

By 范 传根 on 七月 8th, 2008

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

对象到比特流

By 范 传根 on 九月 22nd, 2007

我要将数据通过网络传输,因此需要将各种类型的数值转成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 2005 帮助收藏夹的位置收藏

By 范 传根 on 五月 19th, 2007

使用Visual Studio帮助时,通常会把一些感兴趣的内容添加到帮助收藏夹中。

问题是在重装系统时怎么备份这些收藏哪?我没找到 Visual Studio 中相关的导出功能,但发现收藏夹、搜索过滤等帮助设置以XML文件存放在目录
C:\Documents and Settings\{你的Windows帐号}\Application Data\Microsoft\VisualStudio\8.0\VS Help Data
下。如帮助收藏夹为Favorites.xml。备份这几个文件就达到目的了。我想Microsoft应该提供了更好的方法,哪位朋友发现了请告诉我一下,谢谢
————

#luobonic 发表于2008-04-30 15:31:15 IP: 125.97.14.*
工具–>导入和导出设置–>出现对话框,点导出–>选中帮助收藏夹我的问题:如何对帮助收藏夹排序?我用的05

#chuangen 发表于2008-05-12 14:49:04 IP: 61.164.92.*
谢谢!
我不知道怎么排序

__
发表于CSDN博客(http://blog.csdn.net/chuangen/) 2007年05月19日 23:10:00
URL: http://blog.csdn.net/chuangen/archive/2007/05/19/1616986.aspx

图片管理器

By 范 传根 on 五月 14th, 2007

图片管理器,算是图片浏览器的升级版本,呵呵。使用 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

光盘索引管理器

By 范 传根 on 五月 14th, 2007

我曾将很多资料刻录光盘存储。当需要某个文件时,却很难找到它,于是编写了“光盘索引管理器”。当时是在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

图片浏览器

By 范 传根 on 五月 14th, 2007

缩略图视图:

幻灯片视图:

单张图片视图:

功能菜单:

全屏播放模式:

关于本程序:

__
发表于CSDN博客(http://blog.csdn.net/chuangen/) 2007年05月14日 14:17:00
http://blog.csdn.net/chuangen/archive/2007/05/14/1608207.aspx

写字板.NET

By 范 传根 on 五月 14th, 2007

“写字板.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