博文
ASP.NET Doorstep之 Hello,ASP.NET(2008-07-15 17:09:00)
摘要:从零开始学习ASP.NET.
打开Visual Studio 2005à文件à新建à网站à选择Visual Studio已安装的模板“ASP.NET网站”,语言选择“Visual C#”à确定
以下是生成的解决方案
由上我们可以看出asp.net的文件结构[用C#.net进行开发asp.net,用其它语言有所不同]
一个asp.net文件由以下几中类型的文件构成。它们分别是:
*.aspx:网页文件。一个工程里面可以有多个网页文件,原因是一个网站里面有多个页面,这类文件主要用于完成页面的显示。
*.aspx.cs:网页对应的代码文件.这类文件主要用于完成页面的功能。当然还有一些其它的附属文件。
WebConfig文件:应用程序配置文件(重要),可以为应用程序设置一个参数
下面我们来添加一些控件以完成一个简单的网页。
1. 为网页添加标题,打开Default.aspx网页脚本文件,在<title> </title>之间添加标题My First ASP Page: <title> My First ASP Page </title>
2. 向客户端的IE输出字符串,打开Default.aspx.cs网页代码文件,在Page_Load事件中添加response.write("字符串");
......
从char/wchar_t到TCHAR(2)(2008-04-26 00:56:00)
摘要:五.MFC动态字符串类CString
// …\Microsoft Visual Studio 8\VC\atlmfc\include\afx.h
一个CString对象由可变长度的一队字符组成。CString使用类似于Basic的语法提供函数和操作符。连接和比较操作符以及简化的内存管理使CString对象比普通字符串数组容易使用。
CString是基于TCHAR数据类型的对象。如果在你的程序中定义了符号_UNICODE,则TCHAR被定义为类型wchar_t,即16位字符类型;否则,TCHAR被定义为char,即8位字符类型。在UNICODE方式下,CString对象由16位字符组成。非UNICODE方式下,CString对象由8位字符组成。 而VS2005默认TCHAR是wchar而不是char.
当不使用_UNICODE时,CString是多字节字符集(MBCS,也被认为是双字节字符集,DBCS)。注意,对于MBCS字符串,CString仍然基于8位字符来计算,返回,以及处理字符串,并且你的应用程序必须自己解释MBCS的开始和结束字节。
CString 提供 operator LPCTSTR 来在 CString 和 LPCTSTR 之间进行转换。
有关CString的操作请参考MSDN MFC类库。
六.更安全的C语言字符串处理函数 Strsafe.h
// …\Microsoft Visual Studio 8\VC\PlatformSDK\Include\strsafe.h
注意:使用StringCchCopy /StringCchPrintf时要#include "strsafe.h".
STRSAFEAPI是为了解决现有的 C 语言运行时函数的代码太容易产生的“内存溢出”问题。当我们引用 strsafe 系列函数时,原有的 C 语言字符串处理函数都将被自动进行 #undef 处理。调试过程中的警告或出错信息将会告诉我们哪些函数哪些不安全,哪些已经被相应的 strsafe 系列函数取代了。
//1.不赞成使用不安全的函数,以避免产生编译错误
//2.如果你不要安全处理,你可以在包含strsafe.h头文件之前,
#define STRSAFE_NO_DEPRECATE
#ifdef DEPREC......
从char/wchar_t到TCHAR(1)(2008-04-26 00:54:00)
摘要:一.ANSI和UNICODE
1.为什么要使用Unicode?
(1) 可以很容易地在不同语言之间进行数据交换。
(2) 使你能够分配支持所有语言的单个二进制.exe文件或DLL文件。
(3) 提高应用程序的运行效率。
Windows 2000是使用Unicode从头进行开发的,如果调用任何一个Windows函数并给它传递一个ANSI字符串,那么系统首先要将字符串转换成Unicode,然后将Unicode字符串传递给操作系统。如果希望函数返回ANSI字符串,系统就会首先将Unicode字符串转换成ANSI字符串,然后将结果返回给你的应用程序。进行这些字符串的转换需要占用系统的时间和内存。通过从头开始用Unicode来开发应用程序,就能够使你的应用程序更加有效地运行。
Windows 98只支持ANSI,只能为开发ANSI应用程序。 Windows CE 就是使用Unicode的操作系统,完全不支持ANSI版函数。
Microsoft将COM从Win16转换成Win32时,所有COM接口方法都只能接受Unicode字符串。
2.ANSI字符和Unicode字符
ANSI字符类型为CHAR,指向字符串的指针PSTR(LPSTR),指向一个常数字符串的指针PCSTR(LPCSTR);对应的Windows定义的Unicode字符类型为WCHAR(typedef WCHAR wchar_t),指向Unicode字符串的指针PWSTR ,指向一个常数Unicode字符串的指针PCWSTR 。
ANSI “ANSI”
Unicode L“UNICODE”
ANSI/Unicode T(“string”)或_TEXT(“string”)
3.ANSI字符和Unicode字符串的操作
双字节(DBCS)字符集中,字符串的每个字符可以包含一个或两个字节。如果只是调用strlen()函数,那么你就无法知道字符串到底有多少个字符,它只能告诉你到达结尾的0之前有多少个字节。
标准c中的strcpy,strchr,strcat等只能用于ANSI字符串,不能正确处理Unicode字符串,因此也提供了一组补充函数,功能等价,但用于Unicode码。我们来看看string .h字符串头文件中是怎样处理char*和wchar_t......
MFC/Windows编程之个性化图标(2008-04-08 16:15:00)
摘要:
我们发现向导生成的MFC程序生成的桌面上(资源管理器上)的.exe文件和运行时标题栏上(最小化时任务栏上)的图标都是一样,实际上我们可以为它们配置不同的图标。实际上vc默认的那个MFC的图标(本案例中的Test.ico)是一个ID号对应了2个图标,一个16×16的一个32×32的。一个16×16的小图标是用于标题栏和最小化时任务栏的。另一个32×32的大图标则是用于桌面和资源管理器的。故我们可以为应用程序再添加一个与默认图标大小不同的.ico文件.
以下为MFC向导生成的窗口(标题已改)
以下为生成的.EXE文件在资源管理器中的缩略图:
以下为项目的资源res文件夹:
一.个性化图标
(1)为应用实例添加光标资源
右击解决方案资源管理器中的资源文件-〉添加-〉资源-〉选择Icon资源类型-〉若选“导入”则可以从导入硬盘中已有的ICON文件;若选“新建” 则打开资源编辑器,自己绘制图标。这里我们选择导入我们收藏的ICON文件,一个黄纸飞机IDI_ICON1和一个红纸飞机IDI_ICON2。
我们在这里先将这两个图标通过CDC的DrawIcon函数在窗口中绘制出来。
void CEX041View::OnDraw(CDC* pDC)
{
// TODO: 在此处为本机数据添加绘制代码
HICON hIcon=AfxGetApp()->LoadIcon(IDI_ICON1);
pDC->DrawIcon(0,0,hIcon);
DestroyIcon(hIcon);
hIcon=AfxGetApp()->LoadIcon(IDI_ICON2);
pDC->DrawIcon(50,0,hIcon);
DestroyIcon(hIcon);
}
(2)为应用程序实例加载光标资源,并为主窗口设置指......
MFC/Windows编程之修改窗口标题(2008-04-08 15:38:00)
摘要: 首先我们启动Visual Studio2005,新建项目Test利用MFC App Wizard 生成MFC应用程序框架。程序运行后显示如下:
修改窗口标题字符串“无标题-Test”
<1> 修改前半部分
方法一:更改StringTable的IDR_MAINFRME的标题,将第一个\n之和第二个\n之间添加字符串fan为:
Test\nfan\nTest\n\n\nTest.Document\nTest.Document
方法二:在 CEX041Doc::OnNewDocument()中添加SetTitle("我的程序");
BOOL CTestDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: 在此添加重新初始化代码
SetTitle(L"fan");
// (SDI 文档将重用该文档)
return TRUE;
}
方法三:重载虚函数SetTitle
void CTestDoc::SetTitle(LPCTSTR lpszTitle)
{
// TODO: 在此添加专用代码和/或调用基类
CDocument::SetTitle(L"fan");
}
运行结果如下:
<2>修改后半部分
修改StringTable的IDR_MAINFRME的标题,将第一个\n之前的字符串Test替换为XJTU:XJTU\nfan\nEX041\n\n\nEX041.Document\nEX041.Document
运行结果如下:
<3>去掉标题中间的“-”
......
常用C头文件及其在标准C++中的保留(2008-04-05 10:16:00)
摘要:
头文件的作用
早期的编程语言如Basic、Fortran 没有头文件的概念,C++/C 语言的初学者虽然会用使用头文件,但常常不明其理。这里对头文件的作用略作解释:
(1)通过头文件来调用库功能。在很多场合,源代码不便(或不准)向用户公布,只要向用户提供头文件和二进制的库即可。用户只需要按照头文件中的接口声明来调用库功能,而不必关心接口怎么实现的。编译器会从库中提取相应的代码。
(2)头文件能加强类型安全检查。如果某个接口被实现或被使用时,其方式与头文件中的声明不一致,编译器就会指出错误,这一简单的规则能大大减轻程序员调试、改错的负担。
大家写程序是建立在编译器系统为我们提供的底层标准库函数基础上,这些库函数的接口就声明在标准库头文件中。若想编写高效的程序,我们要对编译器系统提供的标准库函数信手拈来,首先要熟知他们的声明所在的头文件。
以下是对C/C++常用头文件进行简单梳理:
标准C控制台输入输出流函数头文件<cstdio>-----<stdio.h>
using ::size_t; using ::fpos_t; using ::FILE;
using ::clearerr; using ::fclose; using ::feof;
using ::ferror; using ::fflush; using ::fgetc;
using ::fgetpos; using ::fgets; using ::fopen;
using ::fprintf; using ::fputc; using ::fputs;
using ::fread; using ::freopen; using ::fscanf;
using ::fseek; using ::fsetpos; using ::ftell;
using ::fwrite; using ::getc; using ::getchar;
using ::gets; using ::perror;
using ::putc; using ::putchar;
using ::printf; using ::puts; using ::remove;
using ::rename; using ::rewind; using ::scanf;
......
C#Doorstep2面向对象程序设计篇8(2008-04-03 16:42:00)
摘要:
事件
事件是对象发送的消息,以发信号通知操作的发生。操作可能是由用户交互(例如鼠标单击)引起的,也可能是由某些其它的程序逻辑触发的。引发(触发)事件的对象叫做事件发送方。捕获事件并对其作出响应的对象叫做事件接收方。
在事件通信中,事件发送方类不知道哪个对象或方法将接收到(处理)它引发的事件。所需要的是在源和接收方之间存在一个媒介(或类似指针的机制)。这个媒介就是委托。
新建一个Windows窗体应用程序,接口上放置一个卷标,一个框架,框架上放置5个按钮。界面如下。各按钮Tag依次为0、1、2、3、4,给按钮添加单击事件,5个按钮的单击事件处理函数均为button1_Click。
//挡位元元元元模拟案例演示如何通过委托来定义事件。
//Form1.cs
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
namespace Exam2_13
{
public class Form1 : System.Windows.Forms.Form
{
//窗体设计器自动生成的代码略
static void Main()
{
Application.Run(new Form1());
}
priv......
C#Doorstep2面向对象程序设计篇7(2008-04-03 16:40:00)
摘要:
委托
委托属于引用类型,其作用类似于 C++中函数指针的用途。与函数指针不同,委托实例独立于它所封装的方法的类;最主要的是那些方法与委托的类型是兼容的。另外,函数指针只能引用静态函数,而委托可以引用静态和实例方法。委托最大的特点是它不知道或不关心自己所引用的对象的类,任何对象中的方法都可以通过委托动态的调用,只要方法的参数类型和返回类型必须和委托匹配。
using System;
public delegate void D(int x);
class C
{
public static void F1(int i)
{
Console.WriteLine("C.F1: " + i);
}
public void F2(int i)
{
Console.WriteLine("C.F2: " + i);
}
}
class Test
{
static void Main()
{
D cd1 = new D(C.F1); //此处为静态方法的调用
C c = new C();
D cd2 = new D(c.F2); //此处为非静态方法的调用 &n......
C#Doorstep2面向对象程序设计篇6(2008-04-03 16:38:00)
摘要:
密封类(sealed)
C#提供一种不能被继承的类,称为密封类。密封类的声明方法是在类名前加上sealed修饰符。修饰符abstract和sealed不能同时使用。
密封类在声明中使用sealed 修饰符,这样就可以防止该类被其它类继承。如果试图将一个密封类作为其它类的基类,C#将提示出错。理所当然,密封类不能同时又是抽象类,因为抽象总是希望被继承的。
sealed 修饰符可以应用于类、实例方法和属性。密封类不能被继承。密封方法会重写基类中的方法,但其本身不能在任何派生类中进一步重写。当应用于方法或属性时,sealed 修饰符必须始终与 override 一起使用。
在类声明中使用 sealed 修饰符可防止继承此类,sealed 的class只能实例化。例如:
sealed class SealedClass
{
public int x;
public int y;
}
将密封类用作基类或将 abstract 修饰符与密封类一起使用是错误的。
结构是隐式密封的;因此它们不能被继承。
// cs_sealed_keyword.cs
using System;
sealed class SealedClass
{
public int x;
public int y;
}
class MainClass
{
static void Main()
{
SealedClass sc = new SealedClass();
sc.x = 110;
sc.y = 150;
Console.WriteLine("x = {0}, y = {1}", sc.x, sc.y);
Console.ReadKey();
}
}
在前面的示例中,如果试图通过使用下面的语句从密封类继承:
class MyDerivedC: MyClass {} // Error
将收到错误信息:
'MyDerivedC' cannot inherit from sealed class 'MyClass'.
抽象类
当创建一个类时,有时需要让该类包含一些特殊的方法,该类对这些方法不提供具体实......
C#Doorstep2面向对象程序设计篇5(2008-04-03 16:34:00)
摘要:
多态性
C#的多态性主要体现在方法(虚函数)重载上。
多态性是指不同的对象收到相同的消息时,会产生不同动作。从而实现“一个接口,多个方法”。它允许以相似的方式来对待所有的派生类,尽管这些派生类是各不相同的。例如动物Animal类的不同实体(猫,狗,猪,牛…)的叫声都各不相同,它们的睡姿也大为迥异。
C#支持两种类型的多态性:
(1)编译时的多态性是通过重载类实现的,系统在编译时,根据传递的参数个数、类型信息决定实现何种操作。
(2)运行时的多态性是指在运行时,根据实际情况决定实现何种操作。C#中运行时的多态性通过虚函成员实现。
类中两个以上的方法(包括隐藏的继承而来的方法)取的名字相同,只要使用的参数类型或者参数个数不同,编译器便知道在何种情况下应该调用哪个方法,这就叫做方法的重载。这样就实现了“一个接口,多种动作”。
如果希望基类中某个方法能够在派生类中进一步得到改进,那么可以把这个方法在基类中定义为虚方法。类中的方法前加上了virtual修饰符成为虚方法,反之为非虚方法。使用了virtual修饰符后不允许再有static,abstract或override修饰符。
普通方法重载要求方法名称相同,参数类型和参数个数不同,而虚方法重载要求方法名称、返回值类型、参数表中的参数个数、类型顺序都必须与基类中的虚函数完全一致。在派生类中声明对虚方法的重载要求在声明中加上override关键词,而不能有new、static或virtual修饰符。
类成员的可访问性
public 访问不受限制
internal 访问权限是当前的程序集(可以简单理解为项目),也就是exe或者dll檔如果在同一个程序集中,假如有一个类A,其它类中想要使用A中的属性或方法的话,不管是new方法产生的还是继承产生的,都可以访问到protected internal和internal的方法。
但是如果A类不是在同一个程序集中,就有很大的区别了,首先,你用new方法产生对象中,不可以使用protected internal或internal来访问。继承的方式可以访问到protected internal,但不可访问internal。 当你写的一些类,不想让外部......