WinForms 視窗程式設計(Windows Forms)

基本範例
呼叫另一個視窗
關閉一個視窗
結束視窗應用程式
位置與大小
外觀
顏色
字型
常用事件
視覺化開發環境
LabelTextBoxCheckBoxComboBoxRadioButtonPictureBox
系統匣


基本範例


frame.cs


launch.cs


插圖 插圖


補充

frame.cs 的事件,可以用 lambda 運算式將程式碼寫在一起:


在不支援這語法的的老舊程式碼,你會看到用 delegate 來實現:


呼叫另一個視窗

用 new 產生新的視窗,然後呼叫其 Show() 方法。


關閉一個視窗

對視窗呼叫 Close() 方法。


結束視窗應用程式

使用 System.Windows.Forms.Application 的 Exit() 方法結束視窗應用程式。


位置與大小

除了用 Left、Top、Width、Height 設定座標和長寬,也可以用 System.Drawing 命名空間裡的類別減少程式行數:

控制項.Location = new Point(水平座標, 垂直座標);
控制項.Size = new Size(寬度, 長度);
控制項.Bounds = new Rectangle(水平座標, 垂直座標, 寬度, 長度);

對視窗呼叫 CenterToScreen() 方法可以置中。


外觀


視覺化樣式

Windows Forms 的控制項使用傳統 Windows 95 樣式,跟 Windows 10 作業系統的控制項樣式不搭調。可使用 System.Windows.Forms.Application 的 EnableVisualStyles(),將所有控制項改為更現代化的樣式。


按鈕框線

可將按鈕的 FlatStyle 屬性,設為以下列舉值:

FlatStyle.Flat扁平。
FlatStyle.Popup扁平,但滑鼠游標移到上面時變立體。
FlatStyle.Standard立體。
FlatStyle.System由作業系統決定。

可藉由 FlatAppearance 屬性,來獲得更多框線樣式的屬性,做更細節的設定:

BorderColor框線顏色。
BorderSize框線粗細。
CheckedBackColor核選方塊背景顏色。
MouseDownBackColor按下時的背景顏色。
MouseOverBackColor滑鼠移到上面的背景顏色。

像這樣:


其它控制項的框線

可將控制項的 BorderStyle 屬性,設為以下列舉值:

BorderStyle.Fixed3D立體。
BorderStyle.FixedSingle線條。
BorderStyle.None無框線。

框線顏色和粗細沒辦法修改,只能設為無框線,然後自己在 Graphics 用 DrawRectangle() 畫在控制項上:


顏色

控制項的 ForeColorBackColor 屬性表示前景顏色和背景顏色,可透過 System.Drawing.Color 的 FromArgb(red, green, blue) 方法指定顏色,或設定為 System.Drawing.Color 的屬性:

AliceBlue
AntiqueWhite
Aqua
Aquamarine
Azure
Beige
Bisque
Black
BlanchedAlmond
Blue
BlueViolet
Brown
BurlyWood
CadetBlue
Chartreuse
Chocolate
Coral
CornflowerBlue
Cornsilk
Crimson
Cyan
DarkBlue
DarkCyan
DarkGoldenrod
DarkGray
DarkGreen
DarkKhaki
DarkMagenta
DarkOliveGreen
DarkOrange
DarkOrchid
DarkRed
DarkSalmon
DarkSeaGreen
DarkSlateBlue
DarkSlateGray
DarkTurquoise
DarkViolet
DeepPink
DeepSkyBlue
DimGray
DodgerBlue
Firebrick
FloralWhite
ForestGreen
Fuchsia
Gainsboro
GhostWhite
Gold
Goldenrod
Gray
Green
GreenYellow
Honeydew
HotPink
IndianRed
Indigo
Ivory
Khaki
Lavender
LavenderBlush
LawnGreen
LemonChiffon
LightBlue
LightCoral
LightCyan
LightGoldenrodYellow
LightGray
LightGreen
LightPink
LightSalmon
LightSeaGreen
LightSkyBlue
LightSlateGray
LightSteelBlue
LightYellow
Lime
LimeGreen
Linen
Magenta
Maroon
MediumAquamarine
MediumBlue
MediumOrchid
MediumPurple
MediumSeaGreen
MediumSlateBlue
MediumSpringGreen
MediumTurquoise
MediumVioletRed
MidnightBlue
MintCream
MistyRose
Moccasin
NavajoWhite
Navy
OldLace
Olive
OliveDrab
Orange
OrangeRed
Orchid
PaleGoldenrod
PaleGreen
PaleTurquoise
PaleVioletRed
PapayaWhip
PeachPuff
Peru
Pink
Plum
PowderBlue
Purple
Red
RosyBrown
RoyalBlue
SaddleBrown
Salmon
SandyBrown
SeaGreen
SeaShell
Sienna
Silver
SkyBlue
SlateBlue
SlateGray
Snow
SpringGreen
SteelBlue
Tan
Teal
Thistle
Tomato
Turquoise
Violet
Wheat
White
WhiteSmoke
Yellow
YellowGreen

