Windows Form (4): Thiết kế Form

Bài trước: Windows Form (3): Tạo Form đầu tiên

-----
4. Thiết kế Form

Nhắc lại vài nội dung chính đã học được cho tới thời điểm này:

- Tạo được solution

- Tạo và thêm project vào solution

- Viết được hàm Main(), là điểm bắt đầu của chương trình

- Tạo ra được cửa sổ (form) bằng cách viết mã

- Sau khi tạo cửa sổ, bạn đã tạo ra các nút (các điều khiển, control), và gắn nút vào cửa sổ

Bạn đã bao giờ nghe câu “muốn nhanh thì phải từ từ” chưa? Nghe có vẻ vô lý nhưng có lý đấy. Bạn cứ học từng phần, từng phần nhỏ, ghép lại thì sẽ thành một cái lớn. Chứ cứ nóng vội, đi tắt đón đầu thì chỉ rơi vào trạng thái hoang mang, căng thẳng, không thể biết, hiểu và thực hành được cái gì hết, cơ thể sẽ rơi vào trạng thái suy sụp, mất định hướng và bỏ cuộc.

Cứ đọc đi đọc lại nhiều lần, cố gắng hệ thống lại kiến thức để hiểu, rồi thực hành thật nhiều là ổn.

Quay trở lại bài học.

Ở bài học trước, để tạo ra cửa sổ, các nút, bạn phải lập trình rất nhiều, mất nhiều thời gian và khó thực hiện.

Visual Studio và Windows Form có trang bị cho chúng ta một cách làm nhanh hơn, dễ dàng hơn, đó là thiết kế giao diện bằng hình thức kéo-thả, và các thiết lập trực quan.

4.1 Tạo Form bằng công cụ

Để thêm một cửa sổ vào dự án, tại cửa sổ Solution Explorer, chuột phải vào dự án (ví dụ QuanLySach) > chọn Add > chọn New Item > chọn Form (Windows Forms) > đặt tên cho Form ở ô Name (ví dụ MainForm) > bấm nút Add.

Sau khi tạo được MainForm, bạn sẽ thấy Visual Studio tự động thêm các references cần thiết khác, như System.Data, System.Xml. Trong dự án xuất hiện thêm các tập tin MainForm.cs, MainForm.Designer.cs. Bản thiết kế của MainForm xuất hiện ở cửa sổ bên trái, cho phép bạn bắt đầu thiết kế các thành phần cho cửa sổ.

Chúng ta cùng tìm hiểu sơ qua mã nguồn của 2 tập tin: MainForm.cs và MainForm.Designer.cs.

[MainForm.cs]

namespace QuanLySach

{

            public partial class MainForm : Form

            {

                        public MainForm()

                        {

                                    InitializeComponent();

                        }

            }

}

- Phần using có khai báo để sử dụng khá nhiều thư viện lạ, bạn cũng chưa cần biết nó dùng để làm gì? Cứ để nguyên hoặc xóa những thư viện lạ đi, sau này thiếu thì bổ sung sau. Ví dụ, bạn thử xóa các dòng using mà bạn chưa biết, chỉ để lại:

using System;

using System.Drawing;

using System.Windows.Forms;

Dòng mã:

- namespace QuanLySach { }

Từ khóa namespace (không gian tên) được sử dụng để khai báo một phạm vi, trong đó có chứa các thành phần có liên quan với nhau, và để tránh hiện tượng xung đột tên.

- public partial class MainForm : Form { }

Tạo ra lớp mới, có tên là MainForm. Lớp MainForm kế thừa lớp Form, do vậy MainForm sẽ có tất cả các thuộc tính và phương thức mà lớp Form đang có.

Từ khóa partial để thông báo là lớp MainForm sẽ được định nghĩa ở nhiều nơi khác nhau (ở nhiều tập tin khác nhau). Bạn có thể mở tập tin MainForm.Designer.cs để thấy một phần định nghĩa nữa của lớp MainForm.

