欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Windows窗體的.Net框架繪圖技術(shù)實(shí)現(xiàn)方法

 更新時(shí)間:2014年08月15日 11:07:40   投稿:shichen2014  
這篇文章主要介紹了Windows窗體的.Net框架繪圖技術(shù)實(shí)現(xiàn)方法,非常實(shí)用,需要的朋友可以參考下

本文實(shí)例講述了Windows窗體的.Net框架繪圖技術(shù)實(shí)現(xiàn)方法,非常實(shí)用,具體內(nèi)容如下:

一般來說,當(dāng)編寫一個(gè)典型的Windows 窗體程序時(shí),窗體和控件的繪制、效果等操作是不需要特別加以考慮的。這是為什么呢?因?yàn)橥ㄟ^使用 .Net 框架,開發(fā)人員可以拖動(dòng)一系列的控件到窗體上,并書寫一些簡(jiǎn)單的與事件相關(guān)聯(lián)的代碼然后在IDE中按F5,一個(gè)完完全全的窗體程序就誕生了!所有控件都將自己繪制自己,窗體或者控件的大小和縮放都調(diào)整自如。在這里經(jīng)常會(huì)用到的,且需要引起一點(diǎn)注意的就是控件效果。游戲,自定義圖表控件以及屏幕保護(hù)程序的編寫會(huì)需要程序員額外撰寫用于響應(yīng) Paint 事件的代碼。

  本文針對(duì)那些Windows 窗體開發(fā)人員并有助于他們?cè)趹?yīng)用程序編制過程中使用簡(jiǎn)單的繪圖技術(shù)。首先,我們會(huì)討論一些基本的繪圖概念。到底誰在負(fù)責(zé)進(jìn)行繪制操作?Windows 窗體程序是如何知道何時(shí)該進(jìn)行繪制的?那些繪制代碼究竟被放置在哪里?之后,還將介紹圖像繪制的雙重緩沖區(qū)技術(shù),你將會(huì)看到它是怎樣工作的,怎樣通過一個(gè)方法來實(shí)現(xiàn)緩存和實(shí)際顯示的圖像間的交替。最后,我們將會(huì)探討”智能無效區(qū)域”,實(shí)際就是僅僅重繪或者清除應(yīng)用程序窗體上的無效部分,加快程序的顯示和響應(yīng)速度。希望這些概念和技術(shù)能夠引導(dǎo)讀者閱讀完本文,并且有助于更快和更有效的開發(fā)Windows 窗體程序。

  Windows 窗體使用GDI+圖像引擎,在本文中的所有繪圖代碼都會(huì)涉及使用托管的.Net 框架來操縱和使用Windows GDI+圖像引擎。

  盡管本文用于基本的窗體繪圖操作,但是它同樣提供了快速的、有效的且有助于提高程序性能的技術(shù)和方法。所以,在通讀本文之前建議讀者對(duì).Net框架有個(gè)基本的了解,包括Windows 窗體事件處理、簡(jiǎn)單的GDI+對(duì)象譬如Line,Pen和Brush等。熟悉Visual Basic .Net或者C#編程語(yǔ)言。

