六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

使用C#編寫Windows Forms應用程序(轉)

[摘要]作為一個Windows開發者, 你應毫不猶豫成為Microsoft新的.NET的倡導者。在規范的客戶端應用程序成為流行的同時,越來越多的組織正趨向于簡單的,基于瀏覽器的可以通過網絡交互(通常是Internet)的應用程序。這就意味著編程正在從獨立的應用程序模式向更豐富的面向組件的模塊化應用程序轉變...
作為一個Windows開發者, 你應毫不猶豫成為Microsoft新的.NET的倡導者。在規范的客戶端應用程序成為流行的同時,越來越多的組織正趨向于簡單的,基于瀏覽器的可以通過網絡交互(通常是Internet)的應用程序。這就意味著編程正在從獨立的應用程序模式向更豐富的面向組件的模塊化應用程序轉變。

  .NET平臺正是為推動這一運動——特別是被稱為Windows Forms的.NET用戶界面模型。.NET使用了Windows Forms來編寫一個應用程序的用戶界面。你可以使用C#或Visual Basic.NET來創建這些特性。在這里我將向你展示C#為.NET平臺創建基于Windows Forms用戶方面的作用。這里的例程就是一個用C#寫的基于Windows Forms的tic-tac-toe游戲。

  每過幾年,Windows的編程方式就會發生巨大的變化。去年夏天的Microsoft Professional Developers Conference (PDC)把Windows的開發者領回到了square one。而在幾年前,平臺才剛剛從DOS轉變為Windows。現在,開發者已經解決了桌面上的問題。新的方向是開發Internet 框架來讓愈來愈多的公司能搬到Web上。

  在八十年代末,Windows開發者使用C和SDK寫了大量的桌面應用程序,然后就是C++和框架,如Microsoft Foundation Class Library(MFC)。與此同時,VB開發領域也得到了堅實的立足點。在擁有強大優勢諸如強大的開發環境和可管理開發者資源的runtime的面前,VB正逐步走向成熟,成為許多企業開發前端和中間層組件的得力工具。對于大多數其他應用程序,開發者都可以使用Windows Forms來創建用戶界面。

  讓我們先總體看一下Windows Forms,然后再看一下使用C#來寫基于Windows Forms的應用程序需要些什么。在外殼下,所有的Windows應用程序都是以同樣的方式運行的。Windows會維護Windows類的集合(即windows的行為都是在WndProc()函數中定義的)。在Windows編程的早期,最大的任務就是寫大約80行的樣板代碼為了能讓它正確的運行,后來逐漸通過添加事件句炳來開發應用程序。MFC就使得開發者不用再去為Winmain()和WndProc()費神了。Windows Forms繼承了這種忽略編程細節的趨勢,所以你不必花大量的時間在書寫那些枯燥的代碼上。

  隨著基于SDK和MFC的發展,你可能仍然保留作為開發者對Windows API的鐘愛。如果你需要嚴格的控制你的應用程序,使用C和SDK——或甚至是MFC來開發應用程序是必要的。如果你希望有靈活性,基于SDK或MFC的開發仍然是需要的。但是如果你覺得一個更簡單,更直觀的開發環境比嚴格控制或靈活性更重要的話,使用Windows Forms來開發基于窗體的用程序可能更適合你。

  編寫客戶代碼

  >有了Windows Forms,你就可以編寫.NET平臺的客戶代碼。如果你曾使用過VB,你就可能對它基于窗體的應用程序模型很熟悉。而Windows Forms與此很相似。SDK或MFC的編程風格是直接與Windows API交互的,甚至當MFC中出現了框架,你仍僅僅是從底層的Windows API邁出了一小步。與此相反,Windows Forms隱藏了舊式Windows編程風格中的樣板代碼的細節,以帶有菜單和標題欄的正規窗體的形式顯示。Windows Forms能響應標準的事件,如鼠標的移動和菜單的選擇,而且它們也可以控制在客戶區的行為。然而,管理這些特性的語法比你用SDK或MFC編寫程序的語法要抽象的多。

  你可以以標準的窗口、多文檔界面(MDI)、對話框或繪圖程序表面的形式顯示Windows Forms。隨著VB的發展,它使用了用戶界面(UI)發展中的窗體模型,即給一個Windows 窗體定義用戶界面,通常就是意味著能在窗體的客戶區安放控件。但是Windows Forms還可以更好的渲染你所希望的繪圖表面。

  除了能渲染繪圖表面和管理標準控件集,Windows Forms通過屬性來定義它們的外觀。例如,要想編程在屏幕上移動一下Windows窗體,你只要設置Windows 窗體的X屬性。Windows Forms使用方法來管理它們的行為,而且它們也可以通過響應事件來定義與用戶的交互。

  Windows Forms是在.NET Framework或Common Language Runtime(CLR)中運行的類的實例。編寫一個Windows Forms應用程序通常就是實例化WinForm類的一個實例,配置它的屬性并建立事件句柄。因為一個Windows 窗體就是一個標準的基于CLR的類,是完全支持繼承的,你可以以標準的,面向對象的方式來建立基于Windows Forms的類之間的繼承關系。

  現在,讓我們看一下開發環境。Microsoft的Visual Studio.NET不斷在進步。不幸的是,IDE的PDC Tech Preview版本不是很穩定。所以我用C#開發的開發環境中包含一個文本編輯器和一個命令行編譯器。Beta 1解決了很多方面,使VS.NET成為開發C#應用程序的可行環境。

  但是如果你不喜歡使用VS.NET的beta版,那你也可以回到命令行的方式。C#的命令行編譯器名為CSC.EXE。當運行它時,它通過命令行決定輸出的位置、需要的資源文件、應用程序要使用的系統文件和最后可執行文件中要包含的C#文件。例如,以下命令行編譯了一個名為someApp.cs的文件,引入了System.DLL的多種系統功能,在資源中包含了一個JPG文件,并且把最終的可執行文件放到名為in的目錄下:

  csc /out:in /R:System.DLL /res:XYZ.JPG someApp.cs

  我們再一次回到了1989年你用命令行編譯器通過一些批處理文件或makfiles來創建一個Windows應用程序的時候。在開發tic-tac-toe例程時,我也在一個簡單的批處理文件中使用了命令行編譯器。

  現在,你可以通過C#和VB來使用Windows Forms。這兩種語言在建立基于Windows Forms的應用程序方面是等同的。你可以使用它來創建大量當今需要的編程構架——特別是當開發基于Windows Forms的應用程序。

  開始開發 Tic-Tac-Toe

  那么,基于Windows Forms的應用程序是什么樣的呢?看一下tic-tac-toe例程吧。一個C#基于Windows Forms的應用程序一開始通過一系列using聲明先引入必要的定義(程序需要的類型定義)。

  namespace CSharpTicTacToe {

   using System;

   using System.Drawing;

   using System.Drawing.Drawing2D;

   using System.WinForms;

   // Windows Form code goes here?

  };

  第一個namespace關鍵字是可選的。但是對于設定功能的作用范圍通常是很有用的——特別是在assembly過程中,一種編寫DLL的新方式。在關鍵字之后,每一個using聲明告訴C#編譯器,程序所要用到的系統功能。因為tic-tac-toe游戲是一個Windows 窗體,源文件使用了System的WinForms namespace。而且,因為游戲使用了圖形,源代碼就要引入URT的繪圖功能。

  在你引用了namespace后,你就要通過從系統提供的Form類繼承一個類來表示一個Windows 窗體。

  public class CSharpTicTacToe : Form {

   // Windows Form code goes here, including

   // data members, a constructor, and

   // some event handlers?

  }

  C#提倡枚舉作為定義變量類型的一種方式,而不是指定一個整數范圍,這樣能維護類型的安全性并能提供盡可能多的信息。Tic-tac-toe游戲指定了三種枚舉類型:player類型、用于在板上做標記的類型和對板上位置命名的類型。以下就是具體的描述。你可以在游戲的多個地方看到它們的用途。

  public enum Player {

   XPlayer,

   OPlayer

  }

  public enum Mark

  {

   XMark,

   OMark,

   Blank

  }

  public enum Positions

   TopLeft,

   TopCenter,

   TopRight,

   MiddleLeft,

   MiddleCenter,

   MiddleRight,

   BottomLeft,

   BottomCenter,

   BottomRight,

   Unknown

  }

  一旦你定義了窗體,就需要一些數據成員,一個構造函數和一些事件句柄。我會依次向你

  闡釋。首先是基本的數據成員,一個tic-tac-toe板。Tic-tac-toe游戲的數據包含了一個表示游戲板的3*3的矩陣數組。這個游戲定義了一塊板的格子(見清單1)。每一個板的格子都表示在屏幕上的一個位置并確定玩家是否做了標記。此外,格子還使用了一個X和一個O,來決定哪個玩家做了標記。我還會細致的說明的。

  Tic-tac-toe板管理了3*3的格子(見清單2)。它也管理著BoardSpace對象3*3的數組,并用線條來劃分tic-tac-toe的格子并讓每一個格子來繪制它們自己。大部分的游戲邏輯都是由板來負責的,所以制作這個游戲的最主要的部分就是建立一個窗體,把板作為數據成員,并且當鼠標按下時請求板的繪制(見清單 3)。清單3包含了Windows Forms應用程序的初始化代碼。注意這個過程就是初始化游戲板,創建一個Reset按鈕和其事件句柄,然后截獲MouseDown和Paint事件。

  大部分的時間,響應事件就是重載(override)正確的函數。例如,游戲要響應MouseDown事件(通過把鼠標的位置交給板來處理)和Paint事件。當它生成了事件,系統就會自動的調用。你還可以為非系統的、用戶定義的事件如按鈕被按下而手工關聯事件句柄。該游戲也可以創建一個Reset按鈕來處理清除游戲板的事件。

  Windows Forms編程最基本的就是基于用戶界面,請求你來繪制屏幕的過程。Windows Forms定義了一個捕獲WM_PAINT消息的良好方法。Form類包含了一個名為OnPaint()的函數來讓你重載。通過重載這一方法,你可以捕獲繪圖事件并在屏幕上做你想做的。看一下例程的源代碼,你會注意到Paint事件的參數包括一個Graphics對象,它類似于SDK編程時的一個設備上下文。Graphics對象包括了畫線和圖形、填充區域以及任何你想在屏幕上做的。

  Tic-tac-toe游戲通過讓游戲板自繪來響應Paint事件。如果你在例程中看一下TicTacToeBoard類和BoardSpace類,你就會發現每一個類都有一個Render()函數來使用Graphics對象的DrawLine()和DrawEllipse()方法在屏幕上繪圖。Windows Forms和C#的強大地方就在于你不必考慮管理GDI類型的資源,因為.NET Framework為你做了。

  Windows Forms也提供給你很多的可行性,包括在Windows 窗體上添加菜單和圖標,顯示對話框和捕獲Paint和MouseDown事件以外的大量事件。

  清單 1
  public struct BoardSpace {
   public BoardSpace(Mark mark,
   int left,
   int top,
   int right,
   int bottom) {
   // Initialize internal state?
   }
   public void SetMark(Player player) {
   // if the space is blank, mark it using
   // the player enumeration
   }
   public void Render(Graphics g) {
   Pen pen =
   new Pen(Color.FromARGB(170, Color.Black), 3);
   switch(m_mark) {
   case Mark.XMark:
   g.DrawLine(pen, m_left, m_top, m_right,
   m_bottom);
   g.DrawLine(pen, m_left, m_bottom, m_right,
   m_top);
   break;
   case Mark.OMark:
   int cx = m_right - m_left;
   int cy = m_bottom - m_top;
   g.DrawEllipse(pen, m_left, m_top, cx, cy);
   break;
   default:
   break;
   }
   }
   public Mark m_mark;
   public int m_top, m_left, m_right, m_bottom;
  };
