日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#(WINFORM)学习

發布時間:2025/3/15 C# 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#(WINFORM)学习 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、C#基礎

類型和變量

類型

C# 支持兩種類型:“值類型”和“引用類型”。值類型包括簡單類型(如 char、int 和 float等)、枚舉類型和結構類型。引用類型包括類 (Class)類型、接口類型、委托類型和數組類型。

變量的類型聲明

每個變量必須預先聲明其類型。如

int a;

???? int b = 100;

???? float j = 4.5;

string s1;

用object可以表示所有的類型。

預定義類型

下表列出了預定義類型,并說明如何使用。

類型

說明

示例

范圍

object

所有其他類型的最終基類型

object o = null;

?

string

字符串類型;字符串是 Unicode 字符序列

string s = "hello";

?

sbyte

8 位有符號整型

sbyte val = 12;

-128 到 127

short

16 位有符號整型

short val = 12;

-32,768 到 32,767

int

32 位有符號整型

int val = 12;

-2,147,483,648 到 2,147,483,647

long

64 位有符號整型

long val1 = 12;

long val2 = 34L;

-9,223,372,036,854,775,808 到 9,223,372,036,854,775,807

byte

8 位無符號整型

byte val1 = 12;

0 到 255

ushort

16 位無符號整型

ushort val1 = 12;

0 到 65,535

uint

32 位無符號整型

uint val1 = 12;

uint val2 = 34U;

0 到 4,294,967,295

ulong

64 位無符號整型

ulong val1 = 12;

ulong val2 = 34U;

ulong val3 = 56L;

ulong val4 = 78UL;

0 到 18,446,744,073,709,551,615

float

單精度浮點型

float val = 1.23F;7位

±1.5?×?10?45 到 ±3.4?×?1038

double

雙精度浮點型

double val1 = 1.23;

double val2 = 4.56D;15-16

±5.0?×?10?324 到 ±1.7?×?10308

bool

布爾型;bool 值或為真或為假

bool val1 = true;

bool val2 = false;

?

char

字符類型;char 值是一個 Unicode 字符

char val = 'h';

?

decimal

精確的小數類型,具有 28 個有效數字

decimal val = 1.23M;28-29

±1.0?×?10?28 到 ±7.9?×?1028

DateTime

?

?

?

?

變量轉換

簡單轉換:

float f = 100.1234f;

可以用括號轉換:

short s = (short)f

也可以利用Convert方法來轉換:

string s1;

???? s1=Convert.ToString(a);

MessageBox.Show(s1);

常用Convert方法有:

C#

備注

Convert.ToBoolean

?

Convert.ToByte

?

Convert.ToChar

?

Convert.ToDateTime

?

Convert.ToDecimal

?

Convert.ToDouble

?

Convert.ToInt16

?

Convert.ToInt32

?

Convert.ToInt64

?

Convert.ToSByte

?

Convert.ToSingle

?

Convert.ToString

?

Convert.ToUInt16

?

Convert.ToUInt32

?

Convert.ToUInt64

?

Math類

常用科學計算方法:

C#

備注

Math.Abs

絕對值

Math.Sqrt

開方

Math.Round

取整,四舍五入

Math.Floor

取整,放棄小數

Math.Cos

余弦

Math.Sin

正弦

Math.Tan

正切

Math.Exp

返回e的指定次冪

Math.Log

對數

Math.Pow(x,y)

數字x的y次冪

Math.Max(x,y)

返回較大者

Math.Min(x,y)

返回較小者

?

?

枚舉型

一般為字符串,可以定義帶數字的枚舉型,示例為:

???????? enum Color

???????? {

????????????? Red=1,

????????????? Blue=2,

????????????? Green=3

???????? }

???????? class Shape

???????? {

????????????? public int Fill(Color color)

????????????? {

?????????????????? int ii;

?????????????????? switch(color)

?????????????????? {

?????????????????????? case Color.Red:

??????????????????????????? ii=10;

???????????????????????????????? break;

?????????????????????? case Color.Blue:

??????????????????????????? ii=11;

???????????????????????????????? break;

?????????????????????? case Color.Green:

??????????????????????????? ii=12;

???????????????????????????????? break;

?????????????????????? default:

??????????????????????????? ii=-1;

??????????????????????????? break;

?????????????????? }

?????????????????? return ii;

????????????? }

???????? }

?

???????? private void button1_Click(object sender, System.EventArgs e)

???????? {

????????????? int i;

????????????? Shape s1=new Shape();

????????????? i=s1.Fill((Color)2);??

????????????? //i=s1.Fill(Color.Blue);???

????????????? MessageBox.Show(i.ToString());??

???? }

Enum需要放在class外面,才能被其它class的程序調用。

C#關鍵字

abstract

event

new

struct

as

explicit

null

switch

base

extern

object

this

bool

false

operator

throw

break

finally

out

true

byte

fixed

override

try

case

float

params

typeof

catch

for

private

uint

char

foreach

protected

ulong

checked

goto

public

unchecked

class

if

readonly

unsafe

const

implicit

ref

ushort

continue

in

return

using

decimal

int

sbyte

virtual

default

interface

sealed

volatile

delegate

internal

short

void

do

is

sizeof

while

double

lock

stackalloc

?

else

long

static

?

enum

namespace

string

?

?

數組

定義

數組是一種排列有序的數據結構,包含于數組中的變量被稱為數組的元素,它們都有相同的類型。

數組聲明

int [] array1 = new int[5];

int [,,] array3 = new int[10,20,30];

int [] array1 = new int[] {1,2,4};

數組引用

array1[0]="a1";

注意,如果定義數組為int[5] ,則從0~4。

數組長度

line0.GetLength(1)

數組賦值

可以從一個已經賦值的數組array2向未賦值的同等數組array1賦值,用

array1=array2;

這時,array1就變成和array2一樣的數組了。

集合

集合的使用

集合可以看成是可以隨意添加的數組,因此凡是在使用數組的場合,都可以使用集合。而且集合的元素可以是任意對象,操作也比數組靈活的多。

使用集合時,必須注意集合的生命期問題。如果有兩個集合L1和L2,使用了

L1=L2;

后,只要L2生命期沒有終結,它的以后的變化就可能會影響到L1的數值。因此在賦值后應該及時銷毀或者初始化L2,以免發生不可預見的錯誤。

比較

使用Contains方法。

????? ArrayList Array1=new ArrayList();

????? Array1.Add("as");

????? bool b1=Array1.Contains("as");

????? MessageBox.Show(b1.ToString());??????

找到集合中數量最多的一個元素

利用方法來查找,可以返回兩個變量。

???????? object Jmax0(ArrayList v11,ref int jj)

???????? {

????????????? int i;

????????????? object j0=0;

????????????? ArrayList y11=new ArrayList(); //各個不同的元素的集合

????????????? int [] y12=new int[v11.Count]; //記錄各個元素數量的數組?????????

????????????? int xmax=0; //最大的一個元素的數量

?

????????????? for (i=0;i<v11.Count;i++)

????????????? {

?????????????????? j0=(object)v11[i];

?????????????????? if (y11.Contains(j0))

?????????????????? {

?????????????????????? y12[y11.IndexOf(j0)]++;

?????????????????? }

?????????????????? else

?????????????????? {?????????????????????

?????????????????????? y11.Add(j0);

?????????????????????? y12[y11.Count-1]=1;

?????????????????? }?????????????????

????????????? }

?

????????????? xmax=y12[0];

????????????? j0=(object)y11[0];

????????????? for (i=1;i<y11.Count;i++)

????????????? {

?????????????????? if(y12[i]>xmax)

?????????????????? {

?????????????????????? xmax=y12[i];

?????????????????????? j0=(object)y11[i];

?????????????????? }

????????????? }

????????????? jj=xmax;

????????????? return j0;

???????? }

?

???????? private void button1_Click(object sender, System.EventArgs e)

???????? {

????????????? ArrayList Array1=new ArrayList();

????????????? int jj=0;

????????????? double j0=0;

????????????? object j1=0;

?????????????

????????????? j0=2.3;

????????????? Array1.Add(j0);???

????????????? j0=2.3;

????????????? Array1.Add(j0);???

????????????? j0=1.000f;

????????????? Array1.Add(j0);

????????????? j0=2.3;

????????????? Array1.Add(j0);???

????????????? j0=1;

????????????? Array1.Add(j0);

????????????? j1=Jmax0(Array1,ref jj);

????????????? MessageBox.Show(j1.ToString()+" "+jj.ToString());

???????? }

運算符和判斷

判斷

if (x > 10)

?if (y > 20)

? Console.Write("Statement_1");

?else

? Console.Write("Statement_2");

關系運算符

<,<=,>,>=

等于:==

不等于:!=

判斷字符串string和char用Equals方法。

邏輯運算符

與:a & b

或:a | b

非:! A

模數運算符

模數運算符 (%) 計算第二個操作數除第一個操作數后的余數。所有數值類型都具有預定義的模數運算符。如

Console.WriteLine(5 % 2);?????? // =1

Console.WriteLine(-5 % 2);????? // =-1

Console.WriteLine(5.0 % 2.2);?? // =0.6

Console.WriteLine(-5.2 % 2.0);? // =-1.2

經常用模數運算符來判斷整數為奇數(=1)或偶數(=0)。

循環

無條件循環

int sum,x;

????????????? sum=0;

????????????? for(x=1;x<=100;x++)

????????????? {

?????????????????? sum+=x;

????????????? }

有條件循環

private void button1_Click(object sender, System.EventArgs e)

???????? {

????????????? int sum=0;

????????????? int x=0;

????????????? while ((sum<100) & (x<20))

????????????? {

?????????????????? x++;

?????????????????? sum+=x;

???????? ???? }

????????????? string s2=Convert.ToString(x);

????????????? MessageBox.Show(s2);

???? }

運行顯示14。

如果改為

????????? while ((sum<100) | (x<20))

運行顯示20。

多重選擇

switch (i)

{

case 0:

?CaseZero();

?break;

case 1:

?CaseOne();

?break;

default:

?CaseOthers();

?break;

}

每個case后面,必須有break或者goto,不允許貫穿。

Goto

goto 語句將程序控制直接傳遞給標記語句。

for (int i = 0; i < x; i++)

?? for (int j = 0; j < y; j++)

??? if (myArray[i,j].Equals(myNumber))

???? goto Found;

?

? Console.WriteLine("The number {0} was not found.", myNumber);

? goto Finish;

?

?Found:

? Console.WriteLine("The number {0} is found.", myNumber);

?

?Finish:

? Console.WriteLine("End of search.");

foreach

foreach 語句為對數組或者集合中的每個元素重復執行嵌入語句。對于數組示例為:

using System;

class MainClass

{

?? public static void Main()

?? {

????? int odd = 0, even = 0;

????? int[] arr = new int [] {0,1,2,5,7,8,11};

?

????? foreach (int i in arr)

????? {

???????? if (i%2 == 0)?

??????????? even++;?????

???????? else

??????????? odd++;????????

????? }

?

????? Console.WriteLine("Found {0} Odd Numbers, and {1} Even Numbers.",

????????????????? ??????odd, even) ;

?? }

}

break

退出當前的循環。

也可以退出當前模塊,使用一個空while循環,示例如下:

???????? void CH(double X1)

???????? {

????????????? bool bl=true;

????????????? while (bl)

????????????? {

?????????????????? if (X1==1.0)

?????????????????? {

?????????????????????? MessageBox.Show("YES");

?????????????????????? break;

?????????????????? }

?????????????????? MessageBox.Show("no");

?????????????????? bl=false;

????????????? }

???????? }

?

輸出格式

簡單格式

對于控制臺程序:

Console.WriteLine("Found {0} Odd Numbers, and {1} Even Numbers.",odd, even) ;

對于普通系統:

int x=1,y=2;

string s0;

s0=string.Format("Found {0} Odd Numbers, and {1} Even Numbers.",x, y);

MessageBox.Show(s0);

format

用指定字符和數字說明格式。C(貨幣格式,用NumberFormatInfo指定種類)D(十進制整數)E(科學計數法)F(固定點)G(常規)N(數字)P(百分比)等。

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-us");

double MyDouble = 123456789;

Console.WriteLine(MyDouble.ToString("C1"));

Console.WriteLine(MyDouble.ToString("E"));

Console.WriteLine(MyDouble.ToString("P"));

Console.WriteLine(MyDouble.ToString("N3"));

Console.WriteLine(MyDouble.ToString("F"));

運行顯示:

$123,456,789.0

1.234568E+008

12,345,678,900.00%

123,456,789.000

123456789.00

還可以這樣使用:

String.Format("{0:F2} {1:F2} {2:F2}", x,y,z)

控制臺程序

打開Visual C# .NET 2003,選擇【新建】/【項目】,或者選擇【新建項目】在Visual C#項目中選擇【控制臺應用程序】,選擇程序名稱和位置后,進入程序界面(IDE)。

這時系統生成一個class1.cs的程序文件。修改成以下:

using System;

namespace Console2

{

???? // A "Hello World!" program in C#

???? class Hello

???? {

???????? static void Main()

???????? {

????????????? Console.WriteLine("Hello World!");

???????? }

???? }

}

點擊【調試】/【開始執行(不調試)】,就可以在DOS界面下看見結果。

?


二、使用控件

基本操作

添加控件

選擇程序名稱和位置后,進入程序的一個Form1界面。

從左邊的【工具箱】/【Windows窗體】中,添加一個Label控件和一個Button控件,雙擊Button1,添加程序如下:

private void button1_Click(object sender, System.EventArgs e)

???????? {

????????????? label1.Text="iiii";

???? }

就可以查看運行效果了。

如果修改成

label1.Left=label1.Left+10;

就可以看見點擊Button后,標簽右移的效果。

控件的基本特性

工具箱的控件主要有Button(按鈕)、Label(標簽)、TextBox(文本框)、RadioButton(單選按鈕)、CheckBox(復選框)、ListBox(下拉框)等。

可以雙擊在Form上產生控件,也可以先點擊,然后在Form上畫矩形,決定控件的大小。

控件的基本特性有事件、方法和屬性,詳見2.2。

控件的事件主要有Click(單擊)、DoubleClick(雙擊)、MouseOver(鼠標移過)等。

控件的方法主有Focus(聚焦)、Hide(隱藏)、Show(顯示)等。

控件的主要屬性有:

1.尺寸控制,主要有Width(寬度)、Height(高度)等;

2.位置控制,主要有Left(左邊界)、Top(上邊界)等;

3.顏色和字體控制,主要有BackColor(背景顏色)、ForeColor(前景顏色)、Font(字體)等;

4.名稱控制,主要有Name(控件名字)、Caption(控件標題)等;

5.控件序號,主要有TabIndex(焦點的TAB順序控制)、Index(控件數組序號);

6.其它,主要有Enabled(決定控件是否激活,True或 False)、ToolTipText(鼠標移過時顯示的文字)等。

消息框MessageBox

簡單使用方法

使用消息框,可以在程序運行到這里時彈出一個對話框,顯示指定的文字。是向外輸出信息的重要方式。

MessageBox.Show("def");

通用方法

消息框輸出必須為string類型,如果不是,則需要轉換:

string s1;

???? s1=Convert.ToString(a);

MessageBox.Show(s1);

可以用以下函數簡化使用方法:

private void msgbox(object a) //用消息框顯示任意一個數

???????? {

????????????? string s1;

????????????? s1=Convert.ToString(a);

????????????? MessageBox.Show(s1);

???? }

較多使用方法

MessageBox.Show("name", "Name Entry", MessageBoxButtons.OK, MessageBoxIcon . Exclamation);

其中第二項開始依次為消息框的標題、按鈕樣式、圖標樣式。

MessageBoxButtons的數值為枚舉型,為OK(缺省)、AbortRetryIgnore、OKCancel、RetryCancel、YesNo、YesNoCancel。

獲取返回信息

???????? private void button2_Click(object sender, System.EventArgs e)

???????? {

????????????? DialogResult result;

????????????? result = MessageBox.Show("name", "Name Entry", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

????????????? MessageBox.Show(result.ToString());????????????????????

???? }

如果要參與判斷,則用

string ls=result.ToString();

完全使用方法

本例檢查textBox1中輸入文本沒有,如果沒有就提示,并可以獲取返回信息。

???????? private void button1_Click(object sender, System.EventArgs e)

???????? {

????????????? if(textBox1.Text.Length == 0)

????????????? {

?????????????????? string message = "You did not enter a server name. Cancel this operation?";

?????????????????? string caption = "No Server Name Specified";

?????????????????? MessageBoxButtons buttons = MessageBoxButtons.YesNo;

?????????????????? DialogResult result;

?

?????????????????? result = MessageBox.Show(this, message, caption, buttons,

?????????????????????? MessageBoxIcon.Question, MessageBoxDefaultButton.Button1,

?????????????????????? MessageBoxOptions.RightAlign);

?

?????????????????? if(result == DialogResult.Yes)???????????

?????????????????????? this.Close();

?????????????????? }

????????????? }

???? }???

?

文本框

基本功能

文本框主要是用來輸入和顯示文字的。

添加一個TextBox,系統自己產生名字textBox1,程序如下:

private void button1_Click(object sender, System.EventArgs e)

???????? {

????????????? MessageBox.Show(textBox1.Text);?

???? }

運行時,就可以在消息框中顯示文本框輸入的字符串。

TextBox一般顯示單行,如果把屬性Multiline改為Ture,還可以顯示多行數字。

輸入數字

輸入數字需要轉換:

int a;

????????????? string s1;

????????????? a=Convert.ToInt16(textBox1.Text);

????????????? a=a+5;

????????????? s1=Convert.ToString(a);

????????? MessageBox.Show(s1);??

初始化

文本框的初始化就是向文本框賦初始值。可以從事件過程里寫入,也可以在IDE的右邊屬性欄里輸入,但是推薦采用在Form初始化時寫入。

public Form1()

???? {

???????? InitializeComponent();

???????? // TODO: 在 InitializeComponent 調用后添加任何構造函數代碼

???????? textBox1.Text="";

}

窗體調用

簡單調用

上面的例子都是在一個窗體中,實際程序需要幾十甚至上百個窗體。以下例子創建兩個窗體,然后實現相互調用。

在Form1中添加兩個Button,一個標題為調用,一個標題為退出。

使用【項目】/【添加窗體】,添加一個窗體,缺省名稱為Form2。添加一個Button,標題為返回。

窗體1程序為:

private void button1_Click(object sender, System.EventArgs e)

???????? {

????????????? Form2 Nform2=new Form2();

????????????? Nform2.Show();

????????????? this.Hide();

???????? }

?

???????? private void button2_Click(object sender, System.EventArgs e)

???????? {

????????????? Application.Exit();

???? }

窗體2程序為:

private void button1_Click(object sender, System.EventArgs e)

???????? {

????????????? Form1 Nform1=new Form1();

????????????? Nform1.Show();

????????????? this.Hide();

???? }

運行程序,可以在兩個窗體之間來回調用,按“退出”就可以退出程序。

程序運行時,如果發現窗體位置不固定,這時需要在窗體的StartPosition屬性上設置窗體固定位置,一般為屏幕中央。

