hdth03 ltudql02-user control

7

Click here to load reader

Upload: dung-dinh

Post on 08-Jul-2015

595 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Hdth03 ltudql02-user control

Giới thiệu

Các lớp control của VB.NET (cũng như .NET Framework) có dạng cây kế thừa như sau:

Đầu tiên, tạo 1 Windows Application Project, đặt tên tùy ý (ở đây là

VBUserControlCustomControl). Visual Studio tạo 1 solution tên là

“VBUserControlCustomControl”; trong đó có sẵn 1 project dạng WinForm cùng tên. Form1

của project này được dùng để chạy thử các control sắp được định nghĩa.

Sau đó tiến hành thêm các control. Các control do người dùng định nghĩa (user-defined) đều

có thể được sử dụng tương tự các control có sẵn (built-in) của .NET Framework. Sau khi

build ứng dụng thành công, các control mới do người lập trình (người dùng) tự định nghĩa

được thêm vào Toolbox.

Để tạo control mới, người lập trình thường thừa kế từ một control có sẵn (như TextBox,

ListView,…), từ lớp System.Windows.Forms.UserControl hay từ lớp

Systems.Windows.Forms.Control.

Custom Control – RoundButton

Custom Control là các control được tạo thành bằng cách kế thừa lớp

System.Windows.Forms.Control.

Mục tiêu: tạo 1 Custom Control dạng Button nhưng có hình ellipse.

Trong cửa sổ Solution Explorer, nhấp chuột phải vào tên project, chọn Add → New Item….

Trong cửa số Add New Item, chọn Custom Control. Nhập tên cho Custom Control mới:

RoundButton. Nhấn OK.

Trong cửa sổ Solution Explorer, nhấp chuột phải vào RoundButton.vb, chọn View Code.

Control

TextBoxBase ListView ...

TextBoxRichTextBox

UserControl

User-defined Control User-defined ControlUser-defined Control

Page 2: Hdth03 ltudql02-user control

Thêm data member m_BackgroundColor vào lớp RoundButton, data member này lưu trữ

màu nền của đối tượng RoundButton:

Khai báo và định nghĩa Property cho m_BackgroundColor; nhờ phần này, BackgroundColor

sẽ xuất hiện ở dạng 1 mục chọn trong cửa sổ Properties của control RoundButton:

Override hàm OnPaint của lớp Control trong lớp RoundControl:

Đối tượng RoundButton khi thể hiện trong 1 Form sẽ có hình dạng 1 ellipse, màu nền là

m_BackgroundColor. Thông tin về kích thước (Width & Height) và dòng chữ (Text) trên

hình ellipse này có thể được thay đổi bằng cách kéo thả hay / và thao tác trong cửa sổ

Properties.

Build ứng dụng. Sửa lỗi nếu có thông báo lỗi.

Nhấp đôi chuột trái vào Form1.vb để mở màn hình thiết kế Form1.

Lúc này trong phần Toolbox đã có thêm control RoundButton. Ta có thể kéo thả control này

vào Form1 và sử dụng như 1 Button. Nhấp đôi chuột trái vào control này để vào hàm xử lí sự

kiện OnClick.

Tuy nhiên, khi ta nhấp chuột trái ngoài hình ellipse (nhưng vẫn còn trong control) thì sự kiện

OnClick vẫn xảy ra. Để sự kiện OnClick chỉ xảy ra khi người dùng nhấp chuột trong hình

ellipse ta phải kiểm tra điểm nhấp chuột có nằm trong hình ellipse hay không.

Cách đơn giản nhất là dùng 1 GraphicsPath có hình ellipse khớp với hình của RoundButton,

sau đó dùng hàm IsVisible của GraphicsPath để kiểm tra điểm nhấp chuột có nằm trong

GraphicsPath hay không. Lưu ý: phải chuyển điểm nhấp chuột từ hệ tọa độ Form1 sang hệ

tọa độ của control, dùng hàm PointToClient của Form1.

Page 3: Hdth03 ltudql02-user control

Các bước thực hiện:

- Bước 1: thêm data member m_VisibleArea kiểm GraphicsPath. Đây là biến giữ thông

tin vùng có thể xảy ra sự kiện OnClick.

- Bước 2: chỉnh sửa hàm OnPaint để đưa thông tin vào m_VisibleArea.

- Bước 3: override hàm OnClick của RoundButton. Cursor.Position là vị trí của chuột

trên Form1.

Extended Control – PowerTextBox

Extended Control là control được tạo ra bằng cách kế thừa một control có sẵn (TextBox,

ListView,…).

Mục tiêu: tạo 1 TextBox có cho phép chọn loại dữ liệu nhập (chữ, số, không phân biệt).

Trong cửa sổ Solution Explorer, nhấp chuột phải vào tên project, chọn Add → User

Control….

Nhập tên cho Control mới: PowerTextBox. Nhấn OK.

Mở tập tin PowerTextBox.Designer.vb (bằng Notepad hay Notepad++). Lưu ý: Visual Studio

không hiển thị tập tin này trong Solution Explorer, chỉ có thể chọn xem tập tin này trong