概念

  Windows 應(yīng)用程序是自己負(fù)責(zé)繪制的,當(dāng)一個(gè)窗體”不干凈”了,也就是說窗體改變了大小,或者部分被其它程序窗體遮蓋,或者從最小化狀態(tài)恢復(fù)時(shí),程序都會(huì)收到需要繪制的信息。Windows把這種”不干凈”狀態(tài)稱為”無效的(Invalidated)”狀態(tài),我們理解為:需要重繪,當(dāng)Windows 窗體程序需要重繪窗體時(shí)它會(huì)從Windows消息隊(duì)列中獲取繪制的信息。這個(gè)信息經(jīng)過.Net框架封裝然后傳遞到窗體的 PaintBackground 和 Paint 事件中去,在上述事件中適當(dāng)?shù)臅鴮憣iT用于繪制的代碼即可。

  簡(jiǎn)單的繪圖示例如下:

   using System; 
   using System.Drawing; 
   using System.Windows.Forms; 
   public class BasicX : Form 
   { 
   public BasicX() 
   { 
   InitializeComponent(); 
   } 
   private void BasicX_Paint(object sender,  PaintEventArgs e) 
   { 
   Graphics g = e.Graphics; 
   Pen p = new Pen(Color.Red); 
   int width = ClientRectangle.Width; 
   int height= ClientRectangle.Height; 
   g.DrawLine(p, 0,0, width, height); 
   g.DrawLine(p, 0, height, width, 0); 
   p.Dispose(); 
   } 
   private void InitializeComponent() 
   { 
   this.SetStyle(ControlStyles.ResizeRedraw,  true); 
   this.ClientSize = new  System.Drawing.Size(300, 300); 
   this.Text = "BasicX"; 
   this.Paint += new  PaintEventHandler(this.BasicX_Paint); 
   } 
   [System.STAThreadAttribute()] 
   public static void Main() 
   { 
   Application.Run(new BasicX()); 
   } 
   }

  上述代碼分成兩個(gè)基本的步驟來創(chuàng)建示例程序。首先 InitializeComponent 方法包含一些屬性的設(shè)置和附加窗體 Paint 事件的處理過程。注意,在方法中控件的樣式也同時(shí)被設(shè)置,設(shè)置控件的樣式也是自定義Windows 窗體及控件行為的一種有效途徑,譬如:控件的"ResizeRedraw"屬性指示當(dāng)窗體的大小變化發(fā)生以后需要對(duì)其完全進(jìn)行重繪,也就是說重繪時(shí)總是需要對(duì)整個(gè)窗體的客戶區(qū)域進(jìn)行重繪。窗體的“客戶區(qū)域”是指除了標(biāo)題欄和邊框的所有窗體區(qū)域。可以進(jìn)行一個(gè)有趣的試驗(yàn),取消該控件的屬性然后再運(yùn)行程序,我們可以很明顯的看出為什么該屬性會(huì)被經(jīng)常的設(shè)置,因?yàn)榇绑w調(diào)整大小后的無效區(qū)域根本不會(huì)被重繪。

  好了,我們需要注意一下BasicX_Paint方法,正如先前所提到的,Paint 事件在程序需要重繪時(shí)被激活,程序窗體利用Paint事件來負(fù)責(zé)回應(yīng)需要重繪的系統(tǒng)消息,BasicX_Paint方法的調(diào)用需要一個(gè)對(duì)象 sender 和一個(gè)PaintEventArgs類型的變量,PaintEventArgs類的實(shí)例或稱之為變量 e 封裝了兩個(gè)重要的數(shù)據(jù),第一個(gè)就是窗體的 Graphics 對(duì)象,該對(duì)象表示窗體可繪制的表面也稱之為畫布用于繪制諸如線、文本以及圖像等,第二個(gè)數(shù)據(jù)就是ClipRectangle,該Rectangle對(duì)象表示窗體上無效的的矩形范圍,或者說就是窗體需要重繪的區(qū)域。記住,當(dāng)窗體的ResizeRedDraw設(shè)置后,調(diào)整大小后該ClipRectangle的大小實(shí)際就等于窗體整個(gè)客戶區(qū)域的大小,或者是被其它程序窗體遮蓋的那部分剪切區(qū)域。關(guān)于部分剪切區(qū)域的用處我們會(huì)在智能重繪章節(jié)作更詳細(xì)的闡述。