--------------------------------------------------------------------------------

  清單 2
  public struct TicTacToeBoard {
   BoardSpace[,] m_BoardSpaces;
   public void Initialize() {
   m_BoardSpaces = new BoardSpace[3,3];
   // Initialize each space with a location on the screen and a
   // blank mark.
   // Here's the first space:
   m_BoardSpaces[0, 0] = new BoardSpace(Mark.Blank, 1,
   1, 50, 50);
   // Do the rest like that?
   }
   public void ClearBoard() {
   // loop through the spaces clearing them
   }
   public Player EvaluateGame() {
   // Check adjacent marks and see who won.
   }
   public Positions HitTest(int x, int y, Player player) {
   // Test the incoming Coords and mark the right space
   // using the player enumeration
   }
   public void Render(Graphics g) {
   Pen pen = new Pen(Color.FromARGB(170,
   Color.Black), 5);
   g.DrawLine(pen, 1, 50, 150, 50);
   g.DrawLine(pen, 50, 1, 50, 150);
   g.DrawLine(pen, 1, 100, 150, 100);
   g.DrawLine(pen, 100, 1, 100, 150);
   for(int i = 0; i < 3; i++) {
   for(int j = 0; j < 3; j++) {
   m_BoardSpaces[i, j].Render(g);
   }
   }
   }
  };