Kiểu truy cập của lớp MainForm là public, nghĩa là bạn có thể truy cập và sử dụng tới lớp MainForm từ bên trong và bên ngoài tập tin (có thiết lập tham chiếu). 

- public MainForm()

                        {

                                    InitializeComponent();

                        }

Hàm khởi tạo, được tự động gọi và thực thi khi bạn khai báo một đối tượng thuộc lớp MainForm. Khởi chạy một số thành phần cơ bản bằng hàm InitializeComponent().

[MainForm.Designer.cs]

Trong Visual Studio tập tin MainForm.Designer.cs hiển thị ở 2 dạng, dạng đồ họa và dạng mã nguồn. Mặc định thì sẽ hiển thị ở kiểu đồ họa (cho phép bạn thiết kế giao diện), ví dụ MainForm.cs[Design] .Để hiển thị ở dạng mã nguồn, bạn bấm chuột phải vào tập tin ở khung Solution Explorer và chọn View Code.

Dạng mã nguồn của [MainForm.Designer.cs]

namespace QuanLySach

{

            partial class MainForm

            {

            /// <summary>

            /// Required designer variable.

            /// </summary>

            private System.ComponentModel.IContainer components = null;

 

            /// <summary>

            /// Clean up any resources being used.

            /// </summary>

                /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>

            protected override void Dispose(bool disposing)

            {

            if (disposing && (components != null))

            {

                        components.Dispose();

            }

            base.Dispose(disposing);

            }

 

            #region Windows Form Designer generated code

 

            /// <summary>

            /// Required method for Designer support - do not modify

            /// the contents of this method with the code editor.

            /// </summary>

            private void InitializeComponent()

            {

            this.components = new System.ComponentModel.Container();

            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

            this.ClientSize = new System.Drawing.Size(800, 450);

            this.Text = "MainForm";

            }

 

            #endregion

            }

}

Giải thích một số dòng mã ở trên:

- namespace QuanLySach { }

Tên của namespace là QuanLySach, cùng namespace với mã nguồn trong tập tin MainForm.cs.

- partial class MainForm { }

Mã nguồn này là một phần khác (partial) của lớp MainForm đã được định nghĩa ở trong MainForm.cs.

- private System.ComponentModel.IContainer components = null;

Khai báo một biến có tên là components, kiểu truy cập private, thuộc kiểu System.ComponentModel.IContainer. Thành phần thiết kế của Visual Studio sẽ sử dụng biến này để lưu trữ thông tin của các phần tử đồ họa, như button, text box.

- protected override void Dispose(bool disposing)

    {      

            if (disposing && (components != null))

            {

                        components.Dispose();

            }

            base.Dispose(disposing);

    }

Dispose nghĩa là gỡ bỏ. Phương thức Dispose() được sử dụng để giải phóng các tài nguyên mà Form có thể đang sử dụng, như bộ nhớ, con trỏ file. Kiểu truy cập của hàm là protected, không có kiểu trả về (void), đây là một hàm chồng (override) dựa trên hàm cơ sở là Dispose(). 

- #region Windows Form Designer generated code

 

            /// <summary>

            /// Required method for Designer support - do not modify

            /// the contents of this method with the code editor.

            /// </summary>

            private void InitializeComponent()

            {

            // khởi tạo đối tượng container > quản lý vòng đời của các thành phần

            this.components = new System.ComponentModel.Container();

            // tự động điều chỉnh kích thước các phần tử theo kích thước của font

            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

            // thiết lập kích thước của Form

this.ClientSize = new System.Drawing.Size(800, 450);

// tiêu đề của Form

            this.Text = "MainForm";

            }

 

            #endregion

Mã nguồn trong tập tin MainForm.Designer.cs do thành phần thiết kế của Visual Studio tạo ra; khi bạn thiết kế, thay đổi trên giao diện đồ họa (trên Form) thì mã nguồn sẽ được sinh ra và cập nhật tự động. Bạn không nên trực tiếp thay đổi mã nguồn trong tập tin MainForm.Designer.cs.