雙重緩沖區(qū)繪圖技術(shù)

  雙重緩沖區(qū)技術(shù)能夠使程序的繪圖更加快速和平滑,有效減少繪制時(shí)的圖像閃爍。該技術(shù)的基本原理是先將圖像繪制到內(nèi)存中的一塊畫布上,一旦所有的繪制操作都完成了,再將內(nèi)存中的畫布推到窗體的或者控件的表面將其顯示出來。通過這種操作后的程序能使用戶感覺其更加快速和美觀。

  下面提供的示例程序能夠闡明雙重緩沖區(qū)的概念和實(shí)現(xiàn)方法,這個(gè)示例所包含的功能已相當(dāng)完整,且完全可以在實(shí)際應(yīng)用中使用。在該章節(jié)后面還會(huì)提及該技術(shù)應(yīng)該配合控件的一些屬性設(shè)置才能達(dá)到更好的效果。

  要想領(lǐng)略雙重緩沖區(qū)繪圖技術(shù)所帶來的好處就請(qǐng)運(yùn)行SpiderWeb示例程序吧。程序啟動(dòng)并運(yùn)行后對(duì)窗口大小進(jìn)行調(diào)整,你會(huì)發(fā)現(xiàn)使用這種繪圖算法的效率不高,并且在調(diào)整大小的過程中有大量的閃爍出現(xiàn)。

不具備雙重緩沖區(qū)技術(shù)的SpiderWeb示例程序

  縱觀程序的源碼你會(huì)發(fā)現(xiàn)在程序Paint事件激活后是通過調(diào)用LineDrawRoutine方法來實(shí)現(xiàn)線的繪制的。LineDrawRoutine方法有兩個(gè)參數(shù),第一個(gè)是Graphics對(duì)象是用于繪制線條的地方,第二個(gè)是繪圖工具Pen對(duì)象用來畫線條。代碼相當(dāng)簡(jiǎn)單,一個(gè)循環(huán)語(yǔ)句,LINEFREQ常量等,程序從窗體表面的左下一直劃線到其右上。請(qǐng)注意,程序使用浮點(diǎn)數(shù)來計(jì)算在窗體上的繪制位置,這樣做的好處就是當(dāng)窗體的大小發(fā)生變化時(shí)位置數(shù)據(jù)會(huì)更加精確。

   private void LineDrawRoutine(Graphics g,  Pen p) 
   { 
   float width = ClientRectangle.Width; 
   float height = ClientRectangle.Height; 
   float xDelta = width / LINEFREQ; 
   float yDelta = height / LINEFREQ; 
   for (int i = 0; i < LINEFREQ; i++) 
   { 
   g.DrawLine(p, 0, height - (yDelta * i),  xDelta * i, 0); 
   } 
   }

撰寫很簡(jiǎn)單的用于響應(yīng)Paint事件SpiderWeb_Paint的代碼,正如前面所提到的,Graphics對(duì)象就是從Paint事件參數(shù)PaintEventArgs對(duì)象中提取出來的表示窗體的繪制表面。這個(gè)Graphics對(duì)象連同新創(chuàng)建Pen對(duì)象一起傳遞給LineDrawRoutine方法來畫出蜘蛛網(wǎng)似的線條,使用完Graphics對(duì)象和Pen對(duì)象后釋放其占用的資源,那么整個(gè)繪制操作就完成了。

   private void SpiderWeb_Paint(object sender,  PaintEventArgs e) 
   { 
   Graphics g = e.Graphics; 
   Pen redPen = new Pen(Color.Red); 
   LineDrawRoutine(g, redPen); 
   redPen.Dispose(); 
   g.Dispose(); 
   }

  那么到底作怎么樣的改動(dòng)才能使上面的SpiderWeb程序?qū)崿F(xiàn)簡(jiǎn)單的雙重緩沖區(qū)技術(shù)呢?原理其實(shí)相當(dāng)簡(jiǎn)單,就是將應(yīng)該畫到窗體表面的繪制操作改成先畫到內(nèi)存中的位圖上,LineDrawRoutine向這個(gè)在內(nèi)存中隱藏的畫布執(zhí)行同樣的蜘蛛網(wǎng)繪制操作,等到繪制完畢再通過調(diào)用Graphics.DrawImage方法將隱藏的畫布上內(nèi)容推到窗體表面來顯示出來,最后,再加上一些小的改動(dòng)一個(gè)高性能的繪圖窗體程序就完成了。