--------------------------------------------------------------------------------

  清單 3
  public class CSharpTicTacToe : Form {
   public Player m_Player = Player.XPlayer;
   TicTacToeBoard m_board = new TicTacToeBoard();
   public CSharpTicTacToe() {
   SetStyle(ControlStyles.Opaque, true);
   Size = new Size(500, 500);
   Text = "CSharp Tic Tac Toe";
   m_board.Initialize();
   //Finally add a button so that we can render to a bitmap
   Button buttonRestart = new Button();
   buttonRestart.Size=new Size(100,50);
   buttonRestart.Location=new Point(300,100);
   buttonRestart.Text="Restart";
   buttonRestart.AddOnClick(new EventHandler(Restart));
   this.Controls.Add(buttonRestart);
   }
   //Fired when the restart button is pressed
   private void Restart(object sender, EventArgs e) {
   m_Player = Player.XPlayer;
   m_board.ClearBoard();
   this.Invalidate();
   }
   protected override void OnMouseDown(MouseEventArgs e) {
   base.OnMouseDown(e);
   Positions position = m_board.HitTest(e.X, e.Y, m_Player);
   if(position == Positions.Unknown) {
   return;
   }
   if(m_Player == Player.XPlayer) {
   m_Player = Player.OPlayer;
   } else {
   m_Player = Player.XPlayer;
   }
   this.Invalidate();
   }
   protected override void OnPaint(PaintEventArgs e) {
   Graphics g = e.Graphics;
   e.Graphics.SmoothingMode =
   SmoothingMode.AntiAlias;
   g.FillRectangle(new
   SolidBrush(Color.FromARGB(250,
   Color.White)), ClientRectangle);
   m_board.Render(g);
   }
   public static void Main() {
   Application.Run(new CSharpTicTacToe());
   }
   }
  }