Bạn có thể thêm các điều khiển vào Form và quan sát mã nguồn sẽ sinh ra ở trong MainForm.Designer.cs.

4.2 Làm quen với thiết kế Form

Để thiết kế Form, chúng ta sẽ sử dụng bộ công cụ Toolbox ở khung bên trái, màn hình Form ở giữa và cửa sổ thiết lập các thuộc tính (Properties) bên phía phải.

Bạn sẽ kéo các công cụ từ Toolbox thả vào Form.

Để thiết lập thuộc tính cho thành phần nào thì bấm chuột phải vào nó và chọn Properties.

Chúng ta sẽ cùng thiết kế cho form chính của ứng dụng QuanLySach:

- Đặt tiêu đề cho form là Quan ly sach: chuột phải vào MainForm > chọn Properties > trong cửa sổ Properties > chọn mục Text > nhập giá trị là Quan ly sach

- Thiết lập kích thước cho MainForm: chọn mục Size > thiết lập width = 850, height = 510. Đơn vị ngầm hiểu là px.

- Tạo thư mục Resources trong project để chứa hình ảnh: Chuột phải vào project > chọn Add > New Folder > nhập tên cho thư mục (Resources)

- Chọn một ảnh nền bất kỳ, ví dụ: kiểu ảnh: bmp; kích thước (tối thiểu): width: 850px, height: 600px. Chép ảnh nền vào thư mục Resources. Vào mục BackgroundImage > tìm tới thư mục Resources > chọn hình ảnh. Vào mục BackgroundImageLayout > chọn Stretch để căng ảnh sao cho phủ kín giao diện.

Chèn thêm nút Sách

- Vào Toolbox > kéo button và thả vào MainForm. Vào mục Name, đặt tên là btnBooks.

- Vào mục font: chọn kiểu font là Monotype Corsiva, Size: 17pt; Bold: True. ForeColor: SteelBlue; Text: Sách. Size: 150, 50

Chèn thêm nút Thoát

- Vào Toolbox > kéo button và thả vào MainForm. Vào mục Name, đặt tên là btnExit.

- Vào mục font: chọn kiểu font là Monotype Corsiva, Size: 17pt; Bold: True. ForeColor: SteelBlue; Text: Thoát. Size: 150, 50

Chèn label Tiệm sách cũ Hoa Giấy

- Vào Toolbox > kéo label và thả vào MainForm. Vào mục Name, đặt tên là lblTiemSach.

- Vào mục font: chọn kiểu font là Monotype Corsiva, Size: 40pt; Bold: True. ForeColor: SteelBlue; BackColor: Transparent. Text: Tiệm sách cũ Hoa Giấy.

4.3 Bài tập

1. Từ khóa partial trong dòng mã sau, có ý nghĩa gì? 

public partial class MainForm : Form { }

A. MainForm là lớp kế thừa của Form

B. Lớp MainForm được định nghĩa ở nhiều nơi

C. Kiểu truy cập của MainForm

D. Lớp rỗng

2. Dòng mã sau có ý nghĩa gì?

this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;

A. Tự động điều chỉnh kích thước các phần tử theo kích thước của font

B. Thiết lập kích thước font

C. Đặt chế độ kích thước font tự động

D. Dùng font của hệ thống

3. Trong thiết kế giao diện Windows Form, thuộc tính ForeColor dùng để:

A. Định dạng màu nền

B. Định dạng màu chữ

C. Định dạng độ trong suốt của nền

D. Định dạng màu đường viền

4. Viết lại và chạy được các đoạn mã nguồn trong bài viết. 

-----

Gợi ý trả lời

1(B), 2(A), 3(B)

-----

Cập nhật: 19/11/2024

Bài sau: Windows Form (5): Lập trình cho Form