請(qǐng)比較下面雙重緩沖區(qū)繪圖事件與前面介紹的簡(jiǎn)單繪圖事件間的區(qū)別:

   private void SpiderWeb_DblBuff_Paint(object  sender, PaintEventArgs e) 
   { 
   Graphics g = e.Graphics; 
   Pen bluePen = new Pen(Color.Blue); 
   Bitmap localBitmap = new  Bitmap(ClientRectangle.Width,ClientRectangle.Height); 
   Graphics bitmapGraphics =  Graphics.FromImage(localBitmap); 
   LineDrawRoutine(bitmapGraphics, bluePen); 
   //把在內(nèi)存里處理的bitmap推向前臺(tái)并顯示 
   g.DrawImage(localBitmap, 0, 0); 
   bitmapGraphics.Dispose(); 
   bluePen.Dispose(); 
   localBitmap.Dispose(); 
   g.Dispose(); 
   }

  上面的示例代碼創(chuàng)建了內(nèi)存位圖對(duì)象,它的大小等于窗體的客戶區(qū)域(就是繪圖表面)的大小,通過調(diào)用Graphics.FromImage將內(nèi)存中位圖的引用傳遞給Graphics對(duì)象,也就是說后面所有對(duì)該Graphics對(duì)象的操作實(shí)際上都是對(duì)內(nèi)存中的位圖進(jìn)行操作的,該操作在C++中等同于將位圖對(duì)象的指針復(fù)制給Graphics對(duì)象,兩個(gè)對(duì)象使用的是同一塊內(nèi)存地址。現(xiàn)在Graphics對(duì)象表示的是屏幕后方的一塊畫布,而它在雙重緩沖區(qū)技術(shù)中起到至關(guān)重要的作用。所有的線條繪制操作都已經(jīng)針對(duì)于內(nèi)存中的位圖對(duì)象,下一步就通過調(diào)用DrawImage方法將該位圖復(fù)制到窗體,蜘蛛網(wǎng)的線條就會(huì)立刻顯示在窗體的繪制表面而且絲毫沒有閃爍出現(xiàn)。

  這一系列的操作完成后還不是特別有效,因?yàn)槲覀兿惹疤岬搅?,控件的樣式也是定義Windows 窗體程序行為的一條途徑,為了更好的實(shí)現(xiàn)雙重緩沖區(qū)必須設(shè)置控件的Opaque屬性,這個(gè)屬性指明窗體是不負(fù)責(zé)在后臺(tái)繪制自己的,換句話說,如果這個(gè)屬性設(shè)置了,那么必須為清除和重繪操作添加相關(guān)的代碼。具備雙重緩沖區(qū)版本的SpiderWeb程序通過以上的設(shè)置在每一次需要重繪時(shí)都表現(xiàn)良好,窗體表面用其自己的背景色進(jìn)行清除,這樣就更加減少了閃爍的出現(xiàn)。

   public SpiderWeb_DblBuff() 
   { 
   SetStyle(ControlStyles.ResizeRedraw |  ControlStyles.Opaque, true); 
   } 
   private void SpiderWeb_DblBuff_Paint(object  sender, PaintEventArgs e) 
   { 
   Bitmap localBitmap = new  Bitmap(ClientRectangle.Width, 
   ClientRectangle.Height); 
   Graphics bitmapGraphics =  Graphics.FromImage(localBitmap); 
   bitmapGraphics.Clear(BackColor); 
   LineDrawRoutine(bitmapGraphics, bluePen); 
   }

  結(jié)果怎么樣?圖像的繪制平滑多了。從內(nèi)存中將蜘蛛網(wǎng)的線條推到前臺(tái)以顯示出來是完全沒有閃爍的,但是我們還是稍微停頓一下,先將內(nèi)存中的位圖修整一下再顯示出來,可以添加一行代碼以便使線條看上去更加平坦。

   bitmapGraphics.SmoothingMode =  SmoothingMode.AntiAlias;

  在將內(nèi)存中的位圖對(duì)象賦給Graphics后通過放置這行代碼,我們?cè)诋嫴忌纤嫷拿恳粋€(gè)線條都使用了反鋸齒,使凹凸不平的線條顯得更加平坦。

  具備雙重緩沖區(qū)技術(shù)的且使用AntiAliasing(反鋸齒)屬性的SpiderWeb_DblBuff示例程序

  完成了簡(jiǎn)單的雙重緩沖區(qū)應(yīng)用后有兩個(gè)問題需要向讀者闡明,.Net中的某些控件例如:Button、PictureBox、Label還有PropertyGrid都已經(jīng)很好的利用了該技術(shù)!這些控件在默認(rèn)狀態(tài)下會(huì)自動(dòng)啟用雙重緩沖區(qū)技術(shù),用戶可以通過對(duì)“DoubleBuffer”屬性的設(shè)置來就可以實(shí)現(xiàn)雙重緩沖區(qū)技術(shù)。所以,用戶若使用PictureBox來繪制蜘蛛網(wǎng)將會(huì)更有效率一些,而且也使程序變得更加簡(jiǎn)單了。

  我們?cè)谶@里討論的雙重緩沖區(qū)技術(shù)既不是完全被優(yōu)化但也沒有什么太大的負(fù)面影響。雙重緩沖區(qū)技術(shù)是減少Windows 窗體繪制時(shí)閃爍的一條重要途徑,但是它也確實(shí)消耗不少內(nèi)存,因?yàn)樗鼘?huì)使用雙倍的內(nèi)存空間:應(yīng)用程序所顯示的圖像和屏幕后方內(nèi)存中的圖像。每次Paint事件被激活時(shí)都會(huì)動(dòng)態(tài)的創(chuàng)建位圖對(duì)象,這種機(jī)制會(huì)相當(dāng)耗費(fèi)內(nèi)存。而自帶雙重緩沖區(qū)技術(shù)的控件在使用DoubleBuffer屬性后執(zhí)行起來的優(yōu)化程度則會(huì)更好一些。

  使用GDI+的DIB(與設(shè)備無關(guān)的位圖)對(duì)象來實(shí)現(xiàn)這種畫面以外的內(nèi)存緩沖,自帶雙重緩沖區(qū)機(jī)制的控件則能好的利用該位圖對(duì)象。DIB是底層Win32的對(duì)象用于高效的屏幕繪制。同樣,值得注意的是GDI+的第一個(gè)版本GDI中僅與硬件加速有關(guān)以及一些簡(jiǎn)單功能可以直接使用,由于這樣的限制,像反鋸齒和半透明等屏幕繪制方法執(zhí)行起來的速度則相當(dāng)慢。盡管雙重緩沖區(qū)機(jī)制消耗了一些內(nèi)存但是它的使用不容置疑的增強(qiáng)了程序的執(zhí)行性能。