字型

控制項的 Font 屬性表示文字樣式,可使用 System.Drawing.Font 建構函式產生文字樣式:

Font(string familyName, float emSize)
Font(string familyName, float emSize, System.Drawing.FontStyle style)

其中 FontStyle 列舉值有:

Bold粗體
Italic斜體
Regular標準
Strikeout刪除線
Underline底線

常用事件


Component 類別的事件

Disposed += EventHandler(object sender, EventArgs e);


Control 類別的事件

AutoSizeChanged += EventHandler(object sender, EventArgs e);

BackColorChanged += EventHandler(object sender, EventArgs e);

BackgroundImageChanged += EventHandler(object sender, EventArgs e);

BackgroundImageLayoutChanged += EventHandler(object sender, EventArgs e);

BindingContextChanged += EventHandler(object sender, EventArgs e);

CausesValidationChanged += EventHandler(object sender, EventArgs e);

ChangeUICues += UICuesEventHandler(object sender, UICuesEventArgs e);

Click += EventHandler(object sender, EventArgs e);

ClientSizeChanged += EventHandler(object sender, EventArgs e);

ContextMenuChanged += EventHandler(object sender, EventArgs e);

ContextMenuStripChanged += EventHandler(object sender, EventArgs e);

ControlAdded += ControlEventHandler(object sender, ControlEventArgs e);

ControlRemoved += ControlEventHandler(object sender, ControlEventArgs e);

CursorChanged += EventHandler(object sender, EventArgs e);

DockChanged += EventHandler(object sender, EventArgs e);

DoubleClick += EventHandler(object sender, EventArgs e);

DpiChangedAfterParent += EventHandler(object sender, EventArgs e);

DpiChangedBeforeParent += EventHandler(object sender, EventArgs e);

DragDrop += DragEventHandler(object sender, DragEventArgs e);

DragEnter += DragEventHandler(object sender, DragEventArgs e);

DragLeave += EventHandler(object sender, EventArgs e);

DragOver += DragEventHandler(object sender, DragEventArgs e);

EnabledChanged += EventHandler(object sender, EventArgs e);

Enter += EventHandler(object sender, EventArgs e);

FontChanged += EventHandler(object sender, EventArgs e);

ForeColorChanged += EventHandler(object sender, EventArgs e);

GiveFeedback += GiveFeedbackEventHandler(object sender, GiveFeedbackEventArgs e);

GotFocus += EventHandler(object sender, EventArgs e);

HandleCreated += EventHandler(object sender, EventArgs e);

HandleDestroyed += EventHandler(object sender, EventArgs e);

HelpRequested += HelpEventHandler(object sender, HelpEventArgs hlpevent);

ImeModeChanged += EventHandler(object sender, EventArgs e);

Invalidated += InvalidateEventHandler(object sender, InvalidateEventArgs e);

KeyDown += KeyEventHandler(object sender, KeyEventArgs e);

KeyPress += KeyPressEventHandler(object sender, KeyPressEventArgs e);