Windows Explorer (hoặc trình duyệt tập tin khác).

Sửa System.Windows.Forms.UserControl thành System.Windows.Forms.TextBox: control

PowerTextBox kế thừa từ lớp TextBox.

Page 4: Hdth03 ltudql02-user control

Sau khi sửa xong, có thể bị báo lỗi ở hàm InitializeComponent. Đó là do một số thuộc tính

của TextBox khác so với UserControl, chỉ cần bỏ (comment) những dòng báo lỗi là được.

Định nghĩa enum kiểu nhập trong lớp PowerTextBox:

Thêm các data member và property: m_TypeMode để lưu kiểu nhập và m_ErrorText để lưu

thông báo lỗi.

Viết hàm tạo (contructor) cho lớp PowerTextBox:

Chuyển qua màn hình Designer của PowerTextBox (bằng cách nhấp đôi chuột vào

PowerTextBox.vb trong Solution Explorer), gán hàm xử lí sự kiện KeyPress (nhấn phím) cho

control này. Hàm xử lí sự kiện được gán bằng cách nhấp đôi chuột vào dòng KeyPress.

Page 5: Hdth03 ltudql02-user control

Viết hàm xử lí sự kiện:

Composite Control

Composite Control là control chứa một số control khác. Thường được tạo bằng cách thừa kế

lớp System.Windows.Forms.UserControl.

Trong cửa sổ Solution Explorer, nhấp chuột phải vào Solution “…” (cấp cao nhất), chọn Add

→ New Project. Chọn loại project là Class Library. Đặt tên là FileChooserControl. Project

này sẽ chứa control mới do người lập trình tự định nghĩa và ở dạng thư viện DLL. Control

mới này bao gồm 1 TextBox và 1 Button, cho phép người dùng chọn tập tin và trả về đường

dẫn tập tin đó.

Để sử dụng control mới ở trên trong project VBUserControlCustomControl (project dạng

WinForm có chứa Form1.vb), nhấp chuột phải vào tên project

Page 6: Hdth03 ltudql02-user control

VBUserControlCustomControl, chọn Add Reference, chọn tab Projects, chọn

FileChooserControl, nhấn OK.

Quay lại project FileChooseControl, thêm UserControl bằng cách nhấp chuột phải vào

FileChooserControl, chọn Add… → User Control…, đặt tên là FileChooser.

Kéo từ Toolbox vào màn hình Designer của FileChooser 2 control:

- TextBox: trong cửa sổ Properties, gán Name = txtPath.

- Button: trong cửa sổ Properties, gán Name = btnBrowse, Text = Browse.

Nhấp đôi chuột vào button btnBrowse để nhảy đến hàm xử lí sự kiện OnClick

(btnBrowse_Click).

Trong lớp FileChooser, thêm enum biểu diễn loại cửa sổ cần mở (chọn đường dẫn mở file

hay lưu file):

Định nghĩa data member và property cho người dùng chọn loại cửa sổ:

Khai báo data member cửa sổ sẽ hiển thị cho người dùng chọn tập tin, lớp

System.Windows.Forms.FileDialog là lớp cha của lớp OpenFileDialog và SaveFileDialog:

Thêm data member lưu đường dẫn mà người dùng đã chọn:

Page 7: Hdth03 ltudql02-user control

Xử lí sự kiện OnClick của btnBrowse:

Tùy vào chọn lựa của người dùng mà cửa sổ OpenFileDialog hay SaveFileDialog được hiển

thị. Sau đó nếu người dùng nhấn nút OK, đường dẫn tập tin sẽ được đưa vào txtPath.Text

(thuộc tính nội dung của TextBox txtPath) và m_Path. Người dùng có thể truy xuất đến

đường dẫn này qua property Path (ví dụ: FileChooser1.Path).

Sau khi build solution thành công, chuyển qua màn hình Designer của Form1.vb (trong

project VBUserControlCustomControl), control FileChooser đã được gắn vào Toolbox và

chúng ta có thể dùng như 1 control thông thường. Người dùng có thể chọn DialogType bằng

cách vào cửa sổ Properties của control hay thao tác trực tiếp trong mã nguồn.

Nếu chúng ta quan sát kết quả sau khi build của project FileChooserControl thì thấy có một

tập tin DLL (FileChooserControl.dll) thay vì một tập tin .exe. Trong thư mục chứa kết quả

build của project VBUserControlCustomControl cũng có file FileChooserControl.dll do đã có

tham chiếu (reference) trước đó. Nếu muốn chạy được VBUserControlCustomControl.exe,

chúng ta phải chép file FileChooserControl.dll đi theo cùng thư mục.

Tài liệu tham khảo

http://msmvps.com/blogs/deborahk/archive/2009/10/13/winforms-user-controls-101.aspx

http://ondotnet.com/pub/a/dotnet/2002/06/03/custom.html

http://msdn.microsoft.com/en-us/library/ms996437.aspx

http://msdn.microsoft.com/en-us/library/ms996439.aspx

http://www.caulacbovb.com/forum/viewtopic.php?f=23&t=868