智能重繪,在繪制前需要斟酌一下

  “智能無效”(智能重繪)就是在暗示程序員應(yīng)該明白僅應(yīng)對(duì)程序中無效的區(qū)域進(jìn)行重繪,對(duì)Regions對(duì)象所對(duì)應(yīng)的無效區(qū)域進(jìn)行重繪可以提高繪制性能,使用Regions對(duì)象你可以僅排除或繪制控件和窗體的部分區(qū)域已獲得更好的性能。我們現(xiàn)在就開始來看一下BasicClip示例程序,這個(gè)程序使用保存在PaintEventArgs對(duì)象的ClipRectangle對(duì)象,之前我們已經(jīng)提及,無論何時(shí)當(dāng)程序的大小發(fā)生變化時(shí)Paint事件都會(huì)被激活。BasicClip示例程序用紅和藍(lán)兩種顏色填充剪切的矩形區(qū)域,利用不同的速度調(diào)整窗體的大小幾次以后,你會(huì)發(fā)現(xiàn)繪制的矩形區(qū)域其實(shí)就是窗體的無效區(qū)域(包括大于原始窗體大小的區(qū)域部分和縮少了的區(qū)域部分),示例程序的Paint事件代碼如下:

   private void BasicClip_Paint(object sender,  PaintEventArgs e) 
   { 
   Graphics g = e.Graphics; 
   if (currentBrush.Color == Color.Red) 
   currentBrush.Color = Color.Blue; 
   else 
   currentBrush.Color = Color.Red; 
   g.FillRectangle(currentBrush,  e.ClipRectangle); 
   g.Dispose(); 
   }