KeyUp += KeyEventHandler(object sender, KeyEventArgs e);

Layout += LayoutEventHandler(object sender, LayoutEventArgs e);

Leave += EventHandler(object sender, EventArgs e);

LocationChanged += EventHandler(object sender, EventArgs e);

LostFocus += EventHandler(object sender, EventArgs e);

MarginChanged += EventHandler(object sender, EventArgs e);

MouseCaptureChanged += EventHandler(object sender, EventArgs e);

MouseClick += MouseEventHandler(object sender, MouseEventArgs e);

MouseDoubleClick += MouseEventHandler(object sender, MouseEventArgs e);

MouseDown += MouseEventHandler(object sender, MouseEventArgs e);

MouseEnter += EventHandler(object sender, EventArgs e);

MouseHover += EventHandler(object sender, EventArgs e);

MouseLeave += EventHandler(object sender, EventArgs e);

MouseMove += MouseEventHandler(object sender, MouseEventArgs e);

MouseUp += MouseEventHandler(object sender, MouseEventArgs e);

MouseWheel += MouseEventHandler(object sender, MouseEventArgs e);

Move += EventHandler(object sender, EventArgs e);

PaddingChanged += EventHandler(object sender, EventArgs e);

Paint += PaintEventHandler(object sender, PaintEventArgs e);

ParentChanged += EventHandler(object sender, EventArgs e);

PreviewKeyDown += PreviewKeyDownEventHandler(object sender, PreviewKeyDownEventArgs e);

QueryAccessibilityHelp += QueryAccessibilityHelpEventHandler(object sender, QueryAccessibilityHelpEventArgs e);

QueryContinueDrag += QueryContinueDragEventHandler(object sender, QueryContinueDragEventArgs e);

RegionChanged += EventHandler(object sender, EventArgs e);

Resize += EventHandler(object sender, EventArgs e);

RightToLeftChanged += EventHandler(object sender, EventArgs e);

SizeChanged += EventHandler(object sender, EventArgs e);

StyleChanged += EventHandler(object sender, EventArgs e);

SystemColorsChanged += EventHandler(object sender, EventArgs e);

TabIndexChanged += EventHandler(object sender, EventArgs e);

TabStopChanged += EventHandler(object sender, EventArgs e);

TextChanged += EventHandler(object sender, EventArgs e);

Validated += EventHandler(object sender, EventArgs e);

Validating += CancelEventHandler(object sender, CancelEventArgs e);

VisibleChanged += EventHandler(object sender, EventArgs e);


Lable 類別的事件

TextAlignChanged += EventHandler(object sender, EventArgs e);


ProgressBar 類別的事件

RightToLeftLayoutChanged += EventHandler(object sender, EventArgs e);


ScrollBar 類別的事件

Scroll += ScrollEventHandler(object sender, ScrollEventArgs e);

ValueChanged += EventHandler(object sender, EventArgs e);


Splitter 類別的事件

SplitterMoved += SplitterEventHandler(object sender, SplitterEventArgs e);

SplitterMoving += SplitterEventHandler(object sender, SplitterEventArgs e);


StatusBar 類別的事件

DrawItem += StatusBarDrawItemEventHandler(object sender, StatusBarDrawItemEventArgs e);

PanelClick += StatusBarPanelClickEventHandler(object sender, StatusBarPanelClickEventArgs e);


Window 類別的事件

Activated += EventHandler(object sender, EventArgs e);

Closed += EventHandler(object sender, EventArgs e);

Closing += CancelEventHandler(object sender, CancelEventArgs e);

ContentRendered += EventHandler(object sender, EventArgs e);

Deactivated += EventHandler(object sender, EventArgs e);

SourceInitialized += EventHandler(object sender, EventArgs e);

StateChanged += EventHandler(object sender, EventArgs e);


EventHandler 是 System 命名空間,CancelEventHandler 是 System.ComponentModel 命名空間,剩下的是 System.Windows.Forms 命名空間。

