Windows Forms 程式同樣以 Main 為進入點,但啟動流程包含 Application.Run 訊息迴圈、Form1.Designer.cs 自動產生的 UI 初始化代碼。本文透過逐步除錯 (F11) 完整呈現啟動生命週期。
Debug → Step Into (F11)static void Main()[STAThread]
static void Main()
{
Application.EnableVisualStyles(); // 啟用視覺樣式 (XP 後必備)
Application.SetCompatibleTextRenderingDefault(false); // GDI+ 文字繪製
Application.Run(new Form1()); // 進入訊息迴圈,阻塞直到表單關閉
}
new Button()Location、Size、Text、TabIndexbutton1.Click += new EventHandler(button1_Click)Controls.Add(button1)ClientSize、AutoScaleModeInitializeComponent() 完成,建構函數結束GetMessage/DispatchMessage),處理鍵盤/滑鼠/重繪/計時器等訊息using System;
using System.Windows.Forms;
namespace WindowsFormsApp
{
static class Program
{
[STAThread] // 單執行緒單元模式,Windows Forms 必備
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MainForm()); // 你的主表單類別
}
}
}
| 區段 | 用途 | 是否手動修改 |
|---|---|---|
components 欄位 | IContainer 追蹤需 Dispose 的元件 | 否 |
Dispose(bool) | 釋放 components 管理的資源 | 否 |
InitializeComponent() | 建立所有控制項、設定屬性、訂閱事件、加入容器 | 嚴禁手動修改 (設計器專屬) |
| 控制項欄位宣告 | private Button button1; 等 | 否 |
// Form1.cs - 你的業務邏輯在此
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent(); // 呼叫設計器代碼
}
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("你點擊了按鈕 1");
}
private void button2_Click(object sender, EventArgs e)
{
MessageBox.Show("你點擊了按鈕 2");
}
}
Form1.cs (邏輯) + Form1.Designer.cs (UI) = 完整 Form1 類別+= new EventHandler(...),開發者只寫 Handler 方法透過 F11 逐步除錯,可清晰看到 Windows Forms 從 Main → Application.Run → InitializeComponent → 事件迴圈的完整啟動鏈路。理解此流程有助於排查啟動異常、跨執行緒 UI 存取錯誤、資源洩漏等經典問題。開發者專注於 Form1.cs 事件處理代碼,UI 佈局交給設計器,是 WinForms 開發的標準分工。