博文
利用Visual C#实现任务栏通知窗口(2006-09-06 09:36:00)
摘要:想必大部分网友都使用过QQ、MSN等聊天程序,它们的界面都相当华丽,尤其是当网友上线以及消息提示时会有一个浮动的窗体从屏幕的右下方缓慢升起,既美观又人性化,作为程序员在享受的同时我们也不禁要问:这到底是怎么实现的呢?本文就利用Visual Studio .Net C# 2005以及.Net框架绘图技术来实现这种任务栏通知窗口。
简介
QQ和MSN的任务栏通知窗口很人性化,它可以在不丢失主窗体焦点的前提下显示一个具备皮肤Skin的通知窗体,当它显示一段时间后会自动消失,所以用户根本不用干预它。这样的通知窗体和一般的具备标题栏、系统图标和按钮的窗体没有太大的区别,窗体表面其实就是画上去的一张位图而已,而窗体的浮动则会复杂一点,我们会用到.Net框架的双重缓冲区绘图技术(参见作者编译文章"Windows 窗体的.Net框架绘图技术")来保证移 动窗体时所显示的内容平滑且不闪烁,以及使用P/Invoke平台调用进行对Win32API函数的调用来完成不获得焦点的窗体显示和非标题栏窗体拖动。两种位图的皮肤运行时的界面如下:
背景知识
通知窗口就是将一般的窗体附加上一层皮肤,这里所谓的皮肤就是一张位图图片,该位图图片通过窗体的OnPaintbackground事件被绘制到窗体表面,在附加位图之前需要调整窗体的可视属性,由于绘制操作是针对于窗体客户区域的,所谓客户区域就是指窗体标题栏下方以及窗体边框以内的所有区域,所以需要将窗体的边框和外观属性 FormBorderStyle调整为:None,这样所绘制的图像就会填充整个窗体。
首先,我们会用到Region对象,Region对象可以精确的描绘出任意形状的轮廓范围,通过一个位图图像创建Region对象后再将其传递给窗体的Region属性就可以使窗体按照Region所定义的轮廓显示出来。作为皮肤使用的位图文件可以通过任何图像编辑软件诸如:Photeshop来创建和编辑,只是注意一点,需要将图片的背景色调成特定颜色以便程序绘制时将其清除,我们在这里使用的背景色为粉红色。为了能够让Region对象按照图像中感兴趣的内容边框来创建窗体,我们还需要使用GraphicsPath类将图像轮廓按照一定路径......
内存不能为read或written的解决方案 使用Windows操作系统的人有时(2006-09-06 09:35:00)
摘要: 使用Windows操作系统的人有时会遇到这样的错误信息:
「“0X????????”指令引用的“0x00000000”内存,该内存不能为“read”或“written”」,然后应用程序被关闭。
如果去请教一些「高手」,得到的回答往往是「Windows就是这样不稳定」之类的义愤和不屑。其实,这个错误并不一定是Windows不稳定造成的。本文就来简单分析这种错误的一般原因。
一、应用程序没有检查内存分配失败
程序需要一块内存用以储存数据时,就需要使用操作系统提供的「功能函数」来申请,如果内存分配成功,函数就会将所新开辟的内存区地址返回给应用程序,应用程序就可以通过这个地址使用这块内存。这就是「动态内存分配」,内存地址也就是编程中的「光标」。内存不是永远都招之即来、用之不尽的,有时候内存分配也会失败。当分配失败时系统函数会返回一个0值,这时返回值「0」已不表示新启用的游标,而是系统向应用程序发出的一个通知,告知出现了错误。作为应用程序,在每一次申请内存后都应该检查返回值是否为0,如果是,则意味着出现了故障,应该采取一些措施挽救,这就增强了程序的「健壮性」。若应用程序没有检查这个错误,它就会按照「思维惯性」认为这个值是给它分配的可用游标,继续在之后的执行中使用这块内存。真正的0地址内存区储存的是计算机系统中最重要的「中断描述符表」,绝对不允许应用程序使用。在没有保护机制的操作系统下(如DOS),写数据到这个地址会导致立即当机,而在健壮的操作系统中,如Windows等,这个操作会马上被系统的保护机制捕获,其结果就是由操作系统强行关闭出错的应用程序,以防止其错误扩大。这时候,就会出现上述的「写内存」错误,并指出被引用的内存地址为「0x00000000」。内存分配失败故障的原因很多,内存不够、系统函数的版本不匹配等都可能有影响。因此,这种分配失败多见于操作系统使用很长时间后,安装了多种应用程序(包括无意中「安装」的病毒程序),更改了大量的系统参数和系统档案之后。
二、应用程序由于自身BUG引用了不正常的内存光标
在使用动态分配的应用程序中,有时会有这样的情况出现......
如何制作Bat批处理文件 (2006-09-06 09:33:00)
摘要:后缀是bat的文件就是批处理文件,是一种文本文件。简单的说,它的作用就是自动的连续执行多条命令,批处理文件的内容就是一条一条的命令。那它有什么用呢?
比如,在启动wps软件时,每次都必须执行
C:\>cd wps
C:\WPS>spdos
C:\WPS>py
C:\WPS>wbx
C:\WPS>wps
如果每次用WPS之前都这样执行一次,您是不是觉得很麻烦呢?
如果有一个方法,只需编写一个批处理文件,就会自动执行刚才的所有命令,您想不想学呢?
当您看完此节,自己编写的第一个批处理文件顺利执行时,您一定会大吃一惊的。
此外电脑每次启动时都会寻找autoexec.bat这条批处理文件,从而可执行一些每次开机都要执行的命令,如设置路径path、加载鼠标驱动mouse、磁盘加速smartdrv等,可以使您的电脑真正自动化。
echo、@、call、pause、rem 是批处理文件最常用的几个命令,我们就从他们开始学起。 echo 表示显示此命令后的字符
echo off 表示在此语句后所有运行的命令都不显示命令行本身
@ 与echo off相象,但它是加在其它命令行的最前面,表示运行时不显示命令行本身。
call 调用另一条批处理文件(如果直接调用别的批处理文件 ,执行完那条文件后将无法执行当前文件后续命令)
pause 运行此句会暂停,显示Press any key to continue... 等待用户按任意键后继续
rem 表示此命令后的字符为解释行,不执行,只是给自己今后查找用的
例:用edit编辑a.bat文件,输入下列内容后存盘为c:\a.bat,执行该批处理文件后可实......
去掉代码文件里讨厌的空行 (2006-08-31 14:31:00)
摘要:这篇随笔没什么技术含量,就是记录了一个程序员在平凡工作中的一朵小浪花。
今天在review一些code,有些文件在每两行代码中间有三行空行,看上去非常“稀疏”,用肉眼看起来很不爽。估计多半是在各种编辑器以及Word、Frontpage、Web page等之间来回拷贝的原因。试了试Notepad和VS.NET,好像都不能把这些讨厌的空行快速的一次性的去掉。于是就自己写了一个程序:using System;
using System.IO;
namespace RemoveBlankLine
{
class RemoveBlankLineApp
{
static void Main(string[] args){
if(args.Length!=1){
Console.WriteLine("Usage: RemoveBlankLine.exe mycode.cs");
}
else
{
StreamReader reader=null;
StreamWriter writer=null;
try
{
reader=new StreamReader(args[0]);
writer=new StreamWriter("new."+args[0],false);
string line=reader.ReadLine();
while(line!=null){
if(line.Trim().Length>0){
writer.WriteLine(line);
}
line=reader.ReadLine();
}
}
catch(Exception e){
Console.Write("Exit with error.\r\n\r\n"+e.ToString());
}
finally{
if(reader!=null){
reader.Close();
}
if(writer!=null){
writer.Close(......
如何在Windows Form中实现URL Encoding/Decoding?(2006-08-31 14:22:00)
摘要:如果你想在Windows Forms中实现URL Encoding,HttpUtility类有一个shared (static)方法实现对字符串的URL 编码。下面就是一个例子:【注意要在工程的引用里添加引用System.Web】using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Web;
namespace WindowsApplication1
{
///
/// Form1 的摘要说明。
///
public class Form1 : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Button button1;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.TextBox textBox3;
private System.Windows.Forms.Button button2;
///
/// 必需的设计器变量。
///
private System.ComponentModel.Container components = null;
public Form1()
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent();
//
// TODO: 在 InitializeComponent 调用后添加任何构造函数代码
//
}
///
/// 清理所有正在使用的资源。
///
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.......
使用c#建立虚拟目录 (2006-08-10 15:02:00)
摘要:最近在CSDN论坛里看见网友的一片偏关于使用.net 创建虚拟目录的帖子, 以前一直以为不能用托管代码实现这个功能...
在此总结一下:)
下面是创建虚拟目录的代码
const String constIISWebSiteRoot = "IIS://localhost/W3SVC/1/ROOT";
string virtualDirName = "virtualName";//虚拟目录名称
string physicalPath = @"c:\1";
DirectoryEntry root = new DirectoryEntry(constIISWebSiteRoot);
DirectoryEntry tbEntry = root.Children.Add(virtualDirName, root.SchemaClassName);
&......
处理HTML代码的若干函数 (2006-08-10 15:01:00)
摘要:经过了上个星期的努力学习,对处理html又有了新的发现
感觉真的很不错
可以说js的威力在处理html代码方面我又有所领悟了
1、截取特定长度字符串
Public Shared Function CutString1()Function CutString1(ByVal str As String, ByVal length As Integer) As String
Dim i As Integer = 0
Dim j As Integer = 0
For Each chr As Char In str
If Asc(chr) > 127 Then
i = i + 2
Else
&......
page事件顺序(.net2.0) (2006-08-10 15:00:00)
摘要:
Protected Sub Page_PreInit(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreInit
如果有MasterPage的话,在这里执行MasterPage里面的page事件,事件顺序在这篇文章里有写道
Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init
Protected Sub Page_InitComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.InitComplete
Protected Sub Page_PreLoad(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreLoad
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Protected Sub Page_LoadComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.LoadComplete
Protected Sub Page_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
Protected Sub Page_PreRenderComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRenderComplete
Protected Sub Page_SaveStateComplete(ByVal sender As Object, ......
ASP.NET 中执行 URL 重写 (2006-08-10 14:59:00)
摘要:URL 重写就是把URL地址重新改写(汗^_^)。
详情:http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx
优点:把url缩短等
用法:1.下载ms的URLRewrite.dll,放到你的bin下
2.在web.config里设置如下:
~/d(\d+)\.aspx
~/default.aspx?id=$1
type="URLRewriter.RewriterFactoryHandler, URLRewriter" />
URL 重写的常见用法(2)(2006-08-10 14:55:00)
摘要:使用 HTTP 模块执行 URL 重写
创建 HTTP 模块与创建可以实现 IHttpModule 接口的类一样简单。IHttpModule 接口定义了两种方法:
•
Init(HttpApplication)。此方法在初始化 HTTP 模块后触发。在此方法中,您将把事件处理程序绑定到相应的 HttpApplication 事件。
•
Dispose()。当请求已完成并已发送回 IIS 时调用此方法。您应当在此处执行所有最终的清除操作。
为了便于为 URL 重写创建 HTTP 模块,我将从创建抽象基类 BaseModuleRewriter 开始介绍。此类将实现 IHttpModule。在 Init() 事件中,它将 HttpApplication 的 AuthorizeRequest 事件绑定到 BaseModuleRewriter_AuthorizeRequest 方法。BaseModuleRewriter_AuthorizeRequest 方法将调用该类传入被请求的 Path 的 Rewrite() 方法,以及传入 Init() 方法的 HttpApplication 对象。Rewrite() 方法是抽象的,也就是说,在 BaseModuleRewriter 类中,Rewrite() 方法没有方法主体;从 BaseModuleRewriter 派生而来的类必须覆盖此方法并提供方法主体。
具有此基类后,只需创建由 BaseModuleRewriter 派生的类即可,该类可以覆盖 Rewrite() 并在那里执行 URL 重写逻辑。下面显示了 BaseModuleRewriter 的代码。public abstract class BaseModuleRewriter : IHttpModule
{
public virtual void Init(HttpApplication app)
{
// 警告!此代码不适用于 Windows 身份验证!
// 如果使用 Windows 身份验证,
// 请改为 app.BeginRequest
app.AuthorizeRequest += new
Eve......