注意,兩個窗體要在一個命名空間,否則要引用。

傳遞參數調用

在Form1中添加一個Button1和一個textBox1,程序為:

private Form2 otherForm=new Form2();

???????? private void GetOtherFormTextBox()

???????? {

????????????? textBox1.Text = otherForm.TextBox1.Text;

???????? }

?

???????? private void button1_Click(object sender, System.EventArgs e)

???????? {

????????????? GetOtherFormTextBox();

???? }

在Form2中添加一個textBox1,在

InitializeComponent();

后面添加一個賦值語句為:

???? textBox1.Text="abd";

然后添加一個屬性:

???????? public TextBox TextBox1

???????? {

????????????? get

????????????? {

?????????????????? return textBox1;

????????????? }

???? }

運行時,點擊Form1中的Button1,可以把Form2的TextBox的數值取到Form1的TextBox中來。

復雜傳遞參數

本例是移動一個標簽,在兩個Form之間來回移動。

先設計Form1如下:

設計Form2,除了少了一個退出按鈕外,其余相同。

在Form1的InitializeComponent()下面加上窗體定位語句:

Point tempPoint = new Point(100,100);

????????? this.DesktopLocation = tempPoint;

然后把Form1的StartPosition屬性改為Manual。其余程序為:

?

???????? public Label L2

???????? {

????????????? get

????????????? {

?????????????????? return label1;

????????????? }

????????????? set

????????????? {

?????????????????? label1=value;

????????????? }

???????? }

????????

???????? private void button2_Click(object sender, System.EventArgs e)

???????? {

????????????? Form2 otherForm=new Form2();

????????????? label1.Left=label1.Left+10;

????????????? if (label1.Left>=this.Width-10)

????????????? {

?????????????????? otherForm.Show();

?????????????????? otherForm.L1.Top=label1.Top;

?????????????????? this.Hide();

????????????? }

???????? }

?

???????? private void button1_Click(object sender, System.EventArgs e)

???????? {

????????????? label1.Left=label1.Left-10;

???????? }

?

???????? private void button3_Click(object sender, System.EventArgs e)

???????? {

????????????? label1.Top=label1.Top-10;

???????? }

?

???????? private void button4_Click(object sender, System.EventArgs e)

???????? {

????????????? label1.Top=label1.Top+10;

???????? }

?

???????? private void button5_Click(object sender, System.EventArgs e)

???????? {

????????????? Application.Exit();

???? }

同樣在Form2的InitializeComponent()下面加上窗體定位語句:

Point tempPoint = new Point(300,100);

????????? this.DesktopLocation = tempPoint;

然后把Form2的StartPosition屬性改為Manual。其余程序為:

???????? public Label L1

???????? {

????????????? get

????????????? {

?????????????????? return label1;

????????????? }

????????????? set

????????????? {

?????????????????? label1=value;

????????????? }

???????? }

????????

???????? private void button2_Click(object sender, System.EventArgs e)

???????? {

????????????? label1.Left=label1.Left+10;

???????? }

?

???????? private void button1_Click(object sender, System.EventArgs e)

???????? {

????????????? Form1 otherForm1=new Form1();

????????????? label1.Left=label1.Left-10;

????????????? if (label1.Left<=-10)

????????????? {

?????????????????? otherForm1.Show();

?????????????????? otherForm1.L2.Top=label1.Top;

?????????????????? otherForm1.L2.Left=otherForm1.Width-20;

?????????????????? this.Hide();

????????????? }

???????? }

?

???????? private void button3_Click(object sender, System.EventArgs e)

???????? {

????????????? label1.Top=label1.Top-10;

???????? }

?

???????? private void button4_Click(object sender, System.EventArgs e)

???????? {

????????????? label1.Top=label1.Top+10;

???? }

動態產生窗體

???????? public void CreateMyForm()

???????? {

????????????? Form form1 = new Form();

????????????? Label label1 = new Label();

????????????? Button button1 = new Button ();

????????????? TextBox text1 = new TextBox();

?????????????

????????????? button1.Text = "確定";

????????????? button1.Location = new Point (110, 220);

????????????? label1.Location = new Point (50,100);

????????????? text1.Location = new Point (150,100);

?

????????????? form1.Text = "請輸入";

????????????? label1.Text = "數據";

????????????? form1.FormBorderStyle = FormBorderStyle.FixedDialog;

????????????? form1.ControlBox = false;

????????????? form1.CancelButton = button1;????????????

????????????? form1.StartPosition = FormStartPosition.CenterScreen;

??

????????????? form1.Controls.Add(button1);

????????????? form1.Controls.Add(text1);

????????????? form1.Controls.Add(label1);

??

????????????? form1.ShowDialog();

????????????? ls=text1.Text;

???????? }

????????

???????? private void button2_Click(object sender, System.EventArgs e)

???????? {????????????

???? ???????? CreateMyForm();

????????????? MessageBox.Show(ls);?????????????????????

???? }

ToolBar

普通使用

在窗體上加上ToolBar

?

界面修改后的問題

在界面上修改后,最后要加上:

????????????? toolBar1.Buttons.Add(toolBarButton1);

????????????? toolBar1.Buttons.Add(toolBarButton2);

????????????? toolBar1.Buttons.Add(toolBarButton3);

???

????????????? // Add the event-handler delegate.

????????? toolBar1.ButtonClick += new ToolBarButtonClickEventHandler (this.toolBar1_ButtonClick);

或者把原有的程序

this.toolBar1.Buttons.AddRange(new System.Windows.Forms.ToolBarButton[] {

????????????? this.toolBarButton1,this.toolBarButton2,this.toolBarButton3});

改變位置,到toolBar1設置的最下面。

全部設置程序為:

????????????? this.toolBar1.DropDownArrows = true;

????????????? this.toolBar1.Location = new System.Drawing.Point(0, 0);

????????????? this.toolBar1.Name = "toolBar1";

????????????? this.toolBar1.ShowToolTips = true;

????????????? this.toolBar1.Size = new System.Drawing.Size(592, 42);

????????????? this.toolBar1.TabIndex = 0;

????????????? toolBar1.ButtonSize = new System.Drawing.Size(60, 50);

????????????? //

????????????? // toolBarButton1

????????????? //

????????????? this.toolBarButton1.Text = "Open";

????????????? toolBarButton1.Style = System.Windows.Forms.ToolBarButtonStyle.ToggleButton;

????????????? //

????????????? // toolBarButton2

????????????? //

????????????? this.toolBarButton2.Text = "Save";

????????????? toolBarButton2.Style = System.Windows.Forms.ToolBarButtonStyle.ToggleButton;

????????????? //

????????????? // toolBarButton3

????????????? //

????????????? this.toolBarButton3.Text = "Print";

?

????????????? toolBar1.Buttons.Add(toolBarButton1);

????????????? toolBar1.Buttons.Add(toolBarButton2);

????????? toolBar1.Buttons.Add(toolBarButton3);

????????? toolBar1.ButtonClick += new ToolBarButtonClickEventHandler (this.toolBar1_ButtonClick);

設置按鈕大小

如下設置,可以正常居中顯示9號字體。

toolBar1.ButtonSize = new System.Drawing.Size(60, 50);

用程序實現

可以用程序實現按鈕的增加,但是無法全部實現自動化。

先需要手工添加toolBar1和imageList1,然后把imageList1中的圖片一一加上。

??????? void toolBarSet()

??????? {

??????????? //添加按鈕???????????

??????????? ToolBarButton toolBarButton1=new ToolBarButton();

??????????? ToolBarButton toolBarButton2=new ToolBarButton();??????

??????????? toolBar1.Buttons.AddRange(new System.Windows.Forms.ToolBarButton[] { toolBarButton1,toolBarButton2});

??????????? toolBar1.DropDownArrows = true;

??????????? toolBar1.ImageList = imageList1;???????????

??????????? toolBar1.Size = new System.Drawing.Size(408, 37);

??????????? toolBar1.TabIndex = 0;???????????

??????????? toolBar1.ButtonClick += new System.Windows.Forms.ToolBarButtonClickEventHandler(toolBar1_ButtonClick);

??????????? // toolBarButton1

??????????? toolBarButton1.ImageIndex = 0;

??????????? toolBarButton1.ToolTipText = "放大";

??????????? // toolBarButton2

??????????? toolBarButton2.ImageIndex = 1;

??????????? toolBarButton2.ToolTipText = "縮小";

??????? }

?

??????? private void Form1_Load(object sender, System.EventArgs e)

??????? {

??????????? toolBarSet();

??????? }

?

??????? private void toolBar1_ButtonClick(object sender, System.Windows.Forms.ToolBarButtonClickEventArgs e)

????? ??{

??????????? switch(toolBar1.Buttons.IndexOf(e.Button))

??????????? {

??????????????? case 0:? //放大

??????????????????? MessageBox.Show("放大");???????????????

??????????????????? break;

??????????????? case 1:? //縮小

??????????????????? MessageBox.Show("縮小");?

???? ???????????????break;

???????????????

??????????????? default:

??????????????????? MessageBox.Show("other");

??????????????????? break;

??????????? }????

??????? }

?

listBox

普通調用

在窗體上放置一個listBox1,一個button1和一個label1。以下程序實現添加選項,雙擊選項就可以顯示你的選擇:

??????? private void button1_Click(object sender, System.EventArgs e)

??????? {?

??????????? listBox1.Items.Clear();

??????????? listBox1.Items.Add("");

??????????? listBox1.Items.Add("選擇1");

??????????? listBox1.Items.Add("選擇2");

??????????? listBox1.SelectedIndex=0;

??????? }

?

??????? private void listBox1_DoubleClick(object sender, System.EventArgs e)

??????? {

??????????? Label1.Text=listBox1.SelectedIndex.ToString();

??????? }

第一項是一個缺省空項,允許用戶不選取退出。

Items是一個集合,因此增減選項可以按照集合那樣操作。

用數組添加選項

System.Object[] ItemObject = new System.Object[10];

for (int i = 0; i <= 9; i++)

{

?? ItemObject[i] = "Item" + i;

}

listBox1.Items.AddRange(ItemObject);

?

ScrollBar

基本定義

ScrollBar是滾動條控件,分成HScrollBar(水平)和VScrollBar(垂直)兩種。有些控件如ListBox,TextBox等可以自動添加滾動條,但是有些控件則需要用程序添加。主要屬性意義為:

Value:滾動條的數值,反映當前移動塊的位置。初始值設定后,運行時停留在這個位置。運行時拉動滾動條,由Scroll事件的e.NewValue參數傳遞過來。

Maximum:Value的最大值,一般為100。

Minimum:Value的最小值,即端點的數值。如果Maximum=100,Minimum=0,LargeChange=10,則從第一個端點開始Value=0,到另一個端點的Value=91。

SmallChange:每次點擊移動的數值,一般為1。

LargeChange:移動塊的長度,一般為10。

和PicturBox控件一起使用

??????? float vi; //每個單位的移動距離

??????? float vk=0.8f; //PicturBox顯示高度和實際高度的比例

??????? int t0,ti; //PicturBox顯示Top和Height。

?

??????? private void vScrollBar1_Scroll(object sender,System.Windows.Forms.ScrollEventArgs e)

??????? {???

??????????? this.pictureBox1.Top = t0-Convert.ToInt32(e.NewValue*vi);

??????????? this.pictureBox1.Height = ti+Convert.ToInt32(e.NewValue*vi);

??????? }??

?

??????? private void button1_Click(object sender, System.EventArgs e)

??????? {

??????????? Button?? oButton;??

????? ??????TextBox?? oTextBox;??

??????????? for(int i=1;i<=8;i++)??

??????????? {??

??????????????? oButton = new Button();??

??????????????? oButton.Text = "按鈕"+ i.ToString();??

??????????????? oButton.Location = new System.Drawing.Point(50, i*50);

??????????????? oButton.Click += new System.EventHandler(oButton_Click);

??????????????? this.pictureBox1.Controls.Add(oButton);

??????????????? oTextBox = new TextBox();

??????????????? oButton.Tag = oTextBox;

??????????????? oTextBox.Text = "1000";

??????????????? oTextBox.Location = new System.Drawing.Point(150, i*50);

??????????????? this.pictureBox1.Controls.Add(oTextBox);

??????????? }??

??????? }

?

??????? private void oButton_Click(object sender, System.EventArgs e)??

??????? {

??????????? Button btn = (Button)sender;

??????????? TextBox txt = (TextBox)btn.Tag;

??????????? txt.Text = Convert.ToString(Convert.ToInt32(txt.Text) + 1);

??????? }

?

??????? private void Form1_Load(object sender, System.EventArgs e)

??????? {

??????????? vi=vk*pictureBox1.Height/vScrollBar1.Maximum;

??????????? t0=pictureBox1.Top;

??????????? ti=pictureBox1.Height;

??????? }

?

?

Panel

基本定義

Windows 窗體 Panel(面板)控件用于為其他控件提供可識別的分組。在設計時所有控件均可輕松地移動,當移動 Panel 控件時,它包含的所有控件也將移動。分組在一個面板中的控件可以通過面板的 Controls 屬性進行訪問。

Panel 控件類似于 GroupBox 控件;但只有 Panel 控件可以有滾動條,而且只有 GroupBox 控件顯示標題。

將 AutoScroll 屬性設置為 true,可以自動顯示滾動條。但是這時右邊界和下邊界頂頭,不是太好看。這時需要增加一個不可見的控件或者圖像來調整。

下例在Panel上用程序添加幾個控件,產生滾動效果:

?????? private void button1_Click(object sender, System.EventArgs e)

??????? {

??????????? Button oButton;??

??????????? TextBox oTextBox;??

??????????? for(int i=1;i<=8;i++)??

??????????? {??

??????????????? oButton = new Button();??

??????????????? oButton.Text = "按鈕"+ i.ToString();??

??????????????? oButton.Location = new System.Drawing.Point(50, i*50);

??????????????? oButton.Click += new System.EventHandler(oButton_Click);

??????????????? this.panel1.Controls.Add(oButton);

??????????????? oTextBox = new TextBox();

??????????????? oButton.Tag = oTextBox;

??????????????? oTextBox.Text = "1000";

??????????????? oTextBox.Location = new System.Drawing.Point(150, i*50);

??????????????? this.panel1.Controls.Add(oTextBox);

??????????? }

??????????? //增加一個不可見按鈕,調整右邊界和下邊界的位置

??????????? oButton = new Button();

??????????? oButton.Location = new System.Drawing.Point(260, 440);

??????????? oButton.Height=0;

??????????? oButton.Width=0;

??????????? this.panel1.Controls.Add(oButton);

??????? }

?

??????? private void oButton_Click(object sender, System.EventArgs e)??

??????? {

??????????? Button btn = (Button)sender;

??????????? TextBox txt = (TextBox)btn.Tag;

??????????? txt.Text = Convert.ToString(Convert.ToInt32(txt.Text) + 1);

??????? }?????

在Panel控件上添加圖像

在Panel控件上不能直接添加圖像。需要在Panel控件上添加一個picturBox,然后把其SizeMode設置為AutoSize(隨著圖像大小調整控件大小)就可以實現圖像的隨意滾動察看。

在Panel控件上畫圖

Panel控件上也可以畫圖。但是滾動時遮蓋的圖像就消失了。這時候需要在Panel控件上添加一個picturBox,然后在picturBox上畫圖,然后用一個LocationChanged事件,每次滾動時重畫一遍即可:

??????? Pen pen1=new Pen(Color.Green,2);

??????? Graphics g1;

??????? void drawLine()

??????? {

??????????? PointF p1=new PointF(0,0);

??????????? PointF p2=new PointF(100,100);

??????????? g1.DrawLine(pen1,p1,p2);

??????? }

?

??????? private void button2_Click(object sender, System.EventArgs e)

??????? {

???? ???????g1=this.pictureBox1.CreateGraphics();

??????????? drawLine();

??????? }

?

??????? private void pictureBox1_LocationChanged(object sender, System.EventArgs e)

??????? {

??????????? drawLine();

??????? }

?

菜單

普通應用

手工添加即可。可以直接在其上寫各個菜單項的名字,雙擊可以添加程序,使用非常方便。

特殊功能

1.在設計時向菜單項添加選中標記

對于在“菜單設計器”內選定的菜單項(三級菜單以下),單擊該菜單項左側的區域,選中標記√。或者在“屬性”窗口中將 Checked 屬性設置為 True。

以編程方式向菜單項添加選中標記

myMnuItem.Checked = true;

2.在設計時向菜單項添加快捷鍵

在“菜單設計器”內選擇菜單項。在“屬性”窗口中,將 Shortcut 屬性設置為下拉列表中提供的值之一。

以編程方式向菜單項添加快捷鍵

myMnuItem.Shortcut = System.Windows.Forms.Shortcut.F6;

3.向菜單項添加訪問鍵

如鍵入“文件(&F)”,顯示“文件(F)”。

若要定位到此菜單項,請按 ALT 鍵,將焦點移動到菜單欄,然后按該菜單名稱的訪問鍵。當菜單打開并顯示帶訪問鍵的項時,只需按該訪問鍵就可選定該菜單項。或者直接按ALT+主菜單的訪問鍵。

4.將分隔線作為菜單項添加

在菜單設計器中,右擊需要有分隔線的位置,然后選擇“插入分隔符”。或者在設置菜單項的 Text 屬性(在“屬性”窗口中、菜單設計器中或代碼中)時,輸入短劃線 (–) 使該菜單項成為分隔線。

其它控件

單選按鈕

單選按鈕是布置一組按鈕,只能選擇一組控件。

本例放置3個單選按鈕,Text屬性分別寫上“已婚”、“未婚”和“離異”,然后添加一個Label控件和一個Button控件,程序如下:

public Form1()

???? {

???????? InitializeComponent();

???? label1.Text="請選擇";

……

private void button1_Click(object sender, System.EventArgs e)

???????? {

????????????? if (radioButton1.Checked == true)

?????????????????? label1.Text=radioButton1.Text;

????????????? else if (radioButton2.Checked == true)

?????????????????? label1.Text=radioButton2.Text;

????????????? else

?????????????????? label1.Text=radioButton3.Text;

???? }

}

?

復選框

可以選擇多個的一組控件。

本例放置2個復選按鈕,Text屬性分別寫上“加粗”和“斜體”,然后添加一個Label控件和一個Button控件,程序如下:

private void button1_Click(object sender, System.EventArgs e)

???????? {

????????????? if (checkBox1.Checked == true)

????????????? {

?????????????????? if (checkBox2.Checked == true)

?????????????????????? label1.Text=checkBox1.Text+checkBox2.Text;

?????????????????? else if (checkBox2.Checked == false)

?????????????????????? label1.Text=checkBox1.Text;

????????????? }

????????????? else

?????????????????? if (checkBox2.Checked == true)

?????????????????? label1.Text=checkBox2.Text;

????????????? else if (checkBox2.Checked == false)

?????????????????? label1.Text="";

???? }

?

程序產生checkBox

??????? CheckBox checkBox1=new CheckBox();

?

??????? void checkSet()

