C#学习二天笔记
2]类对象访问方法和变量,而用类名访问静态变量,静态方法
3]在控件上显示时.可以用label.Text=(54*54).ToString();显示数字
4]//Parse是将字符串形式的数字(不能是字符型数字)转换成数值类型的数字。
cstring num="10";
int inum=Int.Parse(num);
5]int i=90;
Response.Write(i.ToString()); //可能明白!
6] Random rand=new Random();
int i=rand.Next(1,10); //产生从1到10之间的随机整数
转义符 字符名
\' 单引号 \" 双引号 \\ 反斜杠
\0 空字符 \a 感叹号(Alert ) \b 退格
\f 换页 \n 新行 \r 回车
\t 水平 tab \v 垂直tab
以下是有用的成员修饰符:
abstract—— 说明一个方法或存取标志不能含有一个实现.它们都是隐式虚拟,且在继承类中,你必须提供override关键字.
const—— 这个修饰符应用于域成员或局部变量.在编译时常量表达式被求值,所以,它不能包含变量的引用.
event—— 定义一个域成员或属性作为类型事件.用于捆绑客户代码到类的事件.
extern—— 告诉编译器方法实际上由外部实现.第10章 “和非受管代码互相操作”将全面地涉及到外部代码.
override—— 用于改写任何基类中被定义为virtual的方法和存取标志.要改写的名字和基类的方法必须一致.
readonly—— 一个使用readonly修饰符的域成员只能在它的声明或者在包含它的类的构造函数中被更改.
static—— 被声明为static的成员属于类,而不属于类的实例.你可以用static于域成员、方法、属性、操作符甚至构造函数.
virtual—— 说明方法或存取标志可以被继承类改写.
$$$$$$$$$$$$$$$$$$$$$$$ csc.exe的环境变量设置
csc.exe是.net用来编译.cs文件的,但必须要在安装目录下使用。 所以我们要设置一下环境变量。
这个其实是蛮简单的,但我不会,所以还是记下来,省得忘掉。
C#环境变量设置:
1、在桌面右击[我的电脑]->[属性]->[高级]->[环境变量]
2、在下面的系统变量栏点击“新建”
3、变量名输入“csc”
4、变量值输入:“C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\”
5、然后在系统变量列表框中双击“Path”
6、在变量名文本框的最后面加入“;%csc%”
恩,现在可以在任意目录下调试.cs文件了。
=======================
@#$%-----C#学习指南----
===========================
获取文件的版本信息:
FileVersionInfo myFileVersionInfo1 = FileVersionInfo.GetVersionInfo( "D:\\TEST.DLL" );
textBox1.Text="版本号: " + myFileVersionInfo1.FileVersion;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
更改文件属性,删除只读文件:下例欲将E:\test.txt文件拷贝至D:\tmp\test.txt,但D:\tmp\test.txt已经存在.
File.Copy( sourceFile,destinationFile,true ); 用来拷贝文件
当destinationFile已经存在时,无法将文件file1拷贝到目标文件,
因此先删除destination文件,File.Delete( )方法不能删除只读文件,
因此,如果文件属性为只读( Attributes属性中会包含有"ReadOnly" ),
先把文件属性重置为Normal,然后再删除:
string file1="E:\\test.txt";
string destinationFile="d:\\tmp\\test.txt";
if( File.Exists( destinationFile ) )
{
FileInfo fi=new FileInfo( destinationFile );
if( fi.Attributes.ToString( ).IndexOf( "ReadOnly" )!=-1 )
fi.Attributes=FileAttributes.Normal;
File.Delete( destinationFile );
}
File.Copy( file1,destinationFile,true );
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C#中字符串的格式化及转换成数值的方法 :字符串转换成数字,比如"1234"转换成数字1234:
string str="1234";
int i=Convert.ToInt32( str );
格式化字符串,向长度小于30的字符串末尾添加特定字符,补足n个字符,使用String类的PadRight( int,char )方法:
String str="1234";
str=str.PadRight( 30,' ' ) //向长度小于30的字符串末尾添加空格,补足30个字符
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1] 按行读写文件
判断文件是否存在:File.Exists( string filePath )
判断目录是否存在:Directory.Exists( "D:\\LastestVersion" )
按行读取文件:
int fileCount=0; // Open the file just specified such that no one else can use it.
StreamReader sr = new StreamReader( textBox1.Text.Trim( ) );
while( sr.Peek( ) > -1 ) //StreamReader.Peek( )返回下一个可用字符,但不使用它
{
listBox1.Items.Add( sr.ReadLine( ) );
fileCount++;
}
sr.Close( );
2] 按行写入文件:
StreamWriter sw = new StreamWriter( "D:\\result.txt" );
for( int i=0;i<10;i++ )
{
sw.WriteLine( "这是第"+i.ToString( )+"行数据" );
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1] 文件目录对话框的使用 文件对话框即过滤条件的使用:
string resultFile="";
OpenFileDialog openFileDialog1 = new OpenFileDialog( );
openFileDialog1.InitialDirectory = "D:\\Patch" ;
openFileDialog1.Filter = "All files ( *.* )|*.*|txt files ( *.txt )|*.txt" ;
openFileDialog1.FilterIndex = 2 ;
openFileDialog1.RestoreDirectory = true ;
if( openFileDialog1.ShowDialog( ) == DialogResult.OK )
resultFile=openFileDialog1.FileName;
2] 目录对话框的使用:
string resultFolder="";
FolderBrowserDialog openFolderDialog1=new FolderBrowserDialog( );
openFolderDialog1.RootFolder=Environment.SpecialFolder.MyComputer;
if( openFolderDialog1.ShowDialog( )==DialogResult.OK )
resultFolder=openFolderDialog1.SelectedPath;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C# WinForm编程中:Win Form登录机制的实现
Main窗体为应用程式主窗体,Login为登录窗体?两种实现方式如下:
1、应用程式入口放在Login窗体,在Login窗体实现登录机制,验证通过则创建Main窗体的实例,并将自身隐藏.
具体实现:
///Step1:验证登录
///Step2:通过
this.hide( );
oMain.Show( );
虽然可以实现登录机制,但是Login窗体并没有释放掉,
而是被隐藏掉,内存资源未有效利用.这种方式其实是不可取的.
2、应用程式入口放在Main窗体,在Main函数中创建Login窗体的实例,
Login窗体完成登录验证,返回Main窗体,程式继续执行.
需要注意的是Login窗体只有验证通过时返回值才为DialogResult.OK,
其余时返回DialogResult.None.这样在Main窗体就可以根据返回值判断是否创建Main窗体的实例.
/// <summary>
/// 应用程序的主入口点.
/// </summary>
[STAThread]
static void Main( )
{
frmLogin login = new frmLogin( );
login.ShowDialog( );
if( login.DialogResult.Equals( DialogResult.OK ) )
{
login.Close( );
Application.Run( new frmMain( ) );
}
}
二:利用ImageList作为Resource的载体
Win Form的程式,外部文件是比较烦人的事情,
这里采用Resource将外部图片文件加载到程式中.而ImageList是一个不错的选择,使用简单.
具体实现:
///Step1:将图片在可是模式下加载到ImageList中.
///Step2:程式中可以采用
this.imgLstResource.Images[index]的方式获取其中的Image对象.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C# WinForm 中在窗口标题栏上加按钮
重写窗口过程(WndProc),处理一些非客户区消息(WM_NCxxxx)
两个技巧:
1)、C#中重写窗口过程不用再调用SetWindowLong API了,直接overide一个WndProc就可以了.
2)、Windows API中的HDC可以通过Graphics.FromHdc( )转换为( 创建出 )System.Drawing.Graphics,
然后就可以用.NET Framework (GID+??)提供的绘图功能方便地进行画图了.
终于可以抛开讨厌的GDI API了(说实在话,在C#中调用Windows API真的太麻烦了: )).代码如下:
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.Runtime.InteropServices;
using System.Diagnostics;
namespace WindowsApplication2
{
/// <summary>
/// Form1 的摘要说明.
/// </summary>
public class Form1 : System.Windows.Forms.Form
{
/// <summary>
/// 必需的设计器变量.
/// </summary>
private System.ComponentModel.Container components = null;
public Form1( )
{
//
// Windows 窗体设计器支持所必需的
//
InitializeComponent( );
//
// TODO: 在
InitializeComponent 调用后添加任何构造函数代码
//
}
/// <summary>
/// 清理所有正在使用的资源.
/// </summary>
protected override void Dispose(bool disposing)
{
if(disposing)
{
if ( components != null )
{
components.Dispose( );
}
}
base.Dispose(disposing);
}
#region Windows 窗体设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容.
/// </summary>
private void
InitializeComponent( )
{
//
// Form1
//
this.AutoScaleBaseSize = new System.Drawing.Size( 6, 14 );
this.ClientSize = new System.Drawing.Size( 292, 266 );
this.Name = "Form1";
this.Text = "Form1";
this.SizeChanged += new System.EventHandler(
this.Form1_SizeChanged );
}
#endregion
/// <summary>
/// 应用程序的主入口点.
/// </summary>
[STAThread]
static void Main( )
{
Application.Run( new Form1( ) );
}
[DllImport ( "User32.dll" )]
private static extern IntPtr GetWindowDC( IntPtr hwnd );
[DllImport ( "User32.dll" )]
private static extern
int ReleaseDC( IntPtr hwnd, IntPtr hdc );
[DllImport ( "Kernel32.dll" )]
private static extern
int GetLastError( );
//标题栏按钮的矩形区域.
Rectangle m_rect = new Rectangle( 205, 6, 20, 20 );
protected override void WndProc( ref Message m )
{
base.WndProc( ref m );
switch( m.Msg )
{
case 0x86://WM_NCACTIVATE
goto case 0x85;
case 0x85://WM_NCPAINT
{
IntPtr hDC = GetWindowDC( m.HWnd );
//把DC转换为.NET的Graphics就可以很方便地使用Framework提供的绘图功能了
Graphics gs = Graphics.FromHdc( hDC );
gs.FillRectangle( new LinearGradientBrush( m_rect, Color.Pink, Color.Purple, LinearGradientMode.BackwardDiagonal ), m_rect );
StringFormat strFmt = new StringFormat( );
strFmt.Alignment = StringAlignment.Center;
strFmt.LineAlignment = StringAlignment.Center;
gs.DrawString( "√",
this.Font, Brushes.BlanchedAlmond, m_rect, strFmt );
gs.Dispose( );
//释放GDI资源
ReleaseDC( m.HWnd, hDC );
break;
}
case 0xA1://WM_NCLBUTTONDOWN
{
Po
int mousePo
int = new Po
int( (
int )m.LParam );
mousePo
int.Offset( -
this.Left, -
this.Top );
if( m_rect.Contains( mousePo
int ) )
{
MessageBox.Show( "hello" );
}
break;
}
}
}
//在窗口大小改变时及时更新按钮的区域.
private void Form1_SizeChanged( object sender, System.EventArgs e )
{
m_rect.X =
this.Bounds.Width - 95;
m_rect.Y = 6;
m_rect.Width = m_rect.Height = 20;
}
}
}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C#中如何处理父窗口及其子窗口标题
如果你用 MFC 编写过多文档界面(MDI)Windows 程序,
那么肯定知道:如果父窗口标题为“PCaption”,子窗口标题为“CCaption”,
那么每当子窗口最大化并处于激活状态时,
子窗口标题一般都会与父窗口标题合二为一,变成“PCaption-[CCaption]”.
这是一种 MDI 的默认行为.用 C# 编写多文档界面程序也不例外.
很多用户都不喜欢这种缺省特性,往往想用定制的窗口标题取而代之.
本文将示范如何在C#程序中定制和修改MDI应用的窗口标题.
如果用MFC来编程,只要改写框架窗口类的虚函数 CFrameWnd::OnUpdateFrameTitle 即可.
那么在微软的 .NET 框架中如何用C#实现相同的功能呢?
首先,我们必须理解 MDI 本身是如何通过 Windows 核心 API 来实现自己的行为特性的,
其实这与MFC或者.NET的公共语言运行时(CLR)没有什么关系.
在创建MDI应用时,框架及其子窗口有各自专门的窗口过程
DefFrameProc 和 DefMDIChildProc,一个处理各种 WM_MDIXXX 消息以及其它类似 WM_SIZE, WM_SYSCOMMAND 的消息,
另一个实现 MDI 行为.
如果用纯 C 代码编写,那么必须自己负责用 DefFrameProc 和 DefMDIChildProc 创建窗口;
在 MFC 中则使用 CMDIFrameWnd/CMDIChildWnd;
.NET 框架平台里则设置 Form.IsMdiContainer 和 Form.MdiParent,
不管用哪种方式,其核心都是 user kernel,尤其是 DefFrameProc,
当 MDI 子窗口最大化时,它会联接父子窗口的标题文本来产生主窗口标题串.
理解了这一点,下面我来示范如何改写MDI.
这个例子的原始版本来自 MSDN 库中用C#写的 Scribble MDI(用 “scribble sample”搜索一下即可找到).
基本思路是首先在 Scribble 例子的 MainWindow 中改写 WM_GETTEXT 消息处理例程,
必须添加两个数据成员:NormalText 和 MaximizedText,用它们来保存常态和最大化状态的标题 :
// in Scribble.cs, MainWindow class
private String NormalText = "Scribble2";
private String MaximizedText = "Window is now maximized";
如果想让其它类存取这两个成员,那么可以通过属性机制代替数据成员,如:
private String normaltext;
public String NormalText
{
get { return normaltext; }
set { normaltext = value; }
}
因为在例子程序中 MainWindow 是唯一一个存取该字符串的类,
所以没有必要使用属性机制.有了这两个新的数据成员,你要做的只是 改写 WM_GETTEXT 处理例程
返回子窗口最大化状态以及常态时的标题文本.那么如何改写 WM_GETTEXT 处理例程呢?
Windows.Forms 提供了一些 处理 WM_XXX 消息的虚拟函数,
如 OnResize/WM_SIZE等,但是恰恰缺少与 WM_GETTEXT 相关东东(OnGetText/WM_GETTEXT).
不要担心,没有虚函数,我们总是可以改写包罗万象的 WndProc 处理例程.
为此必须知道所处理的消息ID,也就是 WM_GETTEXT 的消息 ID = 0x000D,
有人会问,你是怎么知道这个消息的 ID 是 0x000D ?
一种方法是运行 SPY 获?硪恢址椒ㄊ侵苯硬檎襑indows SDK 中的 winuser.h 头文件.
一旦你能深入到 WndProc 这一层次编写代码,那么你基本上能用 C 语言写程序了,
因为 Win32 API 和其它语言之间所有东东通过 WPARAMs 和 LPARAMs 参数传递的,包括字符串在内.
对于 WM_GETTEXT 来说,Message.LParam 是指向 char* 的指针,Message.WParam 是该指针长度.
也就是说你必须完成将文本串拷贝到调用者的缓冲里.好在这并不是太难,下面是程序代码:
public class MainWindow : System.Windows.Forms.Form
{
private String NormalText = "Scribble2";
private String MaximizedText = "Window is now maximized";
// Handle WM_GETTEXT: Return maximized or
// normal text, depending on
// state of active MDI child window.
protected override void WndProc( ref Message m )
{
const int WM_GETTEXT = 0x000D;
if ( m.Msg==WM_GETTEXT ) {
Form active = this.ActiveMdiChild;
String s = active!=null &&
active.WindowState==FormWindowState.Maximized ? MaximizedText :
NormalText;
char[] c = s.ToCharArray( );
IntPtr buf = m.LParam;
int len = c.Length;
Marshal.Copy( c, 0, buf, Math.Min( ( int )m.WParam, len ) );
m.Result = ( IntPtr )len;
return;
}
base.WndProc( ref m );
}
...... // rest of MainWindow unchanged from Scribble sample
} 经过上述的改动,现在运行程序,当MDI子窗口最大化时,主窗口标题显示的文本是“Window is now maximized”,
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
C#里操作时间的例子
DateTime dtCurrTime = DateTime.Now;
AddItem( "Current Time is " + dtCurrTime.ToString( ) );
AddItem( "Year is " + dtCurrTime.Year.ToString( ) );
AddItem( "Month is " + dtCurrTime.Month.ToString( ) );
AddItem( "Day of month is " + dtCurrTime.Day.ToString( ) );
AddItem( "Day of week is " + dtCurrTime.DayOfWeek.ToString( ) );
AddItem( "Hour is " + dtCurrTime.Hour.ToString( ) );
AddItem( "Minute is " + dtCurrTime.Minute.ToString( ) );
AddItem( "Second is " + dtCurrTime.Second.ToString( ) );
AddItem( "Millisecond is " + dtCurrTime.Millisecond.ToString( ) );
AddItem( "ShortDateString is " + dtCurrTime.ToShortDateString( ) );
AddItem( "LongDateString is " + dtCurrTime.ToLongDateString( ) );
AddItem( "ShortTimeString is " + dtCurrTime.ToShortTimeString( ) );
AddItem( "LongTimeString is " + dtCurrTime.ToLongTimeString( ) );
TimeSpan Span = new TimeSpan( 4,2,15,0 ); //( days, hours, minutes, seconds )
DateTime dtOld = new DateTime( 2000,1,1,12,0,0,0 );//( year,month,day,hours,minutes,seconds, milliseconds )
DateTime dtNew = dtOld + Span;
AddItem( "Original date was " + dtOld.ToLongDateString( ) +
" " + dtOld.ToShortTimeString( ) );
AddItem( "Adding time span of " + Span.ToString( ) );
AddItem( "Result is " + dtNew.ToLongDateString( ) +
" " + dtNew.ToShortTimeString( ) );
AddItem( "Days: " + Span.Days.ToString( ) );
AddItem( "Hours: " + Span.Hours.ToString( ) );
AddItem( "Minutes: " + Span.Minutes.ToString( ) );
AddItem( "Seconds: " + Span.Seconds.ToString( ) );
AddItem( "Milliseconds: " + Span.Milliseconds.ToString( ) );
AddItem( "Ticks: " + Span.Ticks.ToString( ) );
AddItem( "TicksPerSecond: " + TimeSpan.TicksPerSecond.ToString( ) );
AddItem( "TicksPerHour: " + TimeSpan.TicksPerHour.ToString( ) );
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
可以给控件添加提示信息
在对话框中添加ToolTip控件,在代码中写入下面代码:
toolTip1.SetToolTIp(button,"");//当然定稿的是你希望显示的文字。前面是控件的Name.no Text
出处:http://bober.cnblogs.com/
CARE健康网: http://www.aicareyou.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号