主站蜘蛛池模板: 一二三四免费观看高清观看在线 | 亚洲福利| 天天搞天天干 | 综合玖玖 | 色偷偷亚洲男人天堂 | 午夜精品视频在线观看 | 色综合色狠狠天天久久婷婷基地 | 亚洲欧美日本在线观看 | 日韩欧美精品中文字幕 | 日本不卡免费高清一级视频 | 一二三四免费观看高清观看在线 | 中文字幕在线永久视频 | 日产精品久久久一区二区 | 五月婷婷丁香综合 | 日韩精品免费看 | 一级人做人a爰免费视频 | 亚洲狠狠婷婷综合久久久久图片 | 亚洲欧美日韩三级 | 色玖玖| 日本免费一区二区视频 | 天堂在线最新版资源www | 一区二区精品 | 青青草视频在线观看 | 三级黄色片在线免费观看 | 四虎网址| 三上悠亚久久国产 | 色天使亚洲综合在线观看 | 午夜影视免费完整高清在线观看网站 | 婷婷激情六月 | 午夜视频在线观看免费高清 | 欧美亚洲专区 | 亚洲成人精品在线 | 五月婷婷婷婷 | 亚洲无线乱码高清在线观看一区 | 日本不卡高清免费v日本 | 亚洲欧美日韩精品久久 | 日本道在线视频 | 日韩深夜福利视频 | 午夜视频免费在线播放 | 五月婷婷激情在线 | 日韩中文字幕在线不卡 |