??????? {

??????????? this.Controls.Add(checkBox1);

??????????? checkBox1.Location = new System.Drawing.Point(50, 64);

??????????? checkBox1.Name = "checkBox1";

??????????? checkBox1.TabIndex = 2;

??????????? checkBox1.Text = "圖層1";

??????????? checkBox1.CheckedChanged += new System.EventHandler(checkBox1_CheckedChanged);

??????? }

?

??????? private void button1_Click(object sender, System.EventArgs e)

??????? {?????????

??????????? checkSet();

??????? }

???????

??????? private void checkBox1_CheckedChanged(object sender, System.EventArgs e)

??????? {

??????????? if (checkBox1.Checked)

??????????????? MessageBox.Show("yes");

??????????? else

??????????????? MessageBox.Show("no");???????

??????? }

如果要實現標題在左邊,用

??????????????????? check1.Width=90;

??????????????????? check1.CheckAlign=ContentAlignment.MiddleRight;

要在其它控件顯示:

check3.BringToFront();

?

動態產生控件

以下程序動態動態產生一組Button和TextBox控件,以及點擊Button的事件。

??????? private void button2_Click(object sender, System.EventArgs e)

??????? {

????????? ??Button?? oButton;??

??????????? TextBox?? oTextBox;??

??????????? for(int i=1;i<=5;i++)??

??????????? {??

??????????????? oButton = new Button();??

??????????????? oButton.Text = "按鈕"+ i.ToString();??

??????????????? oButton.Location = new System.Drawing.Point(50, i*50);

??????????????? oButton.Click += new System.EventHandler(oButton_Click);

??????????????? this.Controls.Add(oButton);

??????????????? oTextBox = new TextBox();

??????????????? oButton.Tag = oTextBox;

??????????????? oTextBox.Text = "1000";

??????????????? oTextBox.Location = new System.Drawing.Point(150, i*50);

??????????????? this.Controls.Add(oTextBox);

??????????? }??

??????? }

?

??????? private void oButton_Click(object sender, System.EventArgs e)??

??????? {

??????????? Button btn = (Button)sender;

??????????? TextBox txt = (TextBox)btn.Tag;

??????????? txt.Text = Convert.ToString(Convert.ToInt32(txt.Text) + 1);

??????? }

?

Splitter

Windows 窗體 splitter 控件用于在運行時調整停靠控件的大小。Splitter 控件常用于一類窗體,這類窗體上的控件所顯示的數據長度可變,如 Windows 資源管理器,它的數據窗格所包含的信息在不同的時間有不同的寬度。

如果一個控件可由 splitter 控件調整其大小,則當用戶將鼠標指針指向該控件的未停靠的邊緣時,鼠標指針將更改外觀,指示該控件的大小是可以調整的。拆分控件允許用戶調整該控件緊前面的停靠控件的大小。因此,為使用戶能夠在運行時調整停靠控件的大小,請將要調整大小的控件停靠在容器的一條邊緣上,然后將拆分控件停靠在該容器的同一側。

以下例子自動產生幾個控件,可以在運行中調整大小。

??????? private void CreateMySplitControls()

? ??????{

??????????? TreeView treeView1 = new TreeView();

??????????? ListView listView1 = new ListView();

??????????? Splitter splitter1 = new Splitter();

????????

??????????? treeView1.Dock = DockStyle.Left;

??????????? splitter1.Dock = DockStyle.Left;

??????????? splitter1.MinExtra = 100;

??????????? splitter1.MinSize = 75;

??????????? listView1.Dock = DockStyle.Fill;

??????????? treeView1.Nodes.Add("TreeView Node");

??????????? listView1.Items.Add("ListView Item");

??????????? this.Controls.AddRange(new Control[]{listView1, splitter1, treeView1});

??????? }

?

??????? private void button1_Click(object sender, System.EventArgs e)

??????? {

??????????? CreateMySplitControls();

??????? }

tabControl

Windows 窗體 TabControl 顯示多個選項卡。使用時,先添加一個TabControl控件,把它拉的足夠大。

然后在屬性中添加按鈕。每個按鈕可以控制TabControl的其余頁面,作為一個容器,可以添加其它空間。運行時只要點擊按鈕,就可以切換選項卡,實現不同的功能。

StatusBar

可以向statusBar添加面板(窗格),以分類顯示信息:

??????? public void CreateStatusBarPanels()

??????? {

??????????? statusBar1.Panels.Add("");

??????????? statusBar1.Panels.Add("Two");

? ??????????statusBar1.Panels.Add("Three");

??????????? statusBar1.Panels[0].Width=200;

??????????? statusBar1.Panels[0].Text="One";

??????????? statusBar1.ShowPanels = true;

??????? }

?


三、字符和字符串

字符串的操作在程序設計中非常有用,因此單獨寫成一章。

Char

基本定義

char 關鍵字用于聲明一個字符。

char 類型的常數可以寫成字符、十六進制換碼序列或 Unicode 表示形式。您也可以顯式轉換整數字符代碼。以下所有語句均聲明了一個 char 變量并用字符 X 將其初始化:

char MyChar = 'X';??????? // Character literal

char MyChar = '\x0058';?? // Hexadecimal

char MyChar = (char)88;?? // Cast from integral type

char MyChar = '\u0058';?? // Unicode

char 類型可隱式轉換為 ushortintuintlongulongfloatdoubledecimal 類型。但是,不存在從其他類型到 char 類型的隱式轉換。

ToCharArray

將字符串的部分字符復制到 Unicode 字符數組。示例

string str = "012wxyz789";

char[] arr;

arr = str.ToCharArray(3, 4);

顯示:wxyz

計算字符串寬度

由于英文和中文的顯示長度不一樣,所以一些場合要區分。

要引用

using System.Globalization;

程序為:

??????? //計算一個字符的字符類型,=0漢字,=1英文

??????? private int getCharType(char ch)

??????? {

??????????? int i0;???????????

??????????? UnicodeCategory ca1=new UnicodeCategory();

??????????? ca1=System.Char.GetUnicodeCategory(ch);??? ?????????

??????????? switch (ca1)

??????????? {

??????????????? case UnicodeCategory.OtherPunctuation:

??????????????????? i0=0; //漢字

??????????????????? break;

??????????????? case UnicodeCategory.OtherLetter:

??????????????????? i0=0; //漢字

??????????? ????????break;

??????????????? case UnicodeCategory.FinalQuotePunctuation:

??????????????????? i0=0; //漢字

??????????????????? break;?????????????

??????????????? default:???????????????????

??????????????????? i0=1; //英文

??????????????????? break;

????? ??????}

??????????? return i0;

??????? }

?

??????? //計算字符串(ss,包含中文)的實際寬度(返回)、起點(x0)和高度(height)

??????? //輸入字號sz,只對于Pixel單位

??????? public float StringWidth(string ss,float sz,ref float x0,ref float height)

??????? {

??????????? char ch1;

??????????? int i,i0=0;

??????????? float width=0;

??????????? float k1=1.02f; //漢字系數

??????????? float k2=0.55f; //英文系數

??????????? float k3=0.15f; //x0系數

??????????? float k4=1.10f; //高度系數

??????????? int i1=0; //漢字個數

??????????? int i2=0; //英文個數

?

??????????? height=k4*sz;

??????????? x0=sz*k3;???????????

??????????? for(i=0;i<ss.Length;i++)

??????????? {

??????????????? ch1=(char)ss[i];

??????????????? i0=getCharType(ch1);

??????????????? if(i0==0)

??????????????????? i1++;

??????????????? else

??????????????????? i2++;

??????????? }

??????????? width=x0+i1*k1*sz+i2*k2*sz;

??????????? return width;

??????? }

?

??????? //返回一個point單位的字體的寬度

??????? public float PStringWidth(string ss,float sz,ref float x0,ref float height)

??????? {

??????????? float width=0;

??????????? sz=sz*20/15;

??????????? width=StringWidth(ss,sz,ref x0,ref height);

??????????? return width;

??????? }

這個方法在sz(字體大小)5~30內比較準確。很大時有誤差。

計算字符串中心

??????? //根據給定點,找到實際標注點,使得以畫出的字符串以給定點為中心

??????? PointF StringCenter(string s1,int sz,PointF p0)

??????? {

??????????? PointF p1=new PointF();

??????????? float x0=0;

??????????? float height=0;

??????????? float width=StringWidth(s1,sz,ref x0,ref height);

??????????? p1.X=p0.X-+x0-width/2;

??????????? p1.Y=p0.Y-height/2;

??????????? return p1;

??????? }

計算字符串尺寸示例1—畫方框

以下示例利用以上方法,把字符串的長度和高度畫成一個方框。

?????? private void button2_Click(object sender, System.EventArgs e)

?????? {

??? ????????Graphics g= this.CreateGraphics();

??????????? SolidBrush myBrush=new SolidBrush(Color.Red);

??????????? float x0=0;

??????????? float height=0;

??????????? int sz=10;

??????????? float px=0,py=50;

??????????? PointF p0=new PointF(px,py);

???????? ???string s1="我們還34fd還是和平使者";

??????????? Font myFont1 = new Font("宋體",sz,FontStyle.Bold,GraphicsUnit.Pixel);

??????????? float width=StringWidth(s1,sz,ref x0,ref height);???????????

??????????? g.DrawString(s1, myFont1, myBrush, p0);

??????????? PointF p1=new PointF(px+x0,py);

??????????? PointF p2=new PointF(px+x0+width,py);

??????????? PointF p3=new PointF(px+x0+width,py+height);

??????????? PointF p4=new PointF(px+x0,py+height);

??????????? PointF[] cur ={p1,p2,p3,p4};

??????????? Pen pen1=new Pen(Color.Blue,2);

?? ?????????g.DrawPolygon(pen1,cur);

?????? }

計算字符串尺寸示例2—找中點

?????? private void button1_Click(object sender, System.EventArgs e)

?????? {

??????????? Graphics g= this.CreateGraphics();

??????????? SolidBrush myBrush=new SolidBrush(Color.Red);

??????????? PointF ps=new PointF();

??????????? int sz=10;????????? ??

??????????? PointF p0=new PointF(300,100);

??????????? string s1="我們還34fd還是和平使者";

??????????? Font myFont1 = new Font("宋體",sz,FontStyle.Bold,GraphicsUnit.Pixel);

??????????? ps=StringCenter(s1,sz,p0);

??????????? g.DrawString(s1, myFont1, myBrush, ps);

??????????? //以下畫十字線表示中心位置

??????????? PointF p1=new PointF(0,p0.Y);

??????????? PointF p2=new PointF(600,p0.Y);

??????????? PointF p3=new PointF(p0.X,0);

??????????? PointF p4=new PointF(p0.X,300);

??????????? Pen pen1=new Pen(Color.Blue,1);

??????????? g.DrawLine(pen1,p1,p2);

??????????? g.DrawLine(pen1,p3,p4);

?????? }

?

分行操作

回車符和換行符

“\r\n”

顯示換行的語句為:

textBox1.Text="ok\r\n";

???? textBox1.Text+="ok1";

字符串分行

string myString1 = "This is the first line of my string.\n" +

???? ?"This is the second line of my string.\n" +

???? ?"This is the third line of the string.\n";

string myString2 = @"This is the first line of my string.

This is the second line of my string.

This is the third line of the string.";

字符串操作

字符串表示

用@后邊的字符串不被處理。

A1=@"c:\Docs\Source\a.txt";

string s1=@"c=""a.txt"; //顯示:c=”a.txt

string s1=@"c=""a.txt"""; //顯示:c=”a.txt”