由於參數型式都是固定的 (sender, e),所以使用 lambda 來設計事件的話,就不用管什麼 XxxHandler 和 XxxArgs,只需要知道 += 前面有哪些事件可用就好~


視覺化開發環境

除了自己手敲程式碼,還可以用視覺化開發環境,用滑鼠拉一堆控制項出來就好。

Microsoft 免費釋出的 Visual Studio Community 就有這樣的開發環境:

http://visualstudio.microsoft.com/zh-hant/vs/community/

不過這是 15GB 的龐然大物,而且電腦配備要夠好才跑得動,所以我覺得檔案大小才 47MB 的 SharpDevelop 也是不錯選擇:

http://sourceforge.net/projects/sharpdevelop/files/SharpDevelop%205.x/5.1/

插圖

只要建立 Windows Application 的 Solution,就能在範本為 Form 的程式碼,看到底下有個 Design 頁籤,切換到視覺化介面。再按左邊工具箱的 Tools 頁籤,就有各式控制項可以拉到視覺化視窗上。

即使打算手敲程式碼,準備這款 SharpDevelop 在手邊也是不錯的「活範例」!先用視覺化環境拉出想要的視窗設計,再看原始碼,就知道怎樣寫出想要的功能了~


Label


對齊

TextAlign 屬性指定為如下列舉值:

ContentAlignment.BottomCenter
ContentAlignment.BottomLeft
ContentAlignment.BottomRight
ContentAlignment.MiddleCenter
ContentAlignment.MiddleLeft
ContentAlignment.MiddleRight
ContentAlignment.TopCenter
ContentAlignment.TopLeft
ContentAlignment.TopRight


文字與邊界間距

Padding 屬性,設定為 new Padding(間距值),或 new Padding(左, 上, 右, 下)


TextBox


多行文字

Multiline 屬性設定為 true。

雖然都能做為多行文字的輸入控制項,但 TextBox 是純文字,RichTextBox 是樣式文字,不但能設定個別文字的顏色和字型,還能用 SaveFile() 將內容儲存成檔案。


置中對齊

TextAlign 屬性指定為 HorizontalAlignment.Center


沒有作用的文字與邊界間距

雖然 TextBox 有 Padding 屬性,但根據 Microsoft Docs 的說明,這個屬性對它沒有作用:This property is not relevant for this class,所以無法設定文字與邊框的間距。


偵測 Enter 鍵

控制項.KeyDown += (sender, e) =>
{
 if(e.KeyCode == Keys.Enter)  {
  //do something
 }
};

輸入完直接按 Enter 就能執行程式,不必為此設計一個 Button 物件。


CheckBox

使用 Checked 屬性判斷是否勾選。


ComboBox

使用 Items.Add() 加入項目,也可用 Items.Remove(項目)Items.RemoveAt(索引值) 移除項目。

SelectedText 屬性取得選擇項目的文字,用 SelectedIndex 屬性取得被選擇的項目是第幾個。

觸發選擇項目事件使用 SelectionChangeCommitted,這時要改用 SelectedItem 屬性取得選擇的項目內容。


RadioButton

你不需要做什麼,RadioButton 會自動清除其它 RadioButton 的圈選狀態。

需要多組圈選的話,使用 GroupBox 控制項來分組!用 Controls.Add() 來加入圈選按鈕,將 AutoSize 設為 true 會自動調整大小。

GroupBox 只負責分組,不提供被圈選 RadioButton 是哪個的功能。嚴格來說,這需求應該用下拉式方塊 ComboBox,而不是圈選按鈕。


PictureBox


圖片

Image 屬性使用 Image.FromFile("圖檔");


尺寸

SizeMode 屬性指定為如下列舉值:

PictureBoxSizeMode.AutoSize
PictureBoxSizeMode.CenterImage
PictureBoxSizeMode.Normal
PictureBoxSizeMode.StretchImage
PictureBoxSizeMode.Zoom


系統匣

使用本節範例需自備 ICO 圖示檔。


將視窗縮到系統匣

frame.cs

launch.cs


只有系統匣的應用程式