該示例程序的唯一目的就是演示怎樣僅針對(duì)部分區(qū)域進(jìn)行圖形繪制。

  BasicClip示例程序中的彩色矩形區(qū)域就是表示窗體的下方和右側(cè)的無效區(qū)域。

  Regions是一種被用來定義Windows 窗體或者控件區(qū)域的對(duì)象,調(diào)整窗體大小后所獲得的Regions就是窗體重繪的最小區(qū)域。當(dāng)程序需要進(jìn)行繪制的時(shí)候僅繪制感興趣的特殊區(qū)域,這樣繪制更小的區(qū)域就會(huì)使程序的運(yùn)行速度更快。

  為了更好的演示Regions的用法,請(qǐng)查看TextCliping示例程序。該程序重載了OnPaintBackground和OnPaint方法,直接重載這些方法比偵聽事件更能保證代碼在其它的繪制操作之前被調(diào)用,而且對(duì)于自定義控件的繪制也更加有效。為了清楚起見,示例程序提供了一個(gè)Setup方法,該方法定義了全局的Graphics對(duì)象。

   private void Setup() 
   { 
   GraphicsPath textPath = new GraphicsPath(); 
   textPath.AddString(displayString,  FontFamily.GenericSerif, 
   0, 75, new Point(10, 50), new  StringFormat()); 
   textRegion = new Region(textPath); 
   backgroundBrush = new TextureBrush(new  Bitmap("CoffeeBeanSmall.jpg"), 
   WrapMode.Tile); 
   foregroundBrush = new  SolidBrush(Color.Red); 
   }

  上面的Setup方法首先定義一個(gè)空的GraphicsPath對(duì)象變量textPath,下一步字符串“Windows Forms”的邊界被添加到該路徑中,圍繞這個(gè)輪廓?jiǎng)?chuàng)建Region。這樣,一個(gè)被繪制在窗體表面的以字符串輪廓為區(qū)域的Region就被創(chuàng)建了。最后,Setup方法創(chuàng)建以材質(zhì)刷子為背景和以實(shí)色刷子為前景來繪制窗體。

   protected override void  OnPaintBackground(PaintEventArgs e) 
   { 
   base.OnPaintBackground(e); 
   Graphics bgGraphics = e.Graphics; 
   bgGraphics.SetClip(textRegion,  CombineMode.Exclude); 
   bgGraphics.FillRectangle(backgroundBrush,  e.ClipRectangle); 
   bgGraphics.Dispose(); 
   }

  上面定義的OnPaintBackground方法先立刻調(diào)用基類方法,這能夠保證所有底層繪制的代碼都能夠被執(zhí)行。下一步,從PaintEventArgs中獲得Graphics對(duì)象,再將Graphics對(duì)象的剪切區(qū)域定義為textRegion對(duì)象。通過指定CombineMode.Exclude參數(shù),明確無論在哪里繪制或怎樣繪制Graphics對(duì)象都不繪制textRegion區(qū)域內(nèi)部。

   protected override void  OnPaint(PaintEventArgs e) 
   { 
   base.OnPaint(e); 
   Graphics fgGraphics = e.Graphics; 
   fgGraphics.FillRegion(foregroundBrush, textRegion); 
   fgGraphics.Dispose(); 
   }

  最后,OnPaint事件負(fù)責(zé)精確的繪制出字符串??梢院苋菀椎耐ㄟ^調(diào)用Graphics的FillRegion方法來實(shí)現(xiàn)。通過指定的前景刷子foregroundBrush和textRegion且僅是該區(qū)域被繪制。結(jié)果,Windows 窗體程序在運(yùn)行之前確實(shí)“思考”該怎樣進(jìn)行繪制。

  TextClipping示例程序,通過Region定義的Windows Forms字符串。能夠使程序在繪制時(shí)避開一個(gè)區(qū)域。

  適當(dāng)?shù)慕M合使用區(qū)域和智能重繪你可以編寫出運(yùn)行速度快且不會(huì)引起閃爍的繪制代碼,并且比單獨(dú)使用雙重緩沖區(qū)繪制還要節(jié)省內(nèi)存的消耗。