If (s1 == @"""") Then? //s1=""

?

求字符串長度

string s1="fdkls我們";

???????? string s2=Convert.ToString(s1.Length);

???? MessageBox.Show(s2);

運行顯示為7,所有字符個數。

裁剪字符串

String s = "123abc456";

Console.WriteLine(s.Remove(3, 3));

打印“123456”。

Split方法

標識此實例中的子字符串(它們由數組中指定的一個或多個字符進行分隔),然后將這些子字符串放入一個 String 數組中。

簡單的例子

可以按照“,”分開,也可以去除空格。

???????? private void button1_Click(object sender, System.EventArgs e)

???????? {????????????

????????????? string astring="123,456 78,789";

????????????? string [] split;

????????????? Char [] chr=new Char [] {',',' '};

????????????? split = astring.Split(chr);

????????????? MessageBox.Show("/"+split[0]+"/");

???? }

這時可以分成123,456,78,789四個字符串。

注意,前后空白也可以看成是一個字符串,要消除,用

astring=astring.Trim();

就可以了。

復雜的例子

當存在兩個空格時,就出現找出空字符串的錯誤。用以下方法可以去掉空的字符串:

???????? string [] Split0(string [] sp)

???????? {

????????????? string [] sp1=new string [sp.Length];

????????????? int i=0,j=0;

????????????? foreach (string s1 in sp)

????????????? {

?????????????????? if (s1!="")

?????????????????? {?????????????????????

?????????????????????? sp1[i]=s1;

?????????????????????? i=i+1;

?????????????????? }

????????????? }????????????

????????????? string [] sp2=new string [i];

????????????? for (j=0;j<i;j++)?

?????????????????? sp2[j]=sp1[j];?????????????

????????????? return sp2;

???????? }

?

???????? private void button1_Click(object sender, System.EventArgs e)

???????? {????????????

????????????? string astring=" 123,456?? 78,789? ";

????????????? string [] split;

????????????? Char [] chr=new Char [] {',',' '};

????????????? split = astring.Split(chr);

????????????? split =Split0(split);

????????????? MessageBox.Show("/"+split[0]+"/");

???? }

?


五、文件操作

文件操作

刪除

以下均為在控制臺應用程序中使用的程序。開始要進行以下三個引用:

using System;

using System.IO;

using System.Text;

程序如下:

class Test

{

???? public static void Main()

???? {

???????? string path = @"d:\chen\MyTest.txt";

???????? if (File.Exists(path))

???????? {

????????????? File.Delete(path);

???? }

???? }

}

如果采用相對路徑,用

string sfile = Directory.GetCurrentDirectory() + @"\F8.txt";

對于在一個.net項目中,默認的路徑是在\bin\debug中,如果要放在項目文件目錄中,用

string sfile = Directory.GetCurrentDirectory() + @"\..\..\F8.txt";

生成新文件

可以用:

File.Create(path);

或者

FileStream fs = File.Create(path);

復制

File.Copy(path,path1,true);

如果最后用false,則第二個文件有時,發生錯誤。

讀寫文本文件

using System;

using System.IO;

?

private void button1_Click(object sender, System.EventArgs e)

???????? {

????????????? string s1 = @"D:\chen\mytest.txt";

????????????? string s2 = @"D:\chen\mytest1.txt";

????????????? String input;

?

????????????? if (!File.Exists(s1))

????????????? {

?????????????????? MessageBox.Show("File does not exist.");

?????????????????? return;

????????????? }

?

????????????? StreamReader sr = File.OpenText(s1);

????????????? StreamWriter wr = new StreamWriter(s2);

?

????????????? while ((input=sr.ReadLine())!=null)

????????????? {

?????????????????? wr.WriteLine(input);

????????????? }

????????????? MessageBox.Show("The end.");

????????????? sr.Close();

????????????? wr.Close();

???????? }

讀寫中文

????????????? string s1 = @"d:\chen\a1.txt";???????????

????????????? StreamReader sr = new StreamReader(s1,Encoding.GetEncoding("gb2312"));

????????????? string rl;

????????????? while((rl=sr.ReadLine())!=null)

????????????? {

?????????????????? MessageBox.Show(rl);

????????????? }

????????? sr.Close();

?

文件操作控件

打開文件

用openFileDialog控件。

???????? private void button1_Click(object sender, System.EventArgs e)

???????? {??

??????????? OpenFileDialog openFileDialog1 = new OpenFileDialog();

??????????? openFileDialog1.InitialDirectory=Directory.GetCurrentDirectory();

??????????? openFileDialog1.Filter = "Cursor Files|*.cur";

??????????? openFileDialog1.Title = "Select a Cursor File";??????

??????????

??????????? if(openFileDialog1.ShowDialog() == DialogResult.OK)

??????????? {

??????????????? System.IO.StreamReader sr = new

??????????????????? System.IO.StreamReader(openFileDialog1.FileName);

??????????????? MessageBox.Show(sr.ReadToEnd());

??????????????? sr.Close();

??????????? }??????????

???? }

選擇文件夾

在工具箱上選擇folderBrowserDialog:

??????????? folderBrowserDialog1.ShowDialog();??????????

??????????? string s1 = folderBrowserDialog1.SelectedPath.ToString()+@"\mytest.txt";

??????? StreamWriter wr = new StreamWriter(s1);

?

?

?


六、繪圖

基本繪圖

畫直線

在Button1中加入以下程序:

System.Drawing.Pen myPen;

???? myPen = new System.Drawing.Pen(System.Drawing.Color.Red);

???? System.Drawing.Graphics formGraphics = this.CreateGraphics();

???? formGraphics.DrawLine(myPen, 0, 0, 200, 200);

???? myPen.Dispose();

formGraphics.Dispose();

就可以在Form1上面畫一條線了。用

???? myPen = new System.Drawing.Pen(System.Drawing.Color.Red,3);

可以改變線的寬度。

最簡單的畫線程序

??????????? Pen pen1=new Pen(Color.Green,2);

??????????? Graphics g1=this.CreateGraphics();

??????????? PointF p1=new PointF(0,0);

??????????? PointF p2=new PointF(100,100);

??????????? g1.DrawLine(pen1,p1,p2);

??????????? pen1.Dispose();

??????????? g1.Dispose();

最后兩句可以不寫,程序關閉時自動完成。

畫橢圓

???? System.Drawing.Pen myPen;

???? myPen = new System.Drawing.Pen(System.Drawing.Color.Red);

???? System.Drawing.Graphics formGraphics = this.CreateGraphics();

???? formGraphics.DrawEllipse(myPen, new Rectangle(0,0,200,300));

???? myPen.Dispose();

formGraphics.Dispose();

以下畫一個橢圓并填充。

System.Drawing.SolidBrush myBrush = new System.Drawing.SolidBrush(System.Drawing.Color.Red);

System.Drawing.Graphics formGraphics = this.CreateGraphics();

formGraphics.FillEllipse(myBrush, new Rectangle(0,0,200,300));

myBrush.Dispose();

formGraphics.Dispose();

以橢圓的中心點畫圖

??????? //以給定點找畫橢圓的原始點,使得橢圓的中心點是給定點

??????? PointF EllipseCenter(int xs,int ys,PointF p0)

??????? {

??????????? float ek=0.5f;???????????

??????????? PointF p1=new PointF();

??????????? p1.X=p0.X-xs*ek;

??????????? p1.Y=p0.Y-ys*ek;

??????????? return p1;

??????? }

?

?????? private void button1_Click(object sender, System.EventArgs e)

?????? {

??????????? Graphics g= this.CreateGraphics();

??????????? Pen pen1=new Pen(Color.Yellow,1);

??????????? Pen pen2=new Pen(Color.Red,1);

???????? ???PointF ps=new PointF();

??????????? int xs=1,ys=1;? //半軸?????

??????????? PointF p0=new PointF(300,100);???????????

??????????? ps=EllipseCenter(xs,ys,p0);

???????????

??????????? //以下畫十字線表示中心位置

??????????? PointF p1=new PointF(0,p0.Y);

??????????? PointF p2=new PointF(600,p0.Y);

??????????? PointF p3=new PointF(p0.X,0);

??????????? PointF p4=new PointF(p0.X,300);???????????

??????????? g.DrawLine(pen1,p1,p2);

??????????? g.DrawLine(pen1,p3,p4);

??????????? g.DrawEllipse(pen2,ps.X,ps.Y,xs,ys);

?????? }

?

點弧線

???? System.Drawing.Pen myPen;

???? myPen = new System.Drawing.Pen(System.Drawing.Color.Red);

???? System.Drawing.Graphics formGraphics = this.CreateGraphics();

???? formGraphics.DrawArc(myPen, 100, 50, 140, 70, 30, 180);

???? myPen.Dispose();

???? formGraphics.Dispose();

多點直線

System.Drawing.Pen myPen;

????????????? myPen = new System.Drawing.Pen(System.Drawing.Color.Red);

????????????? System.Drawing.Graphics formGraphics = this.CreateGraphics();

?

????????????? PointF point1 = new PointF( 50.0F,? 50.0F);

????????????? PointF point2 = new PointF(100.0F,? 25.0F);

????????????? PointF point3 = new PointF(200.0F, 5.0F);

????????????? PointF point4 = new PointF(250.0F,? 50.0F);

????????????? PointF point5 = new PointF(300.0F, 100.0F);

????????????? PointF point6 = new PointF(350.0F, 200.0F);

????????????? PointF point7 = new PointF(250.0F, 250.0F);

????????????? PointF[] curvePoints =

????????????? {

?????????????????? point1,

?????????????????? point2,

?????????????????? point3,

?????????????????? point4,

?????????????????? point5,

?????????????????? point6,

?????????????????? point7

????????????? };

?

????????????? formGraphics.DrawLines(myPen, curvePoints);

????????????? myPen.Dispose();

????????? formGraphics.Dispose();

也可以用以下方式給數組賦值:

PointF[] pt=new PointF[]{new PointF(2,2),new PointF(25,150),new PointF(100,100)};

多點弧線

數據同上,修改如下:

int offset = 1; //開始點(從0開始)

????????????? int numSegments = 5; //包含后續點數

????????????? float tension = 1.0F;

????????? formGraphics.DrawCurve(myPen, curvePoints, offset, numSegments, tension);

以下程序可以畫一個封閉曲線:

private void button1_Click(object sender, System.EventArgs e)

???????? {

????????????? System.Drawing.Pen myPen;

????????????? myPen = new System.Drawing.Pen(System.Drawing.Color.Red);

????????????? System.Drawing.Graphics formGraphics = this.CreateGraphics();

????????????? PointF point1 = new PointF( 50.0F,? 50.0F);

????????????? PointF point2 = new PointF(100.0F,? 25.0F);

????????????? PointF point3 = new PointF(200.0F, 5.0F);

????????????? PointF point4 = new PointF(250.0F,? 50.0F);

????????????? PointF point5 = new PointF(300.0F, 100.0F);

????????????? PointF point6 = new PointF(350.0F, 200.0F);

????????????? PointF point7 = new PointF(250.0F, 250.0F);

????????????? PointF point8 = new PointF(40.0F, 150.0F);

????????????? PointF[] curvePoints =

????????????? {

?????????????????? point1,

?????????????????? point2,

?????????????????? point3,

?????????????????? point4,

?????????????????? point5,

?????????????????? point6,

?????????????????? point7,

?????????????????? point8,

?????????????????? point1

????????????? };

????????????? int offset = 0;

????????????? int numSegments = 8;

????????????? float tension = 1.0F;

????????????? formGraphics.DrawCurve(myPen, curvePoints, offset, numSegments, tension);

//??????????? formGraphics.DrawLines(myPen, curvePoints);

????????????? myPen.Dispose();

????????????? formGraphics.Dispose();

???? }

如果是任意3點(或多點),在起始點不容易圓滑。可以用以下方法畫封閉曲線:

PointF[] curvePoints =

????????????? {

?????????????????? point3,

?????????????????? point1,

?????????????????? point2,

?????????????????? point3,

?????????????????? point1

????????????? };

????????????? int offset = 1;

????????????? int numSegments = 3;

????????? float tension = 0.5F;

這樣可以保證第一個點處比較圓滑。

參數設置

設置線段寬度:

myPen.Width =3;

在pictrueBox上面畫線,修改this:

System.Drawing.Graphics formGraphics = picBox1.CreateGraphics();

填充

????????????? System.Drawing.SolidBrush myBrush = new ystem.Drawing.SolidBrush(System.Drawing.Color.LightPink);

????????????? System.Drawing.Pen myPen;

????????????? myPen = new System.Drawing.Pen(System.Drawing.Color.Red,1);

????????????? System.Drawing.Graphics formGraphics = pictureBox1.CreateGraphics();

????????????? PointF point1 = new PointF( 50.0F,? 50.0F);

????????????? PointF point2 = new PointF(100.0F,? 25.0F);

????????????? PointF point3 = new PointF(200.0F, 5.0F);

????????????? PointF point4 = new PointF(250.0F,? 50.0F);

????????????? PointF point5 = new PointF(300.0F, 100.0F);

????????????? PointF point6 = new PointF(350.0F, 200.0F);

????????????? PointF point7 = new PointF(250.0F, 250.0F);

????????????? PointF[] curvePoints =

????????????? {

?????????????????? point1,

?????????????????? point2,

?????????????????? point3,

?????????????????? point4,

?????????????????? point5,

????????????? ???? point6,

?????????????????? point7

????????????? };

????????????? formGraphics.FillPolygon(myBrush,curvePoints);

????????????? formGraphics.DrawPolygon(myPen,curvePoints);

????????????? myPen.Dispose();

????????????? myBrush.Dispose();

????????? formGraphics.Dispose();

顏色

顏色基本設置

普通顏色設置可以直接選取系統定義的顏色。高級設置采用RGB顏色。

Color myColor;

myColor = Color.FromArgb(23,56,78);

每個數字均必須是從 0 到 255 之間的一個整數,分別表示紅、綠、藍三種原色。其中 0 表示沒有該顏色,而 255 則為所指定顏色的完整飽和度。如Color.FromArgb(0,255,0)表示綠色,Color.FromArgb(255,255,0)表示黃色,Color.FromArgb(0,0,0) 呈現為黑色,而 Color.FromArgb(255,255,255) 呈現為白色。

還可以設置透明度,如

Color myColor;

myColor = Color.FromArgb(127, 23, 56, 78);

127表示50%的透明度,255表示完全不透明。

選擇顏色

以下程序可以從調色板選擇一個顏色,在textBox上面顯示。

??????? private void button1_Click(object sender, System.EventArgs e)

??????? {

??????????? ColorDialog MyDialog = new ColorDialog();

??????????? MyDialog.AllowFullOpen = false ;

??????????? MyDialog.ShowHelp = true ;

??????????? MyDialog.Color = textBox1.ForeColor ;

???

??????????? if (MyDialog.ShowDialog() == DialogResult.OK)

??????????????? textBox1.ForeColor =? MyDialog.Color;

???? }

產生窗體選擇顏色

本程序在一個菜單里調用選擇程序,產生一個動態的窗體,選擇顏色后返回主程序,刷新原來的頁面。

由于沒有掌握控制動態控件集合的方法,只好用枚舉的方法定義動態控件,對于多于10個的顏色序列,需要修改程序。

??????? Form form1;

??????? bool Cform=true;

??????? //顏色設置

??????? private void menuItem31_Click(object sender, System.EventArgs e)

??????? {

??????????? while (Cform)

??????????? {

??????????????? CreateColorForm();

??????????????? Tuli1();

??????????????? DisLine();

??????????? }

??????????? Cform=true;

??????? }

?

??????? //產生顏色輸入窗體

??????? private void CreateColorForm()

??????? {

??????????? int i;????????????

??????????? form1=new Form();

????????????????????

??????????? Button [] ColorButton? = new Button [myPloys.marks1.Count];

??????????? Label [] ColorLabel? = new Label [myPloys.marks1.Count];

??????????? Button button0 = new Button ();

??????????????????? ?

??????????? form1.Width=130;

??????????? form1.Height=130+myPloys.marks1.Count*30;

??????????? form1.Text = "等值線顏色輸入";????????

??????????? form1.FormBorderStyle = FormBorderStyle.FixedDialog;

??????????? form1.ControlBox = false;

??????????? form1.StartPosition = FormStartPosition.CenterScreen;

?????????????????????

??????????? button0.Text = "退出";

??????????? button0.Width=80;

??????????? button0.Location=new Point(25,50+myPloys.marks1.Count*30);

??????????? form1.Controls.Add(button0);

??????????? form1.CancelButton = button0; ?

?

??????????? for (i=0;i<myPloys.marks1.Count;i++)??

??????????? {??????????????

?????? ?????????ColorLabel[i]=new Label();???????????????

??????????????? ColorLabel[i].Location=(Point)new Point(30,30+30*i);

??????????????? ColorLabel[i].Width=30;

??????????????? ColorLabel[i].Text=myPloys.marks1[i].ToString();

??????????????? form1.Controls.Add(ColorLabel[i]);

?

??????????????? ColorButton[i]=new Button();

??????????????? ColorButton[i].BackColor=cColor[i];

??????????????? ColorButton[i].Location=(Point)new Point(60,26+30*i);

??????????????? ColorButton[i].Width=30;

??????????????? switch (i)

??????????????? {

??????????????????? case 0:

??????????????????????? ColorButton[i].Click += new System.EventHandler(ColorButton0_Click);

??????????????????????? break;

??????????????????? case 1:

??????????????????????? ColorButton[i].Click += new System.EventHandler(ColorButton1_Click);

??????????????????????? break;

??????????????????? case 2:

??????????????????????? ColorButton[i].Click += new System.EventHandler(ColorButton2_Click);

??????????????????????? break;

??????????????????? case 3:

??????? ????????????????ColorButton[i].Click += new System.EventHandler(ColorButton3_Click);

??????????????????????? break;

??????????????????? case 4:

??????????????????????? ColorButton[i].Click += new System.EventHandler(ColorButton4_Click);

?????????????????? ?????break;

??????????????????? case 5:

??????????????????????? ColorButton[i].Click += new System.EventHandler(ColorButton5_Click);

??????????????????????? break;

??????????????????? case 6:

??????????????????????? ColorButton[i].Click += new System.EventHandler(ColorButton6_Click);

??????????????????????? break;

??????????????????? case 7:

??????????????????????? ColorButton[i].Click += new System.EventHandler(ColorButton7_Click);

??????????????????????? break;

??????????????????? case 8:

??????????????? ????????ColorButton[i].Click += new System.EventHandler(ColorButton8_Click);

??????????????????????? break;

??????????????????? case 9:

??????????????????????? ColorButton[i].Click += new System.EventHandler(ColorButton9_Click);

??????????????????????? break;

??????????????????? case 10:

??????????????????????? ColorButton[i].Click += new System.EventHandler(ColorButton10_Click);

??????????????????????? break;

??????????????????? default:???????????????????????

??????????????????????? break;

????????????? ??}???????????????

??????????????? form1.Controls.Add(ColorButton[i]);

??????????? }??????????

???? ??????? button0.Click += new System.EventHandler(button0_Click);

??????????? form1.ShowDialog();?

??????? }

?

??????? private void ColorSelect(int si)

?????? ?{

??????????? ColorDialog MyDialog = new ColorDialog();

??????????? MyDialog.AllowFullOpen = true ;

??????????? MyDialog.ShowHelp = true ;?????

??????????? MyDialog.Color = cColor[si] ;???

??????????? if (MyDialog.ShowDialog() == DialogResult.OK)

????? ??????????cColor[si] =? MyDialog.Color;

??????????? form1.Dispose();

??????? }

????????

??????? private void ColorButton0_Click(object sender, System.EventArgs e)

??????? {? ColorSelect(0);? }

??????? private void ColorButton1_Click(object sender, System.EventArgs e)

??????? {? ColorSelect(1);? }

??????? private void ColorButton2_Click(object sender, System.EventArgs e)

??????? {? ColorSelect(2);? }

??????? private void ColorButton3_Click(object sender, System.EventArgs e)

??????? {? ColorSelect(3);? }

??????? private void ColorButton4_Click(object sender, System.EventArgs e)

??????? {? ColorSelect(4);? }

??????? private void ColorButton5_Click(object sender, System.EventArgs e)

??????? {? ColorSelect(5);? }

??????? private void ColorButton6_Click(object sender, System.EventArgs e)

??????? {? ColorSelect(6);? }

??????? private void ColorButton7_Click(object sender, System.EventArgs e)

??????? {? ColorSelect(7);? }

??????? private void ColorButton8_Click(object sender, System.EventArgs e)

??????? {? ColorSelect(8); ?}

??????? private void ColorButton9_Click(object sender, System.EventArgs e)

??????? {? ColorSelect(9);? }

??????? private void ColorButton10_Click(object sender, System.EventArgs e)

??????? {? ColorSelect(10);? }

???????

??????? private void button0_Click(object sender, System.EventArgs e)

??????? {

??????????? Cform=false;

??????????? form1.Dispose();??????????

??????? }

?

?

Font和標注

基本操作

可以在指定的點開始寫字,也可以在一個范圍(如矩形)內寫字。

???????? Font myFont = new Font("Times New Roman", 14);

???????? Graphics g = this.CreateGraphics();

???????? Pen myPen=new Pen(Color.Black);

???????? System.Drawing.SolidBrush myBrush=new SolidBrush(Color.Red);

???? ????g.DrawRectangle(myPen,10, 10, 100, 200);

???????? g.DrawString("Look at this text!", myFont, myBrush, new RectangleF(10, 10, 100, 200));

???????? g.DrawString("Look at this text!", myFont, myBrush, 10, 250);

畫點和標注

???? System.Drawing.Pen myPen;

???? myPen = new System.Drawing.Pen(System.Drawing.Color.Red,1);

???? System.Drawing.Graphics formGraphics = this.CreateGraphics();

???? System.Drawing.SolidBrush drawBrush = new ???? System.Drawing.SolidBrush(System.Drawing.Color.Black);

???? System.Drawing.Font drawFont = new System.Drawing.Font("Arial", 8);

???? string drawString = "201";

???? float x = 100.0f;

???? float y = 100.0f;

???? formGraphics.DrawEllipse(myPen, x, y,4,4);???????????????????????????

???? formGraphics.DrawString(drawString, drawFont, drawBrush, x, y);???????????

?

???? myPen.Dispose();

???? drawFont.Dispose();

???? drawBrush.Dispose();

formGraphics.Dispose();

?

Font定義

public Font(

?? FontFamily family,

?? float emSize,

?? FontStyle style,

?? GraphicsUnit unit

);

以下的例子可以改變字體,大小、字形、單位,還可以設置成垂直。

// ???Font myFont = new Font("Times New Roman",14,FontStyle.Italic,GraphicsUnit.Millimeter);

??????????? Font myFont = new Font("隸書",34,FontStyle.Underline,GraphicsUnit.Pixel);???

??????????? Graphics g = this.CreateGraphics();

??????????? System.Drawing.SolidBrush myBrush=new SolidBrush(Color.Red);

??????????? System.Drawing.StringFormat drawFormat = new System.Drawing.StringFormat (StringFormatFlags.DirectionVertical);

??????????? g.DrawString("Hello!你好", myFont, myBrush, 10, 10,drawFormat);

根據給定點找到實際標注點

??????? //根據給定點,找到實際標注點,使得以畫出的字符串以給定點為中心

??????? public PointF StringCenter(string s1,float sz,PointF p0)

??????? {

??????????? PointF p1=new PointF();

??????????? float x0=0;

??????????? float height=0;

??????????? float width=StringWidth(s1,sz,ref x0,ref height);

??????????? p1.X=p0.X-+x0-width/2;

??????????? p1.Y=p0.Y-height/2;

??????????? return p1;

??????? }

?

pictureBox

用pictureBox畫圖

和在form上面畫圖類似,只是把this替換成pictureBox1:

????????????? System.Drawing.Pen myPen;

????????????? myPen = new System.Drawing.Pen(System.Drawing.Color.Red,1);

????????????? System.Drawing.Graphics formGraphics = pictureBox1.CreateGraphics();

????????????? System.Drawing.SolidBrush drawBrush = new

????????????? System.Drawing.SolidBrush(System.Drawing.Color.Black);

????????????? System.Drawing.Font drawFont = new System.Drawing.Font("Arial", 8);

????????????? string drawString = "201";

????????????? float x = 200.0f;

????????????? float y = 100.0f;

????????????? formGraphics.DrawEllipse(myPen, x, y,4,4);???????????????????????????

????????????? formGraphics.DrawString(drawString, drawFont, drawBrush, x, y);???????????

?

????????????? myPen.Dispose();

????????????? drawFont.Dispose();

????????????? drawBrush.Dispose();

????????? formGraphics.Dispose();

用pictureBox顯示一個圖片

有固定模式和縮放模式,通過設置SizeMode實現。程序如下:

????????????? pictureBox1.SizeMode = PictureBoxSizeMode.StretchImage; //按圖像文件大小縮放

//??????????? pictureBox1.Image = Image.FromFile ("abc.bmp");? //文件放在\bin\Debug文件夾

????????? pictureBox1.Image = Image.FromFile (@"..\..\abc1.bmp");? //文件放在程序文件夾

Region

基本概念

指示由矩形和由路徑構成的圖形形狀的內部。

基本操作

???????? System.Drawing.Graphics e = this.CreateGraphics();

???????? Rectangle regionRect = new Rectangle(20, 20, 100, 100);

???????? e.DrawRectangle(Pens.Black, regionRect);??????????

???????? RectangleF complementRect = new RectangleF(90, 30, 100, 100);

???????? e.DrawRectangle(Pens.Red,Rectangle.Round(complementRect));

????

???????? Region myRegion = new Region(regionRect);?????????

???????? myRegion.Intersect(complementRect);

????????

???????? SolidBrush myBrush = new SolidBrush(Color.Blue);

???? e.FillRegion(myBrush, myRegion);

主要圖形操作還有Union和Xor。

Polygon的鏤空

采用異或(Xor)運算。需要把polygon轉換成路徑:

??????????? Graphics g1 = this.CreateGraphics();

??????????? GraphicsPath myPath1=new GraphicsPath();

??????????? PointF[] pts=new PointF[]{new PointF(2,20),new PointF(250,0)

????????????? ,new PointF(100,100),new PointF(90,150),new PointF(10,70)};

??????????? myPath1.AddPolygon(pts);

??????????? g1.DrawPath(Pens.Black,myPath1);

?

??????????? GraphicsPath myPath2=new GraphicsPath();

??????????? PointF[] pts1=new PointF[]{new PointF(20,30),new PointF(50,70)

????????????? ,new PointF(100,40)};

??????? ????myPath2.AddPolygon(pts1);

??????????? g1.DrawPath(Pens.Black,myPath2);

??????????

??????????? Region myRegion = new Region(myPath1);

??????????? myRegion.Xor(myPath2);????

??????????? SolidBrush myBrush = new SolidBrush(Color.Blue);

??????????? g1.FillRegion(myBrush, myRegion);

?

如果要鏤空多個空洞,需要把這些空洞都加入到myPath2中,其余操作同樣。

采用交、并和異或運算,都可以把兩個對象互換。

顯示數據

???????? public void DisplayRegionData(Graphics e, int len,RegionData dat)

???????? {

????????????? int i;

????????????? float x = 20, y = 140;

????????????? Font myFont = new Font("Arial", 8);

????????????? SolidBrush myBrush = new SolidBrush(Color.Black);

????????????? e.DrawString("myRegionData = ",myFont,??? myBrush,new PointF(x, y));

????????????? y = 160;

????????????? for(i = 0; i < len; i++)

????????????? {

?????????????????? if(x > 300)

?????????????????? {

?????????????????????? y += 20;

?????????????????????? x = 20;

?????????????????? }

?????????????????? e.DrawString(dat.Data[i].ToString(),myFont,??? myBrush,new PointF(x, y));

?????????????????? x += 30;

????????????? }

???? }

?

路徑

基本應用

用GraphicsPath可以把各種繪圖元素(包括文字)包含進來,最后用DrawPath畫出來。

需要:using System.Drawing.Drawing2D;

???????? private void button2_Click(object sender, System.EventArgs e)

???????? {

????????????? Pen myPen = new Pen(System.Drawing.Color.Red,1);

????????????? System.Drawing.Graphics formGraphics = this.CreateGraphics();

????????????? GraphicsPath myPath1=new GraphicsPath();

?????????????

??????????? myPath1.AddLine(0, 0, 10, 20);

??????????? myPath1.AddEllipse(20,20,10,10);

??????????? myPath1.AddLine(40, 40, 50, 120);

?

??? ????????formGraphics.DrawPath(myPen, myPath1);

??????????? myPath1.Dispose();

????????????? myPen.Dispose();

????????????? formGraphics.Dispose();

???? }

不連續線條

用一個半徑為0的點加在中間:

??????????? myPath1.AddLine(0, 0, 10, 20);

??????????? myPath1.AddEllipse(20,20,0,0);

??????????? myPath1.AddLine(40, 40, 50, 120);

也可以用兩個path,然后用

path2.AddPath(path3,false);

復雜應用

路徑可以包含其它路徑,匯總成一個大的圖形。

還可以通過矩陣變換進行縮放、平移和旋轉。

簡單Matrix變換

可以通過矩陣變換進行圖形的變換。

???????? private void button1_Click(object sender, System.EventArgs e)

???????? {???????????

??????????? System.Drawing.Graphics e1 = this.CreateGraphics();

??????????? Pen myPen = new Pen(Color.Blue, 1);

??????????? Pen myPen2 = new Pen(Color.Red, 1);

?

??????????? Matrix myMatrix1 = new Matrix(1.0f, 0.0f, 0.0f, 3.0f, 0.0f, 0.0f);? // x和y方向都放大3倍

//??????????? Matrix myMatrix1 = new Matrix(1.0f, 0.0f, 0.0f, 1.0f, 50.0f, 50.0f);? // 平移50,50

??????????? e1.DrawRectangle(myPen, 0, 0, 100, 100);

??????????? e1.Transform = myMatrix1;

??????????? e1.DrawRectangle(myPen2, 0, 0, 100, 100);

?

??????????? myPen.Dispose();

??????????? e1.Dispose();????

???? }

復雜Matrix變換

下例顯示縮放、旋轉和移動變換。

??????? public void MultiplyExample(PaintEventArgs e)

??????? {

??????????? Pen myPen = new Pen(Color.Blue, 2);

??????????? Pen myPen2 = new Pen(Color.Red, 1);

??????????? Matrix myMatrix1 = new Matrix(3.0f, 0.0f, 0.0f, 3.0f, 0.0f, 0.0f);? // Scale

??????????? Matrix myMatrix2 = new Matrix(0.0f, 1.0f, -1.0f, 0.0f, 0.0f, 0.0f); // Rotate 90,

??????????? Matrix myMatrix3 = new Matrix(1.0f, 0.0f, 0.0f, 1.0f, 250.0f, 50.0f);? // Translate

?

??????????? ListMatrixElements(e, myMatrix1, "Beginning Matrix", 6, 40);

??????????? myMatrix1.Multiply(myMatrix2, MatrixOrder.Append);

??????????? ListMatrixElements(e,myMatrix1,"Matrix After 1st Multiplication",6,60);

??????????? myMatrix1.Multiply(myMatrix3, MatrixOrder.Append);

??????????? ListMatrixElements(e, myMatrix1,"Matrix After 2nd Multiplication",6,80);

?

??????????? e.Graphics.DrawRectangle(myPen, 0, 0, 100, 100);

??????????? e.Graphics.Transform = myMatrix1;

??????????? e.Graphics.DrawRectangle(myPen2, 0, 0, 100, 100);

? ??????}

?

??????? public void ListMatrixElements(PaintEventArgs e,Matrix matrix,string matrixName,

??????????? int numElements,int y)

??????? {?????????

??????????? int i;

??????????? float x = 20, X = 200;

??????????? Font myFont = new Font("Arial", 8);

??????????? SolidBrush myBrush = new SolidBrush(Color.Black);

??????????? e.Graphics.DrawString(matrixName + ":? ", myFont,myBrush,x,y);

??????????? for(i=0; i<numElements; i++)

??????????? {

??????????????? e.Graphics.DrawString(matrix.Elements[i].ToString() + ", ",myFont,myBrush,X,y);

??????????????? X += 30;

??????????? }

????? }

解決放大線條變寬問題

放大后的線條全部變寬,無法應用于GIS變換。對于多個線條組成的圖形需要縮放和平移時,可以重新生成一個點集(其中自己加上縮放和平移計算)來做。

從路徑轉換到點集用PathPoints屬性。

?

Image

簡單保存

可以利用Image類的Save方法保存目前顯示的文件。需要在Form中定義:

???? public class Form1 : System.Windows.Forms.Form

???? {

???????? private System.Windows.Forms.Button button1;

???????? private System.Windows.Forms.Button button2;

???????? private System.Windows.Forms.PictureBox pictureBox1;

???? private Image cuurimage;

然后在程序中引用即可。

????????????? cuurimage=pictureBox1.Image;

????????? cuurimage.Save("abc2.bmp");

利用動態Image畫圖

?

????????????? PointF p1 = new PointF();

????????????? PointF p2 = new PointF();

?????????????

????????????? Pen myPen = new Pen(Color.Black,1);???????????

????????????? cuurimage = Image.FromFile("abc.bmp");

????????????? Graphics g = Graphics.FromImage(cuurimage);

????????????? Color [] c ={Color.LightPink,Color.Red,Color.Blue,Color.Brown,Color.Black};???

????????????? for(k=0;k<=LineColor.Count-1;k++)

????????????? {

?????????????????? myPen.Color = c[(int)LineColor[k]];???????????????

?????????????????? p1=(PointF)LineArray[i];

?????????????????? i++;

?????????????????? p2=(PointF)LineArray[i];

?????????????????? i++;

?????????????????? g.DrawLine(myPen,p1,p2);

????????????? }

?

????????????? myPen.Dispose();

????????????? g = CreateGraphics();

????????????? g.DrawImage(cuurimage,50,0,cuurimage.Width+100,cuurimage.Height+10);

????????? g.Dispose();

畫圖保存

在一個pictureBox上保存所畫圖像。

先需要加載一個背景圖片,把圖畫在這個圖片上,最后保存到另外一個文件中。

???? private Image cuurimage;

???????? private void button2_Click(object sender, System.EventArgs e)

???????? {

????????????? Pen myPen = new Pen(System.Drawing.Color.Red,2);

??????????? pictureBox1.Image = Image.FromFile (@"..\..\abc1.bmp");

??????????? cuurimage = pictureBox1.Image;

??????????? Graphics g = Graphics.FromImage(cuurimage);?????????

????????????? g.DrawEllipse(myPen, 100, 100,44,14);?????????

??????????? cuurimage.Save("abc0.bmp");

????????????? myPen.Dispose();???????????

????????????? g.Dispose();

???? }

利用Image擦除圖像

下例要先準備一個jpg圖像文件。

先把jpg文件放在pictureBox的Graphics類g1上,然后在其上畫圖,保存在一個image類的變量中。需要擦除的圖形畫在另外一個Graphics類g2上,然后在g1上用DrawImage方法,就可以把g2上的圖形全部擦除。

注意,中間不能有任何Refresh方法。擦除時才能使用一次Refresh方法。

??????? Image imgBack;

??????? System.Drawing.Graphics g1,g2;

??????? Pen Pen1;

?????? //新圖形

??????? private void button1_Click(object sender, System.EventArgs e)

??????? {

??????????? g2 = pictureBox1.CreateGraphics();

??????????? Pen1=new Pen(Color.Red,2);??

??????????? g2.DrawLine(Pen1,10,10,200,200);

//??????????? pictureBox1.Refresh();

??????? }

??????? //原始圖形

??????? private void button2_Click(object sender, System.EventArgs e)

??????? {?????? ?????

??????????? pictureBox1.Image = Image.FromFile (@"s4.jpg");

??????????? imgBack=pictureBox1.Image;

??????????? g1 = Graphics.FromImage(pictureBox1.Image);

??????????? Pen1=new Pen(Color.Blue,2);??

??????????? g1.DrawLine(Pen1,10,100,200,20);

//? ??????????pictureBox1.Refresh();

??????? }

??????? //擦除

??????? private void button3_Click(object sender, System.EventArgs e)

??????? {

??????????? g1.DrawImage(imgBack,0,0);

??????????? pictureBox1.Refresh();

??????? }

?

圖形其它

找到一個點

以下程序可以找到一個存在的點,并在鼠標移動時改變光標和提示。點擊顯示其它信息。

??????? PointF Pt1=new PointF();

??????? PointF Pt2=new PointF();

??????? System.Drawing.Graphics g;

??????? int kk1=0; //判斷是否重畫,=1為已經重畫

??????? int kk2=0; //判斷在距離內,=1為在距離內

??????? double jl0=5; //距離

????????

??????? private static float Distance(PointF p1,PointF p2)

??????? {

??????????? return (float)Math.Sqrt((p1.X-p2.X)*(p1.X-p2.X)+(p1.Y-p2.Y)*(p1.Y-p2.Y));

??????? }????

?

??????? private void Form1_Closed(object sender, System.EventArgs e)

??????? {

??????????? g.Dispose();

??????? }

?

??????? private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

??????? {?????????????

??????????? if (kk2==1)

??????????????? MessageBox.Show("xianshi");???

??????? }

?

??????? private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)

??????? {

??????????? double jl1;

??????????? Pt2.X=e.X;

??????????? Pt2.Y=e.Y;??????????

??????????? jl1=Distance(Pt1,Pt2);

??????????? if (jl1<jl0)

??????????? {

??????????????? this.Cursor=Cursors.Hand;

??????????????? label1.Show();

??????????????? label1.Left=(int)Pt1.X-6;

??????????????? label1.Top=(int)Pt1.Y-20;

??????????????? label1.Text="x="+Pt1.X.ToString()+" y="+Pt1.Y.ToString();

??????????????? label1.Width=label1.Text.Length*7;

??????????????? label1.Height=15;

??????????????? kk2=1; //找到圖像

??????????????? kk1=0; //沒有顯示圖像

??????????? }

??????????? else

??????????? {

??????????????? if (kk1==0)

??????????????? {

??????????????????? this.Cursor=Cursors.Arrow;

??????????????????? kk2=0;

??????????????????? label1.Hide();

??????????????????? g.FillEllipse(new SolidBrush(Color.Black),Pt1.X,Pt1.Y,5,5); //重新顯示

??????????????????? kk1=1;

??????????????? }

??????????? }

??????? }

????????

??????? private void button2_Click(object sender, System.EventArgs e)

??????? {

??????????? Pt1.X=100;

??????????? Pt1.Y=100;??????????????

??????????? g.FillEllipse(new SolidBrush(Color.Black),Pt1.X,Pt1.Y,5,5);?????????????????

??????? }

?

??????? private void Form1_Load(object sender, System.EventArgs e)

??????? {

??????????? g = this.CreateGraphics();???

??????????? label1.Hide();

??????? }

?

?

拖動一個點

可以實現發現點時改變鼠標光標和顯示坐標提示,拖動鼠標完成點的移動。

在form上放置一個button1和label1,程序如下:

???????? PointF Pt1=new PointF();

???????? PointF Pt2=new PointF();

???????? System.Drawing.Graphics g;

???????? int kk1=0; //判斷是否拖動,=1為拖動

???????? int kk2=0; //判斷在距離內,=1為在距離內

???????? double jl0=5; //距離

????????

???????? private static float Distance(PointF p1,PointF p2)

???????? {

????????????? return (float)Math.Sqrt((p1.X-p2.X)*(p1.X-p2.X)+(p1.Y-p2.Y)*(p1.Y-p2.Y));

???????? }???????

?

???????? private void Form1_Closed(object sender, System.EventArgs e)

???????? {

????????????? g.Dispose();

???????? }

?

???????? private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)

???????? {

????????????? if (kk1==1 & kk2==1)

????????????? {

?????????????????? Pt2.X=e.X;

?????????????????? Pt2.Y=e.Y;???

?????????????????? g.FillEllipse(new SolidBrush(this.BackColor),Pt1.X,Pt1.Y,5,5);?? //刪除原來的點

?????????????????? g.FillEllipse(new SolidBrush(Color.Black),Pt2.X,Pt2.Y,5,5);? ??? //畫新的點

?????????????????? Pt1=Pt2;

?????????????????? this.Cursor=Cursors.Arrow;

?????????????????? kk1=0;

?????????????????? kk2=0;

?????????????????? label1.Hide();

????????????? }

????????????? this.Cursor=Cursors.Arrow;

???????? }

?

???????? private void Form1_Load(object sender, System.EventArgs e)

???????? {

????????????? g = this.CreateGraphics();?

????????????? label1.Hide();

???????? }

?

???????? private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

???????? {?????????????????

????????????? if (kk2==1)

?????????????????? kk1=1;??

????????????? else

?????????????????? kk1=0;????????????????

???????? }

?

???????? private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)

???????? {

????????????? double jl1;

????????????? Pt2.X=e.X;

????????????? Pt2.Y=e.Y;????????????

????????????? jl1=Distance(Pt1,Pt2);

????????????? if (jl1<jl0)

????????????? {

?????????????????? this.Cursor=Cursors.Hand;

?????????????????? label1.Show();

?????????????????? label1.Left=(int)Pt2.X-6;

?????????????????? label1.Top=(int)Pt2.Y-20;

?????????????????? label1.Text="x="+Pt1.X.ToString()+" y="+Pt1.Y.ToString();

?????????????????? kk2=1;

????????????? }

????????????? else if (kk1==0)

????????????? {

?????????????????? this.Cursor=Cursors.Arrow;

?????????????????? kk2=0;

?????????????????? label1.Hide();

????????????? }

???????? }

????????

???????? private void button1_Click(object sender, System.EventArgs e)

???????? {

????????????? Pt1.X=100;

????????????? Pt1.Y=100;?????????????????

????????????? g.FillEllipse(new SolidBrush(Color.Black),Pt1.X,Pt1.Y,5,5);???????????????

???? }

拖動一個方框

??????? PointF p1=new PointF();

??????? PointF p2=new PointF();

??????? System.Drawing.Pen myPen;

??????? System.Drawing.Pen myPen1;

??????? System.Drawing.Pen myPen2;

??????? System.Drawing.Graphics g1;

??????? int dl;

?

??????? private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

??????? {

??????????? p1.X=e.X;

??????????? p1.Y=e.Y;

??????????? dl=1;

??????? }

?

??????? private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)

??????? {

??????????? p2.X=e.X;

??????????? p2.Y=e.Y;

??????????? g1.DrawRectangle(myPen,p1.X,p1.Y,p2.X-p1.X,p2.Y-p1.Y);

??????????? dl=0;

??????? }

?

??????? private void Form1_Load(object sender, System.EventArgs e)

??????? {

??????????? myPen = new System.Drawing.Pen(System.Drawing.Color.Red,2);

??????????? myPen1 = new System.Drawing.Pen(System.Drawing.Color.Yellow,1);

??????????? myPen2 = new System.Drawing.Pen(this.BackColor,1);

??????????? g1 = this.CreateGraphics();

??????????? dl=0;

??????? }

?

??????? private void Form1_Closed(object sender, System.EventArgs e)

??????? {

??????????? myPen.Dispose();

??????????? myPen1.Dispose();

??????????? myPen2.Dispose();

??????????? g1.Dispose();

??????? }

?

??????? private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)

??????? {

??????????? if (dl==1)

??????????? {

??????????????? g1.DrawRectangle(myPen2,p1.X,p1.Y,p2.X-p1.X,p2.Y-p1.Y);

??????????????? p2.X=e.X;

??????????????? p2.Y=e.Y;

??????????????? g1.DrawRectangle(myPen1,p1.X,p1.Y,p2.X-p1.X,p2.Y-p1.Y);

??????????? }

????? }

動態畫方框

??????? PointF p1=new PointF();

??????? PointF p2=new PointF();

??????? System.Drawing.Pen myPen;

??????? System.Drawing.Pen myPen1;

??????? System.Drawing.Pen myPen2;

??????? System.Drawing.Graphics g1;??????

??????? int dl;

?

??????? private void Form1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

??????? {

??????????? p1.X=e.X;

??????????? p1.Y=e.Y;

??????????? dl=1;

??????? }

?

??????? private void Form1_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)

??????? {

??????????? p2.X=e.X;

??????????? p2.Y=e.Y;

??????????? g1.DrawRectangle(myPen,p1.X,p1.Y,p2.X-p1.X,p2.Y-p1.Y);

??????????? dl=0;

??????? }

?

??????? private void Form1_Load(object sender, System.EventArgs e)

??????? {

??????????? myPen = new System.Drawing.Pen(System.Drawing.Color.Red,2);

??????????? myPen1 = new System.Drawing.Pen(System.Drawing.Color.Yellow,1);

??????????? myPen2 = new System.Drawing.Pen(this.BackColor,1);

??????????? g1 = this.CreateGraphics();

??????????? dl=0;

??????? }

?

??????? private void Form1_Closed(object sender, System.EventArgs e)

??????? {

??????????? myPen.Dispose();

??????????? myPen1.Dispose();

??????????? myPen2.Dispose();

??????????? g1.Dispose();

??????? }

?

??????? private void Form1_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)

??????? {

??????????? if (dl==1)

??????????? {

??????????????? g1.DrawRectangle(myPen2,p1.X,p1.Y,p2.X-p1.X,p2.Y-p1.Y);

??????????????? p2.X=e.X;

??????????????? p2.Y=e.Y;

??????????????? g1.DrawRectangle(myPen1,p1.X,p1.Y,p2.X-p1.X,p2.Y-p1.Y);

??????????? }

???? }

?

讀取等值線文件畫圖

在Form1上放置控件Button1,picBox1(PictureBox),Form1.cs程序如下:

static void Main()

???????? {

????????????? Application.Run(new Form1());

???????? }

????????

???????? public string ss1;

?

???????? //找到第一個字符串,直到空格或者行尾

???????? ?string Qu1()

???????? {

????????????? int i=0;

???????? ???? bool cbl=true;

????????????? int ls=ss1.Length;

????????????? while((i<ls)&(cbl))

????????????? {

?????????????????? char c1=ss1[i];

?????????????????? string s1=Convert.ToString(c1);

?????????????????? if (s1.Equals(" "))

?????????????????????? cbl=false;

?????????????????? i++;

????????????? }

????????????? string s2=ss1.Remove(i,ls-i);

????????????? ss1=ss1.Remove(0,i-1);

//??????????? MessageBox.Show("ss1="+ss1);

????????????? return s2;

???????? }

?

???????? private void button1_Click(object sender, System.EventArgs e)

???????? {

????????????? string sfile = @"D:\chen\f8.txt";

????????????? String s0,s1;

????????????? int i,j,k;

????????????? float x1,y1;

????????????? bool Bl=true;

????????????? PointF [,] pta = new PointF[200,2000];

?

????????????? if (!File.Exists(sfile))

????????????? {

?????????????????? MessageBox.Show("File does not exist.");

?????????????????? return;

????????????? }

?

????????????? //畫線設置

????????????? System.Drawing.Pen myPen;

????????????? float k1=0.08F;

????????????? float k2=0.08F;

????????????? float x0=0;

????????????? float y0=0;

????????????? myPen = new System.Drawing.Pen(System.Drawing.Color.Red);

????????????? myPen.Width =1;

????????????? System.Drawing.Graphics formGraphics = picBox1.CreateGraphics();

?

????????????? StreamReader sr = File.OpenText(sfile);

????????????? s0=sr.ReadLine();

????????????? s0=sr.ReadLine();

????????????? s0=sr.ReadLine();

?

????????????? //讀取數值文件

????????????? k=0;

????????????? s0=sr.ReadLine();

????????????? ss1=s0.Trim();

????????????? while (s0!=null)

????????????? {

?????????????????? i=0;

?????????????????? while (Bl)

?????????????????? {?????????????????????

?????????????????????? s1=Qu1();

?????????????????????? x1=Convert.ToSingle(s1);

?????????????????????? ss1=ss1.Trim();

?????????????????????? s1=Qu1();

?????????????????????? y1=Convert.ToSingle(s1);

?????????????????????? pta[k,i] = new PointF( x0+x1*k1, y0+y1*k2);

?????????????????????? i++;

?????????????????????? s0=sr.ReadLine();

?????????????????????? ss1=s0.Trim();

?????????????????????? if (ss1.Equals("-1"))

??????????????????????????? Bl=false;

?????????????????? }

?????????????????? Bl=true;

?????????????????? PointF[] cPoints=new PointF[i+1];

?????????????????? for (j=0;j<i;j++)

?????????????????? {

?????????????????????? cPoints[j]=pta[k,j];

?????????????????? }

?????????????????? cPoints[i]=pta[k,0];??

?????????????????? k++;

?????????????????? //畫線

?????????????????? formGraphics.DrawLines(myPen, cPoints);

?????????????????? s0=sr.ReadLine();

?????????????????? if(s0!=null)

?????????????????????? ss1=s0.Trim();

????????????? }

????????????? myPen.Dispose();

????????????? formGraphics.Dispose();

????????????? sr.Close();

???? }

f8.txt格式:

0.00??? 0.00?? 8895.00?? 8895.00

25 28 29 29.5 30.5 31 32 35

5644.20 4625.40?? 32.00

? 5633.50 4641.57?? 32.00

? 5628.85 4655.05?? 32.00

? 5633.50 4681.35?? 32.00

? 5634.67 4684.70?? 32.00

? 5663.15 4703.27?? 32.00

? 5692.80 4700.70?? 32.00

? 5714.98 4684.70?? 32.00

? 5722.45 4668.68?? 32.00

? 5726.26 4655.05?? 32.00

? 5722.45 4640.66?? 32.00

? 5714.23 4625.40?? 32.00

? 5692.80 4612.07?? 32.00

? 5663.15 4613.03?? 32.00

? 5644.20 4625.40?? 32.00

? 5644.20 4625.40?? 32.00

-1

2463.28 8895.00?? 25.00

? 2487.03 8865.35?? 25.00

? 2490.60 8860.86?? 25.00

……

?


十、其它常用方法

時間處理

間隔計算

DateTime oldDate = new DateTime(2002,7,15);

DateTime newDate = DateTime.Now;

?

// Difference in days, hours, and minutes.

TimeSpan ts = newDate - oldDate;

// Difference in days.

int differenceInDays = ts.Days;

Console.WriteLine("Difference in days: {0} ", differenceInDays);

注意,TimeSpan是系統基礎類。

利用時間判斷

??????? public? static bool JM(DateTime T0,int ii)

??????? {

??????????? bool Bl=false;

??????????? DateTime T1 = DateTime.Now;???????????

??????????? TimeSpan ts = T1-T0;

??????????? if (ts.Days>ii)

??????????????? Bl=true;

??????????? return Bl;

???? }

?

???????? DateTime oldDate = new DateTime(2007,1,29); //起始時間

???????? if(Common1.JM(oldDate,100)) //有效期100天

???????? {

????????????? MessageBox.Show("試用版到期,請和北京派得偉業公司聯系,電話010-51503625");

????????????? Application.Exit();

???? }

Timer類

以下程序在每隔2秒顯示一個MessageBox提示。其中TimerEventProcessor方法在timer開始后就自動運行。

??? ????static System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();

??????? static int alarmCounter = 1;

??????? static bool exitFlag = false;

?

??????? private static void TimerEventProcessor(Object myObject,EventArgs myEventArgs)

??????? {

?????? ?????myTimer.Stop();

??????????? if(MessageBox.Show("繼續?","計數:"+alarmCounter,MessageBoxButtons.YesNo)==DialogResult.Yes)

??????????? {

??????????????? alarmCounter +=1;

??????????????? myTimer.Enabled = true;

??????????? }

??????????? else

????????????? ??exitFlag = true;

??????? }

??????

??????? private void button1_Click(object sender, System.EventArgs e)

??????? {

??????????? myTimer.Tick += new EventHandler(TimerEventProcessor);

??????????? myTimer.Interval = 2000;

??????????? myTimer.Start();

???? ???????while(exitFlag == false)

??????????? {

??????????????? // Processes all the events in the queue.

??????????????? Application.DoEvents();

??????????? }

??????? }

延時程序

以下為延時程序,單位為毫秒。由于ts.Milliseconds數值在大于1000時出錯,所以要轉換成ts.Seconds。

??????? public void TimeDelay(int it)

??????? {

??????????? bool Bl=true;

??????????? DateTime T1,T0;

??????????? TimeSpan ts;

??????????? int it0;

?

??????????? T0 = DateTime.Now;?????????

??????????? while(Bl)

??????????? {

??????????????? T1 = DateTime.Now;??

??????????? ????ts=T1-T0;

??????????????? if (it>1000)

??????????????? {

??????????????????? it0=Convert.ToInt32(it/1000);

??????????????????? if (ts.Seconds>it0)

??????????????????????? Bl=false;

??????????????? }

??????????????? else

??????????????????? if (ts.Milliseconds>it)

??????????????????????? Bl=false;

??????????????? Application.DoEvents();

??????????? }??

??????? }

??????

??????? private void button1_Click(object sender, System.EventArgs e)

??????? {

??????????? MessageBox.Show("開始");

??????????? TimeDelay(2900);

??????????? MessageBox.Show("時間到。");

??????? }

注意:在延時程序沒有完成前,不能退出。

dll文件調用

基本概念

動態鏈接庫 (DLL) 在運行時鏈接到程序。本程序通過兩個cs文件生成一個MyLibrary.DLL的庫文件。

Add.cs:為源文件,其中包含 Add(long i, long j) 方法。該方法返回參數之和。包含 Add 方法的 AddClass 類是命名空間 MyMethods 的成員。

Mult.cs:為源文件,其中包含 Multiply(long x, long y) 方法。該方法返回參數之積。包含 Multiply 方法的 MultiplyClass 類也是命名空間 MyMethods 的成員。

MyClient.cs:包含 Main 方法的文件。它使用 DLL 文件中的方法來計算運行時參數的和與積。

源程序

文件:Add.cs

// Add two numbers

using System;

namespace MyMethods

{

?public class AddClass

?{

? public static long Add(long i, long j)

? {

?? return(i+j);

? }

?}

}

文件:Mult.cs

// Multiply two numbers

using System;

namespace MyMethods

{

?public class MultiplyClass

?{

? public static long Multiply(long x, long y)

? {

?? return (x*y);

? }

?}

}

文件:MyClient.cs

// Calling methods from a DLL file

using System;

using MyMethods;

class MyClient

{

?public static void Main(string[] args)

?{

? Console.WriteLine("Calling methods from MyLibrary.DLL:");

? if (args.Length != 2)

? {

?? Console.WriteLine("Usage: MyClient <num1> <num2>");

?? return;

? }

? long num1 = long.Parse(args[0]);

? long num2 = long.Parse(args[1]);

? long sum = AddClass.Add(num1, num2);

? long product = MultiplyClass.Multiply(num1, num2);

? Console.WriteLine("The sum of {0} and {1} is {2}",

????? ?num1, num2, sum);

? Console.WriteLine("The product of {0} and {1} is {2}",

????? num1, num2, product);

?}

}

此文件包含使用 DLL 方法 Add 和 Multiply 的算法。它首先分析從命令行輸入的參數 num1 和 num2。然后使用 AddClass 類中的 Add 方法計算和,使用 MultiplyClass 類中的 Multiply 方法計算積。

請注意,文件開頭的 using 指令使您得以在編譯時使用未限定的類名來引用 DLL 方法,例如:

MultiplyClass.Multiply(num1, num2);

否則,必須使用完全限定名,例如:

MyMethods.MultiplyClass.Multiply(num1, num2);

編譯

若要生成文件 MyLibrary.DLL,使用以下命令行編譯文件 Add.cs 和文件 Mult.cs:

csc /target:library /out:MyLibrary.DLL Add.cs Mult.cs

如果對于一個文件以及缺省dll文件名,可以用:

csc /target:library Mult.cs

這樣生成一個Mult.dll的文件。

若要生成可執行文件 MyClient.exe,請使用以下命令行:

csc /out:MyClient.exe /reference:MyLibrary.DLL MyClient.cs

使用命令行編譯文件,在【開始】/【程序】/【Microsoft Visual Studio .NET 2003】/【Visual Studio .NET工具】/【Visual Studio .NET命令提示】。

默認目錄為當前用戶目錄。如果你使用Administrator,則目錄為C:\Documents and Settings\Administrator。你可以把幾個cs文件拷貝到這個目錄中。

執行

若要運行程序,請輸入 EXE 文件的名稱,文件名的后面跟兩個數字,例如:

MyClient 1234 5678

運行結果為:

Calling methods from MyLibrary.DLL:

The sum of 1234 and 5678 is 6912

The product of 1234 and 5678 is 7006652

自動編譯dll

建立一個bat文件如下:

c:\windows\microsoft.net\framework\v1.1.4322\csc.exe /target:library contour01.cs

就可以自動把contour01.cs編譯成contour01.dll了。

?

在IDE中調用dll

把以上的文件編譯成MyLibrary.DLL后,在一個控制臺應用程序中使用MyClient.cs。先引用MyLibrary.DLL,然后修改程序為:

using System;

using MyMethods;

class MyClient

{

???? public static void Main(string[] args)

???? {

???????? Console.WriteLine("Calling methods from MyLibrary.DLL:");

???????? long num1 = 100;

???????? long num2 = 550;

???????? long sum = AddClass.Add(num1, num2);

???????? long product = MultiplyClass.Multiply(num1, num2);

???????? Console.WriteLine("The sum of {0} and {1} is {2}",

????????????? num1, num2, sum);

???????? Console.WriteLine("The product of {0} and {1} is {2}",

????????????? num1, num2, product);

???? }

}

運行結果和以前一樣。

在C#中調用dll

1.編譯dll文件。

2.把dll文件拷貝到工作文件夾下面。

3.在右邊文件夾的【引用】上右擊,選擇【添加引用】,在【com】中瀏覽選擇,即可添加。也可以在菜單【項目】/【添加引用】上添加。

4.如果需要修改,需要把管理員目錄下的dll文件刪除,再次生成。

?

創建自定義控件

定義控件類

定義從 System.Windows.Forms.Control 派生的類。

public class FirstControl:Control{...}

定義屬性

以下代碼片段定義名為 TextAlignment 的屬性,FirstControl 使用該屬性來定義從 Control 繼承的 Text 屬性的顯示格式。

// ContentAlignment is an enumeration defined in the System.Drawing

// namespace that specifies the alignment of content on a drawing

// surface.

private ContentAlignment alignment = ContentAlignment.MiddleLeft;

?

public ContentAlignment TextAlignment {

?? get {

????? return alignment;

?? }

?? set {

????? alignment = value;

????? // The Invalidate method invokes the OnPaint method described

????? // in step 3.

????? Invalidate();

?? }

}

在設置更改控件外觀顯示的屬性時,必須調用 Invalidate 方法來重新繪制該控件。Invalidate 是在基類 Control 中定義的。

重寫OnPaint 方法

重寫從 Control 繼承的受保護的 OnPaint 方法,以便為控件提供呈現邏輯。如果不改寫 OnPaint,您的控件將無法自行繪制。在下列代碼片段中,OnPaint 方法顯示了從 Control 繼承的具有默認對齊方式的 Text 屬性。

public class FirstControl : Control{

?? public FirstControl() {...}

?? protected override void OnPaint(PaintEventArgs e) {

????? base.OnPaint(e);

????? e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), ClientRectangle, style);

?? }

}

提供控件屬性

屬性可使可視化設計器在設計時適當地顯示控件及其屬性和事件。以下代碼片段將屬性應用于 TextAlignment 屬性。在 Microsoft Visual Studio .NET 這樣的設計器中,Category 屬性(如代碼片段所示)使該屬性顯示在邏輯類別中。在選擇 TextAlignment 屬性時,Description 屬性使說明字符串顯示在“屬性”窗口的底部。

?[

Category("Alignment"),

Description("Specifies the alignment of text.")

]

public ContentAlignment TextAlignment {...}

提供控件資源

通過使用編輯器選項(C# 中為 /res),可以為控件提供諸如位圖之類的資源來打包控件的資源。在運行時,使用 System.Resources.ResourceManager 類的方法可檢索該資源。有關創建和使用資源的更多信息,請參見 .NET 示例 – 如何獲取:資源快速入門。

編譯和部署控件

要編譯和部署 FirstControl,請執行以下步驟:

將下列示例中的代碼保存到源文件(如 FirstControl.cs)。

將源代碼編譯成程序集,并將其保存到應用程序的目錄中。為了實現這一目的,需在包含源文件的目錄中執行以下命令。

csc /t:library /out:[path to your application's directory]/CustomWinControls.dll /r:System.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll FirstControl.cs

/t:library 編譯器選項告訴編譯器正在創建的程序集是一個庫(而不是一個可執行程序)。/out 選項用來指定程序集的路徑和名稱。/r 選項提供代碼所參考的程序集的名稱。在本示例中,創建了一個僅供您自己的應用程序使用的專用程序集。因此,您必須將其保存到您的應用程序的目錄中。有關打包和部署控件進行分發的更多信息,請參見部署 .NET Framework 應用程序。

示例程序

以下示例顯示了 FirstControl 的代碼。該控件包含在命名空間 CustomWinControls 中。命名空間提供了相關類型的邏輯分組。可以在新命名空間或現有的命名空間中創建控件。在 C# 中,using 聲明(在 Visual Basic 中,Imports)允許從命名空間訪問類型,而無須使用完全限定的類型名稱。在以下示例中,using 聲明允許代碼從 System.Windows.Forms 作為簡單控件存取 Control 類,而無須使用完全限定的名稱 System.Windows.Forms.Control。

namespace CustomWinControls {

?? using System;

?? using System.ComponentModel;

?? using System.Windows.Forms;

?? using System.Drawing;

?? public class FirstControl : Control {

????? private ContentAlignment alignment = ContentAlignment.MiddleLeft;

?????

????? [

?????? Category("Alignment"),

?????? Description("Specifies the alignment of text.")

????? ]

????? public ContentAlignment TextAlignment {

???????? get {

??????????? return alignment;

???????? }

???????? set {

??????????? alignment = value;

??????????? // The Invalidate method invokes the OnPaint method.

??????????? Invalidate();

???????? }

????? }

?

????? // OnPaint aligns text, as specified by the

????? // TextAlignment property, by passing a parameter

????? // to the DrawString method of the System.Drawing.Graphics object.

????? protected override void OnPaint(PaintEventArgs e) {

???????? base.OnPaint(e);

???????? StringFormat style = new StringFormat();

???????? style.Alignment = StringAlignment.Near;

???????? switch (alignment) {

??????????? case ContentAlignment.MiddleLeft:

?????????????? style.Alignment = StringAlignment.Near;

?????????????? break;

??????????? case ContentAlignment.MiddleRight:

?????????????? style.Alignment = StringAlignment.Far;

?????????????? break;

??????????? case ContentAlignment.MiddleCenter:

?????????????? style.Alignment = StringAlignment.Center;

?????????????? break;

???????? }

???????? // Call the DrawString method of the System.Drawing class to write??

???????? // text. Text and ClientRectangle are properties inherited from

???????? // Control.

???????? e.Graphics.DrawString(Text, Font, new SolidBrush(ForeColor), ClientRectangle, style);

????? }

?? }

}

在窗體上使用自定義控件

以下示例說明了一個使用 FirstControl 的簡單窗體。它創建了三個 FirstControl 實例,每個實例都有不同的 TextAlignment 屬性值。

將下列示例中的代碼保存到源文件(SimpleForm.cs)。

通過從包含該源文件的目錄中執行以下命令,將源代碼編譯成可執行的程序集。

csc /r:CustomWinControls.dll /r:System.dll /r:System.Windows.Forms.dll /r:System.Drawing.dll SimpleForm.cs

CustomWinControls.dll 是包含類 FirstControl 的程序集。該程序集必須與存取它的窗體源文件位于同一目錄中(SimpleForm.cs 或 SimpleForms.vb)。

使用下列命令執行 SimpleForm.exe。

SimpleForm

using System;

using System.Windows.Forms;

using System.Drawing;

using CustomWinControls;

?

class SimpleForm : Form {

?? private FirstControl left;

?? private FirstControl center;

?? private FirstControl right;

??

?? protected override void Dispose(bool disposing) {

????? base.Dispose(disposing);

?? }

?

?? public SimpleForm() : base() {

????? left = new FirstControl();

????? left.Text = "Left";

????? left.Location = new Point(50, 50);

????? left.Size = new Size(50, 50);

????? Controls.Add(left);

?????

????? center = new FirstControl();

????? center.TextAlignment = ContentAlignment.MiddleCenter;

????? center.Text = "Center";

????? center.Location = new Point(125, 50);

????? center.Size = new Size(50, 50);

????? Controls.Add(center);

?????

????? right = new FirstControl();

????? right.TextAlignment = ContentAlignment.MiddleRight;

????? right.Text = "Right";

????? right.Location = new Point(200, 50);

????? right.Size = new Size(50, 50);

????? Controls.Add(right);

?? }

??

?? [STAThread]

?? public static void Main(string[] args) {

????? Form form = new SimpleForm();

????? form.Text = "Uses FirstControl";

????? form.Size = new Size(400, 150);

????? Application.Run(form);

?? }

}

用戶控件

用途

用戶控件相當于帶界面的類模塊,并可以編譯成dll。具有以下優點:

1.可以把程序分離成內核部分和引用部分,便于開發和維護;

2.可以多進程調用;

3.安全性好。

自己創建的例子

自己創建一個簡單用戶控件的步驟為:

1.新建一個“Windows控件庫”的項目;

2.編寫控件程序,如需要傳遞參數,定義如下:

public PointF p1,p2;

3.在【生成】中生成dll;

4.用【文件】/【添加項目】/【新建項目】,新建一個使用控件項目,為“Windows應用程序”;

5.用【項目】/【添加引用】/【項目】,引用控件項目;

6.在【工具箱】/【我的用戶控件】中選擇生成的控件;

7.把使用項目設置為啟動;

8.編寫程序。如果傳遞參數,用:

??????? private void Form1_Load(object sender, System.EventArgs e)

??????? {

??????????? userControl11.p1=new PointF(20,20);

??????????? userControl11.p2=new PointF(100,200);

??????? }

然后可以在這個解決方案中隨意修改控件設計,只要運行調用程序,就可以自動編譯和加載控件了。如果修改了控件的界面,還需要重新生成和加載。

如果在單獨的使用程序中調用這個dll控件,則先需要添加引用,然后需要在“工具箱”上點擊右鍵,選擇【添加/移除項】,把這個控件添加到工具箱上,才可以添加到form上。

在使用程序中可以隨意調用控件中的方法。如果要在控件中調用使用程序中的方法,則可以使用一個傳遞參數,如 int bi,每次點擊事件時bi值改變。然后在使用程序中用一個timer控件,用事件timer1_Tick來監控bi的變化,來觸發一個方法。

inputBox方法

類定義

???????? public class InputBox : System.Windows.Forms.Form

???????? {

????????????? private System.Windows.Forms.TextBox txtData;

????????????? private System.Windows.Forms.Label lblInfo;

????????????? private System.ComponentModel.Container components = null;?

?

????????????? private InputBox()

????????????? {

?????????????????? InitializeComponent();

????????????? }?

?

????????????? protected override void Dispose( bool disposing )

????????????? {

?????????????????? if( disposing )

?????????????????? {

?????????????????????? if(components != null)

?????????????????????? {

??????????????????????????? components.Dispose();

?????????????????????? }

?????????????????? }

?????????????????? base.Dispose( disposing );

????????????? }?

?

????????????? private void InitializeComponent()

????????????? {

?????????????????? this.txtData = new System.Windows.Forms.TextBox();

?????????????????? this.lblInfo = new System.Windows.Forms.Label();

?????????????????? this.SuspendLayout();

??????????????????

?????????????????? // txtData????????????

?????????????????? this.txtData.Font = new System.Drawing.Font("宋體", 10.5F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(134)));

?????????????????? this.txtData.Location = new System.Drawing.Point(19, 8);

?????????????????? this.txtData.Name = "txtData";

?????????????????? this.txtData.Size = new System.Drawing.Size(317, 23);

?????????????????? this.txtData.TabIndex = 0;

?????????????????? this.txtData.Text = "";

?????????????????? this.txtData.KeyDown += new System.Windows.Forms.KeyEventHandler(this.txtData_KeyDown);

??????????????????

?????????????????? // lblInfo

?????????????????? this.lblInfo.Font = new System.Drawing.Font("宋體", 9F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((System.Byte)(134)));

?????????????????? this.lblInfo.Location = new System.Drawing.Point(19, 32);

?????????????????? this.lblInfo.Name = "lblInfo";

?????????????????? this.lblInfo.Size = new System.Drawing.Size(317, 16);

?????????????????? this.lblInfo.TabIndex = 1;

?????????????????? this.lblInfo.Text = "按[Enter]鍵確認,按[Esc]鍵取消";

?

?????????????????? // InputBox

?????????????????? this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);

?????????????????? this.ClientSize = new System.Drawing.Size(350, 48);

?????????????????? this.ControlBox = false;

?????????????????? this.Controls.Add(this.lblInfo);

?????????????????? this.Controls.Add(this.txtData);

?????????????????? this.FormBorderStyle = System.Windows.Forms.FormBorderStyle.FixedDialog;

?????????????????? this.Name = "InputBox";

?????????????????? this.Text = "InputBox";

?????????????????? this.ResumeLayout(false);

????????????? }

?

????????????? //對鍵盤進行響應

????????????? private void txtData_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)

????????????? {

?????????????????? if(e.KeyCode == Keys.Enter)

?????????????????? {

?????????????????????? this.Close();

?????????????????? }

?????????????????? else if (e.KeyCode == Keys.Escape )

?????????????????? {

?????????????????????? txtData.Text = string.Empty ;

?????????????????????? this.Close();

?????????????????? }

????????????? }

?

????????????? //顯示InputBox

????????????? public static string ShowInputBox(string Title,string keyInfo)

????????????? {

?????????????????? InputBox inputbox = new InputBox();

?????????????????? inputbox.Text =Title;

?????????????????? if (keyInfo.Trim() != string.Empty )

?????????????????????? inputbox.lblInfo.Text =keyInfo;

?????????????????? inputbox.ShowDialog();

?????????????????? return inputbox.txtData.Text;

????????????? }

???????? }???????

普通調用

???????? private void button1_Click(object sender, System.EventArgs e)

???????? {

????????????? string inMsg = InputBox.ShowInputBox("輸入信息",string.Empty );

????????????? //對用戶的輸入信息進行檢查

????????????? if (inMsg.Trim() != string.Empty )

????????????? {

?????????????????? MessageBox.Show(inMsg);

????????????? }

????????????? else

????????????? {

?????????????????? MessageBox.Show("輸入為空!");

????????????? }

如果需要輸入一個int數值,則程序如下:

????????????? string inMsg = InputBox.ShowInputBox("輸入信息",string.Empty );

????????????? int a1;

????????????? if (inMsg.Trim() != string.Empty )

????????????? {

?????????????????? try

?????????????????? {

?????????????????????? a1=Convert.ToInt32(inMsg.Trim());

?????????????????????? MessageBox.Show(a1.ToString());

?????????????????? }

?????????????????? catch (Exception)

?????????????????? {

?????????????????????? MessageBox.Show("輸入錯誤!繼續保持原有數據。");

?????????????????? }

????????????? }

????????????? else

????????????? {

?????????????????? MessageBox.Show("輸入為空!");

????????? }

增加缺省值

在類中增加以下程序:

??????????? public static string ShowInputBox(string Title,string keyInfo,string textInfo)

??????????? {

??????????????? InputBox inputbox = new InputBox();

??????????????? inputbox.Text =Title;??????????????

??????????????? inputbox.txtData.Text=textInfo;??????????????

??????????????? if (keyInfo.Trim() != string.Empty )

??????????????????? inputbox.lblInfo.Text =keyInfo;

??????????????? inputbox.ShowDialog();

??????????????? return inputbox.txtData.Text;

??????????? }

可以在調用時輸入textBox中的缺省值。

?

版本設置

在文件AssemblyInfo.cs中修改

[assembly: AssemblyVersion("2.1.1.*")]

則在最后生成的EXE文件中顯示版本號2.2.1.10803,最后一個號碼隨著每次編輯修改后遞增。

?

?

?

?

總結

以上是生活随笔為你收集整理的C#(WINFORM)学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

久草视频观看 | 国产亚洲精品久久久久久网站 | 天堂在线视频免费观看 | 国产91精品一区二区麻豆网站 | 色多多视频在线观看 | 少妇性bbb搡bbb爽爽爽欧美 | 亚洲aⅴ免费在线观看 | 中文字幕有码在线 | 亚洲欧洲视频 | 欧美aa级 | 婷婷亚洲综合五月天小说 | 天天操天天是 | 天天操夜操视频 | 亚洲欧美日韩在线看 | 涩涩色亚洲一区 | 久久久久在线视频 | 日本高清久久久 | 激情视频一区二区三区 | 欧美在线91 | 久草a在线| 手机在线永久免费观看av片 | 欧美九九九 | 婷婷激情5月天 | 久草手机视频 | 夜夜骑天天操 | 蜜臀一区二区三区精品免费视频 | 国产高清日韩 | 国产精品va在线 | 国产精品乱码久久 | 精品国产诱惑 | 国产精品久久在线观看 | 日韩av综合网站 | 日本中文字幕在线播放 | 99热都是精品| 97热在线观看| 69亚洲精品 | 国产成人高清 | 色中色资源站 | 曰本三级在线 | 色综合久久久久综合体桃花网 | 日韩高清av | 91久久黄色 | 欧美日韩午夜在线 | 国产成人免费观看久久久 | 丁香激情五月 | 久久在线影院 | 人人干网| 丁香六月婷婷激情 | 国产视频精品在线 | 99在线视频免费观看 | av在线不卡观看 | 精品国内| 国产成人久久精品亚洲 | 蜜臀av性久久久久av蜜臀妖精 | 毛片网站在线观看 | 黄色在线免费观看网站 | 人人爽人人爽人人爽人人爽 | 日韩在线免费视频 | 久久久999精品视频 国产美女免费观看 | 欧美在线视频日韩 | 91在线精品秘密一区二区 | 天天玩天天操天天射 | 国精产品999国精产品视频 | 成人在线视频论坛 | 日韩欧美视频 | 麻豆 free xxxx movies hd | 91在线影院 | 国产高清第一页 | 久久久久久久久综合 | 亚洲激情 欧美激情 | 精品国模一区二区三区 | 成人av资源网站 | 日批在线看 | 91麻豆看国产在线紧急地址 | 不卡的av在线播放 | av黄色在线播放 | 日韩二区三区在线 | 国产性天天综合网 | 涩涩在线| 激情久久一区二区三区 | 色综合久久88色综合天天人守婷 | 97在线观看免费高清完整版在线观看 | 黄色片免费在线 | 免费99精品国产自在在线 | 久久婷婷一区二区三区 | 欧美日韩中文字幕综合视频 | 天天综合色天天综合 | 97超碰国产在线 | 一区二区中文字幕在线播放 | 久久手机看片 | 亚洲精品国产精品乱码在线观看 | 五月婷婷六月丁香 | 国产精品aⅴ | 精品国产人成亚洲区 | 免费 在线 中文 日本 | 精品中文字幕在线 | www.色午夜,com| 欧美日韩国产一区二区在线观看 | 久久不卡国产精品一区二区 | 久久久www免费电影网 | 国产精品a成v人在线播放 | 91x色| 国产美女精品视频 | 天天色中文| 人人揉人人揉人人揉人人揉97 | 九九免费在线观看视频 | 亚洲精品乱码久久久久久9色 | 日韩欧美在线影院 | 色com| 中文字幕在线国产精品 | 手机成人av | 久久人人爽人人爽人人片av免费 | 一区二区三区中文字幕在线观看 | 国产999精品久久久 免费a网站 | 精品国产aⅴ一区二区三区 在线直播av | 伊人手机在线 | 中文字幕网站 | 天海冀一区二区三区 | 色网站免费在线观看 | 精品久久久久久亚洲综合网站 | 免费91在线 | 国产视频一区在线播放 | 五月天电影免费在线观看一区 | 91精品国产91 | 天天综合色网 | 一区二区精品 | 麻豆av一区二区三区在线观看 | 欧美亚洲一级片 | 人人搞人人干 | 香蕉影视app | 久久免费视频网 | 精品亚洲男同gayvideo网站 | 亚洲精品影院在线观看 | 最新久久免费视频 | 午夜精品三区 | 精品中文字幕在线播放 | 国产伦理一区 | av在线超碰 | 天天综合婷婷 | 国产小视频免费在线观看 | 亚洲小视频在线 | 精品一二三四五区 | 91精品欧美 | 日韩av中文在线 | 久久五月情影视 | 久久玖 | 日韩专区一区二区 | 日韩欧美99| 亚洲老妇xxxxxx | 日韩美在线观看 | 久久综合射 | 亚洲伦理电影在线 | 成人啪啪18免费游戏链接 | 青青啪| 狠狠色噜噜狠狠 | 91成人免费视频 | 日韩理论电影在线 | 国产精品国产亚洲精品看不卡 | 久久精品视频免费播放 | 韩日精品中文字幕 | av免费网 | 国产在线传媒 | 欧美精品在线观看免费 | 丁香五婷| 韩国精品视频在线观看 | 中国一级片在线播放 | 麻豆91在线观看 | 91视频首页 | 色偷偷中文字幕 | 中文字幕国产 | 精品国产伦一区二区三区观看方式 | 国产精品久久久久久吹潮天美传媒 | 激情视频免费观看 | 国产 一区二区三区 在线 | 婷婷国产视频 | 久久伊人八月婷婷综合激情 | а天堂中文最新一区二区三区 | 97视频在线看| 成人免费一区二区三区在线观看 | 免费日韩一区二区 | 精品国精品自拍自在线 | 天堂资源在线观看视频 | 精品一区免费 | 9999精品 | 色视频在线免费观看 | 亚洲成成品网站 | 国产成人香蕉 | 91在线视频网址 | 最新日韩视频 | 久久久国产毛片 | 日日插日日干 | 黄色av电影一级片 | 国产又粗又猛又色 | 亚洲黄色免费在线 | 国精产品一二三线999 | 91视频在线免费看 | 五月天电影免费在线观看一区 | 成人在线免费观看视视频 | 日日夜夜草 | 久久 地址| 91九色蝌蚪视频 | 成人小视频在线 | 99综合影院在线 | 精品国产视频一区 | 亚洲黄色片一级 | 最近中文字幕高清字幕免费mv | 亚洲va在线va天堂va偷拍 | 天堂av色婷婷一区二区三区 | 婷婷六月综合亚洲 | 国产精品久久久久久久久久久不卡 | 中文字幕亚洲国产 | 久久情爱| 91九色丨porny丨丰满6 | 欧美日韩亚洲精品在线 | 97精品国产97久久久久久春色 | 日本女人逼| 黄色小说视频在线 | 青草视频在线 | 黄色大全免费观看 | 欧美成人性网 | 中文字幕av电影下载 | 亚洲成人国产 | 国产精品久久久久久久久久妇女 | 婷婷久久一区 | 夜夜爱av | 激情五月av | 久久精品成人热国产成 | 国产麻豆精品久久一二三 | 狠狠操导航 | 婷婷亚洲最大 | 久久高清免费视频 | 成人免费在线播放视频 | 国产精品一区二区在线免费观看 | 97国产人人| 国产高清中文字幕 | 国产一区免费在线 | 91免费网 | 亚洲码国产日韩欧美高潮在线播放 | 国产a视频免费观看 | 婷婷av色综合 | 久久精品中文字幕免费mv | 五月av在线 | 亚洲免费永久精品国产 | 国产在线高清精品 | 综合久久精品 | 天天干人人 | 久久五月婷婷丁香 | 日韩欧美在线不卡 | 久久天天躁狠狠躁夜夜不卡公司 | 日韩欧美一区二区在线观看 | 亚洲经典中文字幕 | 欧美精品成人在线 | av黄色影院 | 成年人在线视频观看 | 香蕉视频导航 | 欧美一级片免费在线观看 | 麻豆视频观看 | 亚洲综合视频在线 | 精品久久久久国产免费第一页 | 国产精品视频免费 | 91福利区一区二区三区 | 国产精品免费观看在线 | 91久久爱热色涩涩 | 在线一二三四区 | 欧美精品一区二区三区四区在线 | 久久久高清视频 | 在线一区二区三区 | 天天操婷婷 | 天天插夜夜操 | 日韩精品久久久免费观看夜色 | 国产另类xxxxhd高清 | 国产一二三四在线视频 | 99久久精品国产一区 | 久久久国产精品亚洲一区 | 国产成人免费在线 | 亚洲精品国偷拍自产在线观看蜜桃 | 午夜精品一二区 | 91亚洲精品在线观看 | 精品一区二区久久久久久久网站 | 91精品伦理 | 九九热久久免费视频 | 在线91网| 91天堂素人约啪 | 精品视频在线免费 | 亚洲资源在线观看 | 91精品办公室少妇高潮对白 | 精品色综合 | 色全色在线资源网 | 国产在线观看国语版免费 | 久久久国产电影 | 亚洲一区二区天堂 | 成年人app网址 | 欧美亚洲专区 | 婷婷色网址 | 日本成人黄色片 | 男女啪啪视屏 | www.久久视频 | 777久久久| 国产精品久久久毛片 | 中文字幕免费国产精品 | 99在线看 | 亚洲精品免费播放 | 欧美日韩不卡在线视频 | 亚洲欧美视频在线观看 | 久久国产精品99国产精 | 狠狠干.com | 中文字幕一区二区在线播放 | 天天看天天干 | 国产精品理论片在线观看 | 99色精品视频 | 日本不卡久久 | 久久综合五月天婷婷伊人 | 国产精品www| 国产一级不卡毛片 | 中文日韩在线视频 | 国产在线观看免费观看 | 日韩在线视频免费播放 | 国产成人精品一二三区 | 国产一二三在线视频 | 精品免费国产一区二区三区四区 | 97精品一区 | 亚洲精品国产自产拍在线观看 | 久久激情小视频 | 亚洲精品理论片 | 黄色一级大片在线观看 | 美女网站视频一区 | 夜夜爽天天爽 | 日韩免费 | 在线观看免费色 | 国产视频一区在线免费观看 | 91精品国产福利在线观看 | 久草资源在线 | 国产r级在线观看 | 亚洲国产成人在线观看 | 国产精品自在线 | av国产在线观看 | 国产你懂的在线 | 国产精品一区二区三区在线播放 | 91九色精品 | 97自拍超碰 | 色姑娘综合网 | 麻豆视频在线观看免费 | 国产一区二区日本 | 国产精品免费一区二区三区 | 黄色字幕网 | 97国产| 91黄视频在线 | 日韩伦理一区二区三区av在线 | 激情久久小说 | 国产99久久久国产精品免费二区 | 国产一区私人高清影院 | 日本久久不卡视频 | 免费看国产一级片 | 91热| 四虎在线影视 | 激情自拍av | 天天干天天射天天插 | 99热手机在线观看 | 美女黄网站视频免费 | 久久 一区| 国产精品一区二区久久国产 | www视频免费在线观看 | 中文字幕在线免费看 | 国产电影黄色av | www.天天干| 免费在线观看污 | 欧美性色19p | 正在播放国产一区二区 | 亚洲va欧美va人人爽春色影视 | 国产h片在线观看 | 视频在线日韩 | 国产精品久久久久一区 | 91中文在线观看 | 国产精品福利在线播放 | 久久综合久久久 | 久草在线综合 | 中文字幕免费观看全部电影 | 亚洲va欧美va人人爽春色影视 | 国产成人高清在线 | 国产视频 久久久 | 91成人区| 在线视频日韩欧美 | 丁香在线 | 一区二区三区高清在线观看 | 亚洲 欧美 91| 国产一区二区午夜 | 91av手机在线 | 在线观看国产中文字幕 | 成人av在线电影 | 婷婷色九月 | 国产成视频在线观看 | 欧美不卡在线 | 成人a v视频 | 麻豆成人在线观看 | 2023av| 久久精品精品电影网 | 免费黄色a网站 | 成人一区二区在线观看 | 性色大片在线观看 | 欧美a免费 | 久久精品理论 | 色999在线 | 国产资源精品在线观看 | 狠狠狠狠狠色综合 | 日韩午夜在线播放 | 欧美日韩中文在线观看 | 久久国产精品小视频 | 97狠狠干 | 天天干天天碰 | 日韩夜夜爽 | 超碰国产在线观看 | 91完整版| 永久免费精品视频 | 色综合天天干 | 91最新视频在线观看 | 日韩午夜电影 | 日韩av免费一区 | 免费看毛片在线 | 国产一区二区三区在线 | 97免费中文视频在线观看 | 亚洲黄色小说网 | 又黄又爽又色无遮挡免费 | 99热精品久久 | 在线视频手机国产 | 欧美午夜a | 婷婷综合激情 | 久久成人视屏 | av一级片网站 | 最新极品jizzhd欧美 | 91大神免费视频 | 黄色一级大片在线免费看产 | 人人玩人人添人人 | 午夜精品久久一牛影视 | 麻豆传媒在线免费看 | 香蕉在线观看视频 | av在线进入 | 国产精品久久一 | 国产成人久久av977小说 | 久久国产精品成人免费浪潮 | 国产在线观看你懂的 | 成人国产精品久久久春色 | 久久综合久久综合这里只有精品 | 五月婷婷一区二区三区 | 国产日本在线观看 | 婷婷丁香久久五月婷婷 | 亚洲少妇激情 | 日韩特级黄色片 | 国产亚洲成av人片在线观看桃 | 日批在线观看 | 91av网址 | 免费av观看网站 | 色噜噜在线观看视频 | 五月天综合网站 | 中文字幕高清 | 久久综合五月天婷婷伊人 | 国产小视频在线免费观看 | 中文字幕亚洲欧美日韩2019 | 在线观看视频精品 | 99中文字幕在线观看 | 色综合天天色综合 | 久久免费在线观看视频 | 亚洲麻豆精品 | 在线国产欧美 | 国产一级视屏 | 菠萝菠萝在线精品视频 | 中文字幕精品一区二区三区电影 | 在线观看成人一级片 | 欧洲性视频 | 在线观看 国产 | 国产专区在线看 | 激情综合五月网 | 搡bbbb搡bbb视频 | 色狠狠干 | 欧美高清视频不卡网 | 日韩免费播放 | 欧美国产高清 | 天天干天天搞天天射 | 免费观看性生交大片3 | 91精品久久久久久久91蜜桃 | 国产精品毛片一区二区三区 | 久久免费国产电影 | 日韩免费av网址 | 日韩电影一区二区在线 | 国产偷在线 | 日韩av一区二区三区四区 | 成人性生交大片免费观看网站 | 92国产精品久久久久首页 | 天天操福利视频 | 日韩免费看视频 | av色网站 | 亚洲不卡在线 | 91亚洲精品国偷拍自产在线观看 | 日韩系列在线 | 91超级碰| 日本黄区免费视频观看 | 成 人 黄 色 免费播放 | 久久久一本精品99久久精品66 | 丰满少妇在线观看网站 | 欧美一区日韩精品 | 亚洲精品视频偷拍 | 日韩电影精品 | 日韩av在线免费看 | av成人在线电影 | 国产一级视频在线免费观看 | 国产特级毛片aaaaaaa高清 | 亚洲视频播放 | 久久天天躁狠狠躁亚洲综合公司 | 97碰在线 | 一色屋精品视频在线观看 | 婷婷六月天在线 | 国产高清av在线播放 | 免费看一级一片 | 国产精品永久久久久久久www | 日韩欧美精品一区二区 | 国产热re99久久6国产精品 | 国产91影院| 欧美男同视频网站 | 亚洲三级黄 | 99一级片 | 麻豆久久一区二区 | 日韩激情片在线观看 | ,午夜性刺激免费看视频 | 99高清视频有精品视频 | 免费看片日韩 | 在线免费黄 | 国产精品亚洲人在线观看 | 婷婷深爱网 | 在线99热 | 干综合网 | 中文字幕不卡在线88 | 在线中文字幕av观看 | www视频在线播放 | 九色精品免费永久在线 | 99精品国产福利在线观看免费 | 日韩精品中文字幕在线 | 久久99日韩 | 久久精品欧美一区 | 欧美专区国产专区 | 一区二区视频欧美 | 9免费视频| 黄网站污 | 一级一片免费看 | 亚洲精品三级 | 中文字幕在线久一本久 | 国产1区2| 亚洲精品字幕在线 | 亚洲一级性 | 免费日韩一区二区 | 在线a人片免费观看视频 | 国产 日韩 在线 亚洲 字幕 中文 | 天天综合色天天综合 | 国产精品福利视频 | 在线看成人av | 日韩爱爱网站 | 日韩在线视频免费看 | 福利视频导航网址 | 亚洲精品国产欧美在线观看 | 最近免费中文视频 | av在线免费播放网站 | 天天草天天干 | 91九色蝌蚪国产 | 久久99精品久久久久久久久久久久 | 久久精品99国产精品酒店日本 | 天堂v中文| 精品免费久久久久 | 精品产品国产在线不卡 | 国产精品毛片一区视频播 | 999ZYZ玖玖资源站永久 | 欧美韩国日本在线 | 久久超级碰视频 | 国产精品一区欧美 | 国产91国语对白在线 | 最近中文字幕在线播放 | 中文字幕 国产精品 | 国产美女网站在线观看 | 综合久久综合久久 | 亚洲视频免费在线观看 | 色婷婷激情电影 | 五月网婷婷 | 永久免费精品视频网站 | 久久久久女人精品毛片 | 免费在线观看污网站 | 亚洲精品合集 | 日日夜夜91 | 午夜精品久久 | 高清日韩一区二区 | 亚洲精品国偷自产在线99热 | 免费观看国产精品视频 | 日韩在线一级 | 天天精品视频 | 在线观看www91| 日av免费 | 亚洲 欧美 91 | 日韩中文字幕在线观看 | 免费av网站在线 | 国产99在线 | 成人免费观看完整版电影 | 成人免费在线观看av | 在线观看av片 | 97超碰在线免费 | 美女视频黄免费 | 久久国产欧美日韩精品 | 国产成人精品一区二区在线 | 一级a毛片高清视频 | 国产在线观看污片 | 免费在线播放av电影 | 青青草国产免费 | 天堂av免费 | 国产一二三区av | 日韩videos高潮hd| 亚洲一级性 | 午夜久久久久久久久久久 | 在线国产激情视频 | 狠狠色狠狠综合久久 | 麻豆精品视频在线 | 91最新在线| 亚洲国产剧情av | 日韩欧美视频在线免费观看 | 99成人精品 | 久久久久久国产精品亚洲78 | 国产精品电影在线 | 欧美一级免费片 | 精品福利网站 | 精品国产精品久久 | 婷婷色资源 | 午夜av在线电影 | 黄色a一级视频 | 色网站视频 | 九九久久久久久久久激情 | 成人蜜桃网| 免费视频一区二区 | 欧美在线aa | 免费aa大片 | 欧美日韩亚洲第一 | 在线免费视频 你懂得 | 国产欧美中文字幕 | 亚洲精品动漫成人3d无尽在线 | 久久99网 | 亚洲美女免费精品视频在线观看 | 久久99精品久久久久久三级 | 天天鲁一鲁摸一摸爽一爽 | 99精品国产高清在线观看 | 999热视频| 欧美作爱视频 | 一区二区三区精品久久久 | 久久精品国产亚洲精品2020 | 91丨九色丨高潮丰满 | 精品日韩在线 | 国产中文视频 | 日本中文在线观看 | 国产精品一区二区久久国产 | 日韩精品久久久久久中文字幕8 | 欧美午夜精品久久久久久浪潮 | 911亚洲精品第一 | 国产黄色av | 久久久久久久久久久久久9999 | 成人午夜网址 | 99r在线精品 | 天天艹天天| 美女搞黄国产视频网站 | 久久人人爽人人片 | 国产原创中文在线 | 精品久久久999 | 一级精品视频在线观看宜春院 | 日日夜夜网站 | 六月天色婷婷 | 九九热在线观看视频 | 激情久久一区二区三区 | 国产成a人亚洲精v品在线观看 | 亚洲一级片在线观看 | 久草视频中文在线 | 亚洲永久精品视频 | 成人av免费网站 | 日韩资源在线观看 | 午夜视频在线观看网站 | 亚洲情影院 | 国产视频一区精品 | 天天操天天是 | 午夜视频在线观看网站 | 欧美一级电影 | 97福利在线观看 | 成片免费 | 久久日本视频 | 国产亚洲精品无 | 天天综合久久综合 | 国产欧美最新羞羞视频在线观看 | 热久在线 | 国产成人精品a | 色婷婷福利视频 | 中文字幕免费不卡视频 | 成人禁用看黄a在线 | 天天干天天碰 | 亚洲欧美激情精品一区二区 | 久久色在线播放 | 久久久久久97三级 | 欧美日韩国产三级 | 超碰资源在线 | 亚洲视频aaa| 久久99精品久久久久久清纯直播 | 久草在线视频首页 | 久久国产精品视频免费看 | 久久社区视频 | 久久久免费精品 | 免费特级黄毛片 | 国产免费久久av | 久久精品5| 免费观看全黄做爰大片国产 | 在线视频日韩欧美 | 国产精品一区久久久久 | 日韩久久精品一区二区三区下载 | 日韩精品中文字幕久久臀 | wwwwww国产 | 亚洲一区二区三区精品在线观看 | www.在线观看视频 | 色资源二区在线视频 | 久久99国产精品免费 | 美女网站在线观看 | 国精产品999国精产品岳 | 久久天天躁夜夜躁狠狠躁2022 | 成人毛片a | 免费一级日韩欧美性大片 | 丁香花在线视频观看免费 | 国语自产偷拍精品视频偷 | 久久情爱| 欧美 日韩 国产 成人 在线 | 99爱视频| 97国产人人 | 国产精品99精品久久免费 | 在线婷婷 | 免费看黄20分钟 | 久久免费视频观看 | 九九热1| 成人小视频免费在线观看 | 久久久久女人精品毛片 | 九九热精品视频在线播放 | av中文字幕亚洲 | 欧美日韩在线观看一区二区三区 | 久热精品国产 | 国产精品 美女 | 91福利视频网站 | 超碰在线中文字幕 | 欧美超碰在线 | www.色婷婷.com | 中文字幕文字幕一区二区 | 黄色影院在线免费观看 | 97在线免费视频观看 | 国产精品18videosex性欧美 | 日韩av一区二区在线播放 | 久免费视频 | 一区二区三区免费在线观看视频 | 欧美视频xxx | 欧美大码xxxx | 狠狠色伊人亚洲综合网站色 | 久草久草在线观看 | 人人爱天天操 | 日本h在线播放 | www.五月天色| 亚洲精品国偷拍自产在线观看 | 日韩精品免费一线在线观看 | 国产精品h在线观看 | 二区三区在线视频 | 一区二区精品国产 | 国产精品毛片久久久久久 | 综合铜03| 久久精品—区二区三区 | 91九色国产蝌蚪 | 久久久久久精 | av官网在线 | 免费在线观看av网站 | 在线播放视频一区 | 成人高清在线 | 日韩欧美在线免费观看 | 伊人五月天.com | 成人午夜剧场在线观看 | 色噜噜日韩精品欧美一区二区 | 欧美性另类 | 99久久这里有精品 | 999精品网| 国产精品爽爽久久久久久蜜臀 | 国产伦精品一区二区三区四区视频 | 国产精品久久精品国产 | 久久免费av | 99精品免费观看 | 日韩精品一卡 | 一二三久久久 | 999成人国产 | 国产99色| 不卡国产在线 | 国产97视频在线 | 国产精品电影一区二区 | av成人在线网站 | 最近中文字幕在线播放 | 天天爽综合网 | 成人a免费视频 | 欧美嫩草影院 | 欧美日韩免费视频 | 亚洲一二区视频 | 国产精品免费视频网站 | 国产第页 | 在线观看亚洲免费视频 | 国产亚洲va综合人人澡精品 | 国产精品成人一区二区三区吃奶 | 免费观看黄色12片一级视频 | 久久精品一区二区三区视频 | 色婷婷六月天 | 最新日韩中文字幕 | a级国产乱理论片在线观看 特级毛片在线观看 | 波多野结衣在线观看一区二区三区 | 麻豆国产网站 | 伊人色播 | 免费看的黄色 | 久久成人视屏 | 天堂av免费观看 | 波多野结衣亚洲一区二区 | 胖bbbb搡bbbb擦bbbb| 九九九九热精品免费视频点播观看 | 中文 一区二区 | av大全免费在线观看 | 人人盈棋牌| 97超碰国产精品女人人人爽 | 婷婷丁香激情 | 亚洲伊人色 | 国产视频在线观看一区 | 免费在线播放av电影 | 中文字幕高清免费日韩视频在线 | 黄在线免费看 | 亚洲国产日韩av | av中文字幕在线观看网站 | 麻豆久久久久 | 欧美狠狠色 | 九九久久影视 | 久久超碰97| 久草a在线 | 日韩欧美国产免费播放 | 夜夜操夜夜干 | 99久久99久久综合 | 成人在线免费小视频 | 天天爱天天射天天干天天 | 亚洲尺码电影av久久 | 久久国产亚洲 | 欧美日韩中文在线视频 | 日韩深夜在线观看 | 欧美日韩国产色综合一二三四 | 香蕉影视 | 97精品超碰一区二区三区 | 免费无遮挡动漫网站 | 一区二精品| 日韩中文字幕免费看 | 国产一级二级在线播放 | 日日夜夜精品免费观看 | 精品久久国产精品 | 精品国产电影 | 人人爽人人爽 | 久久久精华网 | 精品国产精品一区二区夜夜嗨 | 久久久久国产一区二区三区四区 | 九九视频在线观看视频6 | 婷五月激情 | 97av影院 | 久久久久久久久久久网站 | 久久精品一区二区三区中文字幕 | 91免费版成人 | 国产精品黄色在线观看 | 国产精品成人一区 | 午夜性盈盈 | 91麻豆看国产在线紧急地址 | 免费高清影视 | 视频91 | 国产在线精品一区二区三区 | 中文字幕一区二区三区久久 | av中文字幕网站 | 亚洲精品国产精品国自 | 超碰在线免费福利 | 在线观看岛国 | 97超碰网 | 久久99热这里只有精品 | 蜜臀av网址 | 精品少妇一区二区三区在线 | 狠狠狠色丁香婷婷综合久久五月 | 日韩午夜精品福利 | 久久久久久久久久久国产精品 | 在线观看视频h | 免费在线色| 五月婷婷开心 | 黄色动态图xx | 国产日产精品一区二区三区四区的观看方式 | 国产精品mm | 韩国一区二区av | 色妞色视频一区二区三区四区 | 五月天色丁香 | www国产亚洲| 精品成人久久 | 国产精品一区电影 | 一区二区三区四区影院 | av专区在线| 亚洲永久免费av | 天天做日日做天天爽视频免费 | 国产精品美女久久久免费 | 日本中文字幕电影在线免费观看 | 天天爱天天干天天爽 | a级国产乱理论片在线观看 特级毛片在线观看 | 久久婷婷影视 | 99久久精品日本一区二区免费 | 亚洲成熟女人毛片在线 | 国产精品1区2区在线观看 | 国产一区二区在线精品 | 国产福利精品视频 | 天天操天天舔天天爽 | 91九色视频观看 | 91av在线国产 | 国产中文欧美日韩在线 | 国产成人久久77777精品 | 欧美日韩a视频 | 国产夫妻性生活自拍 | 又黄又爽免费视频 | 黄色国产高清 | 国产色爽 | 超碰精品在线 | 国产专区在线 | 色com| 色久网 | 97超碰在线播放 | 91成人精品一区在线播放69 | 一区二区精品视频 | 久久久国产精品视频 | 久久天堂亚洲 | 国产丝袜网站 | 毛片基地黄久久久久久天堂 | 五月婷婷视频 | 欧美一区二区在线 | 在线视频精品播放 | 色视频在线免费 | 欧美视频在线观看免费网址 | 久久精品视频播放 | 在线看v片成人 | 色狠狠一区二区 | 2021国产在线视频 | 精品在线观看一区二区三区 | 久久久.com| 亚洲第一av在线 | 人人草天天草 | 欧美一级电影免费观看 | 黄色av电影在线 | 99r国产精品 | 国产精品自在线拍国产 | 国产中文字幕91 | 亚州国产精品视频 | 四虎www.| 在线观看视频一区二区三区 | 久久久久久久久久久免费视频 | 精品欧美一区二区精品久久 | 夜色资源站国产www在线视频 | 五月婷婷中文字幕 | 亚洲涩综合 | 毛片无卡免费无播放器 | 亚洲高清免费在线 | 成人av在线直播 | 一区二区三区三区在线 | 日本一区二区免费在线观看 | 81国产精品久久久久久久久久 | 精品久久久久久久久久久久 | 日韩午夜小视频 | 成人免费共享视频 | 91精选 | 国产精品18久久久久久首页狼 | 成人在线播放av | 国产日产在线观看 | 国产美女黄网站免费 | 国产精品久久一区二区三区不卡 | 免费v片 | 91九色国产在线 | 在线岛国av | 992tv在线| 亚洲日本激情 | av一区二区三区在线观看 | 2023亚洲精品国偷拍自产在线 | 国产偷国产偷亚洲清高 | 最新中文字幕视频 | 91最新国产 | 97电院网手机版 | 久久无码精品一区二区三区 | 色网站国产精品 | 婷婷久草 | 亚洲精品国精品久久99热一 | 天天鲁天天干天天射 | 国产福利一区二区三区视频 | 国产拍揄自揄精品视频麻豆 | 亚洲传媒在线 | 色视频在线 | 国产精品久久免费看 | 成人午夜黄色影院 | 国产黄在线播放 | 久久只精品99品免费久23小说 | 亚洲精品国产精品国自产观看 | 日韩精品免费在线观看 | 就要色综合 | 97色婷婷成人综合在线观看 | 国产成人精品综合久久久久99 |