結(jié)論

  如果你的程序確定要進(jìn)行繪制操作,使用幾種技術(shù)可以增強(qiáng)繪制性能。確保爭(zhēng)取設(shè)置控件屬性以及適當(dāng)?shù)腜aint事件處理是編寫健壯程序的開始。在權(quán)衡好利弊后可以使用雙重緩沖區(qū)技術(shù)產(chǎn)生非常“保護(hù)視力”的結(jié)果。最后,在實(shí)際繪制前進(jìn)行思考到底哪些客戶區(qū)域或Region需要被繪制將非常有益。

  希望通過這篇文章能夠使讀者更好的理解關(guān)于.net框架的繪制技術(shù)及其應(yīng)用。

相關(guān)文章

  • WPF實(shí)現(xiàn)控件拖動(dòng)的示例代碼

    WPF實(shí)現(xiàn)控件拖動(dòng)的示例代碼

    這篇文章主要介紹了WPF實(shí)現(xiàn)控件拖動(dòng)的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • C# 腳本引擎CS-Script的使用

    C# 腳本引擎CS-Script的使用

    這篇文章主要介紹了C#腳本引擎CS-Script的使用,幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-12-12
  • C#多線程用法詳解

    C#多線程用法詳解

    本文詳細(xì)講解了C#多線程用法,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-12-12
  • c#取得控制臺(tái)應(yīng)用程序根目錄

    c#取得控制臺(tái)應(yīng)用程序根目錄

    編寫程序的時(shí)候,經(jīng)常需要用的項(xiàng)目根目錄。現(xiàn)在把方法總結(jié)如下分享給大家
    2014-01-01
  • C# 如何實(shí)現(xiàn)Token

    C# 如何實(shí)現(xiàn)Token

    這篇文章主要介紹了C# 如何實(shí)現(xiàn)Token,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#通過xpath查找xml指定元素的方法

    C#通過xpath查找xml指定元素的方法

    這篇文章主要介紹了C#通過xpath查找xml指定元素的方法,涉及C#操作XML文件的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-04-04
  • unity 如何使用文件流讀取streamingassets下的資源

    unity 如何使用文件流讀取streamingassets下的資源

    這篇文章主要介紹了unity 使用文件流讀取streamingassets下的資源操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • FtpHelper實(shí)現(xiàn)ftp服務(wù)器文件讀寫操作(C#)

    FtpHelper實(shí)現(xiàn)ftp服務(wù)器文件讀寫操作(C#)

    這篇文章主要為大家詳細(xì)介紹了FtpHelper實(shí)現(xiàn)ftp服務(wù)器文件讀寫操作,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-03-03
  • C#實(shí)現(xiàn)分治算法求解股票問題

    C#實(shí)現(xiàn)分治算法求解股票問題

    本文主要介紹了C#實(shí)現(xiàn)分治算法求解股票問題,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C#.NET字符串比較中忽略符號(hào)的方法

    C#.NET字符串比較中忽略符號(hào)的方法

    C#.NET字符串比較中忽略符號(hào)的方法,需要的朋友可以參考一下
    2013-04-04

最新評(píng)論