1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng lập trình window 2 C

116 195 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 116
Dung lượng 2,26 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Đây là cuốn giáo trình lập trình C trên window form. Có nhiều ví dụ thực tế, giúp các bạn dễ học và thực hành. Nhất là các bạn sinh viên chuyên ngành lập trình, CNTT,... Đây là cuốn giáo trình lập trình C trên window form. Có nhiều ví dụ thực tế, giúp các bạn dễ học và thực hành. Nhất là các bạn sinh viên chuyên ngành lập trình, CNTT,...

Trang 1

BÀI 1: XỬ LÝ NGOẠI LỆ 1.1 Phát sinh và bắt giữ ngoại lệ

Trong ngôn ngữ C#, chúng ta chỉ có thể phát sinh (throw) những đối tượng cáckiểu dữ liệu là System.Exception, hay những đối tượng được dẫn xuất từkiểu dữ liệu này

Namespace System của CLR chứa một số các kiểu dữ liệu xử lý ngoại lệ màchúng ta có thể sử dụng trong chương trình Những kiểu dữ liệu ngoại lệnày bao gồm ArgumentNull - Exception, InValidCastException, vàOverflowException , cũng như nhiều lớp khác nữa

throw new System.Exception();

Khi phát sinh ngoại lệ thì ngay tức khắc sẽ làm ngừng việc thực thi trong khiCLR sẽ tìm kiếm một trình xử lý ngoại lệ Nếu một trình xử lý ngoại lệ không đượctìm thấy trong phương thức hiện thời, thì CLR tiếp tục tìm trong phương thức gọi chođến khi nào tìm thấy

Nếu CLR trả về lớp Main() mà không tìm thấy bất cứ trình xử lý ngoại lệ nào,thì nó sẽ kết

Trang 2

kiểu Test và sau đó gọi hàm Func1() Sau khi in thông điệp “Enter Func1”, hàm

Func1() này gọi hàm Func2() Hàm Func2() in ra thông điệp đầu tiên và phát sinh mộtngoại lệ kiểu System.Exception Việc thực thi sẽ ngưng ngay tức khắc, và CLR sẽ tìmkiếm trình xử lý ngoại lệ trong hàm Func2() Do không tìm thấy ở đây, CLR tiếp tụcvào stack lấy hàm đã gọi trước tức là Func1 và tìm kiếm trình xử lý ngoại lệ Một lầnnữa trong Func1 cũng không có đoạn xử lý ngoại lệ Và CLR trả về hàm Main Tạihàm Main cũng không có, nên CLR sẽ gọi trình mặc định xử lý ngoại lệ, việc này đơngiản là xuất ra một thông điệp lỗi

Câu lệnh catch

Trong C#, một trình xử lý ngoại lệ hay một đoạn chương trình xử lý các ngoại

lệ được gọi là một khối catch và được tạo ra với từ khóa catch.

Trong ví dụ sau, câu lệnh throw được thực thi bên trong khối try, và một khối catch được sử dụng để công bố rằng một lỗi đã được xử lý.

Trang 3

{Console.WriteLine(“Enter Main ”);

Test t = new Test();

t.Func1();

Console.WriteLine(“Exit Main ”);

}public void Func1(){

Console.WriteLine(“Enter Func1 ”);

Func2();

Console.WriteLine(“Exit Func1 ”);

}public void Func2(){

Console.WriteLine(“Enter Func2 ”);

try{Console.WriteLine(“Entering try block ”);

throw new System.Exception();

Console.WriteLine(“Exiting try block ”);

}Khi một ngoại lệ được phát sinh, việc thi hành ngay lập tức sẽ bị tạm dừng và

việc thi hành sẽ được chuyển qua khối lệnh catch Nó không bao giờ trả về luồng thực hiện ban đầu, tức là các lệnh sau khi phát ra ngoại lệ trong khối try không được thực

hiện Trong trường hợp này chúng ta sẽ không bao giờ nhận được thông báo “Exiting

try block ” Khối lệnh catch xử lý lỗi và sau đó chuyển việc thực thi chương trình

đến các lệnh tiếp sau khối catch Ở đây không có việc quay lại cuộc gọi hàm trước

trong stack Ngoại lệ bây giờ được xử lý, không có vấn đề gì xảy ra, và chương trìnhtiếp tục hoạt động bình thường Điều này trở nên rõ ràng hơn nếu chúng ta di chuyển

khối try/catch lên hàm Func1 như trong ví dụ minh họa

Trang 4

Console.WriteLine(“Exit Main ”);

}public void Func1(){

Console.WriteLine(“Enter Func1 ”);

try{Console.WriteLine(“Entering try block ”);

Func2();

Console.WriteLine(“Exiting try block ”);

}catch{Console.WriteLine(“Exception caught and handled.”);

}

Console.WriteLine(“Exit Func1 ”);

}public void Func2(){

xử lý ngoại lệ, nhưng trong hàm này không có và CLR vào stack lấy hàm gọi trong

trường hợp này là Func1() Câu lệnh catch sẽ được gọi, và việc thực thi tiếp tục thực hiện bình thường sau câu lệnh catch.

Hãy chắc chắn rằng chúng ta đã hiểu rõ tại sao câu lệnh “Exiting try block” và

“Exit Func2” không được in ra Chúng ta có thể dùng cách cũ để kiểm tra việc này

bằng cách dùng chương trình debug cho chương trình chạy từng bước để tìm hiểu rõhơn

Tạo một khối catch xác định:

Ở đây ta chỉ dùng khối catch tổng quát, tức là với bất cứ ngoại lệ nào cũng được Tuy nhiên chúng ta có thể tạo ra khối catch xác định để xử lý chỉ một vài các

Trang 5

ngoại lệ chứ không phải toàn bộ ngoại lệ, dựa trên kiểu của ngoại lệ phát sinh

Trong ví dụ này, phương thức DoDivide() sẽ không cho phép chúng ta chia chozero bởi một số khác, và cũng không cho phép chia số zero Nó sẽ phát sinh một đốitượng của Divide- ByzeroException nếu chúng ta thực hiện chia với zero Trong toánhọc việc lấy zero chia cho một số khác là được phép, nhưng trong ví dụ minh họa củachúng ta không cho phép thực hiện việc này, nếu thực hiện sẽ phát sinh ra một ngoại lệArithmeticException

Khi một ngoại lệ được phát sinh, CLR sẽ kiểm tra mỗi khối xử lý ngoại lệ theothứ tự và sẽ lấy khối đầu tiên thích hợp Khi chúng ta thực hiện với a=5 và b=7 thì kếtquả như sau:

Cuối cùng, giả sử chúng ta thay đổi giá trị của b là 0 Khi thực hiện điều này sẽdẫn đến ngoại lệ DivideByZeroException

!Ghi chú: Chúng ta phải cẩn thận thứ tự của câu lệnh catch, bởi

vì DivideByZero- Exception được dẫn xuất từ ArithmeticException Nếu chúng ta

đảo thứ tự của câu lệnh catch, thì ngoại lệ DivideByZeroException sẽ được phù hợp

với khối xử lý ngoại lệ Arith- meticException Và việc xử lý ngoại lệ sẽkhông bao giờ được giao cho khối xử lý DivideByZeroException Thật vậy,nếu thứ tự này được đảo, nó sẽ không cho phép bất cứ ngoại lệ nào được xử lý bởikhối xử lý ngoại lệ DivideByZeroException Trình biên dịch sẽ nhận ra rằngDivideByZeroException không được thực hiện bất cứ khi nào và nó sẽ thông báo mộtlỗi biên dịch

Chúng ta có thể phân phối câu lệnh try/ catch, bằng cách bắt giữ những ngoại

lệ xác định trong một hàm và nhiều ngoại lệ tổng quát trong nhiều hàm Mục đích củathực hiện này là đưa ra các thiết kế đúng Giả sử chúng ta có phương thức A, phươngthức này gọi một phương thức khác tên là phương thức B, đến lượt mình phương thức

B gọi phương thức C Và phương thức C tiếp tục gọi phương thức D, cuối cùngphương thức D gọi phương thức E Phương thức E ở mức độ sâu nhất trong chương

Trang 6

phương thức E có thể phát sinh ra ngoại lệ, chúng ta có thể tạo ra khối try/catch để bắt

giữ những ngoại lệ này ở chỗ gần nơi phát sinh ra ngoại lệ nhất Chúng ta cũng có thểtạo ra nhiều khối xử lý ngoại lệ chung ở trong đoạn chương trình ở mức cao trongtrường hợp những ngoại lệ không đoán trước được

1.2 Những đối tượng ngoại lệ

Cho đến lúc này thì chúng ta có thể sử dụng tốt các ngoại lệ cũng như cách xử

lý khắc phục các ngoại lệ này Trong phần này chúng ta sẽ tiến hành việc tìm hiểu cácđối tượng được xây dựng cho việc xử lý ngoại lệ Đối tượng System.Exception cungcấp một số các phương thức và thuộc tính hữu dụng Thuộc tính Message cung cấpthông tin về ngoại lệ, như là lý do tại sao ngoại lệ được phát sinh Thuộc tính Message

là thuộc tính chỉ đọc, đoạn chương trình phát sinh ngoại lệ có thể thiết lập thuộc tínhMessage như là một đối mục cho bộ khởi dựng của ngoại lệ Thuộc tính HelpLinkcung cấp một liên kết để trợ giúp cho các tập tin liên quan đến các ngoại lệ Đây làthuộc tính chỉ đọc Thuộc tính StackTrace cũng là thuộc tính chỉ đọc và được thiết lậpbởi CLR Trong ví dụ 13.6 thuộc tính Exception.HelpLink được thiết lập và truy cập

để cung cấp thông tin cho người sử dụng về ngoại lệ DivideBy-ZeroException

Thuộc tính StackTrace của ngoại lệ được sử dụng để cung cấp thông tin stackcho câu lệnh lỗi Một thông tin stack cung cấp hàng loạt các cuộc gọi stack củaphương thức gọi mà dẫn đến những ngoại lệ được phát sinh

{Try{ Console.WriteLine(“ Open file here”);

Double a=12;

Double b=0;

Trang 7

Console.WriteLine(“ {0}/{1} = {2}”,a,b,a/b);

}catch (System.DivideByZeroException e){

Console.WriteLine(“\nDivideByZeroException!Msg:

{0},e.Message”);

}catch {Console.WriteLine(“ ko xac dinh”);

}public double DoDivide(double a,double b){

if(b==0){

DivideByzeroException e = new DivideByZeroExceptin();

throw e;

}

If (a==0){

throw new ArithmeticException();

}Return a/b;

} }

Một số lớp ngoại lệ:

CÁC LỚP NGOẠI LỆ

MethodAccessException Lỗi truy cập, do truy cập đến thành viên hay phương

thức không được truy cậpArgumentException Lỗi tham số đối mục

ArgumentNullException Đối mục null, phương thức được truyền đối mục null

không được chấp nhậnarithmeticException Lỗi liên quan đến các phép toán

DivideByZeroException Lỗi chia 0

FormatException Định dạng không chính xác một đối mục nào đó

Trang 8

1.3 Phát sinh lại ngoại lệ

Giả sử chúng ta muốn khối catch thực hiện một vài hành động đúng nào đó rồi sau đó phát sinh lại ngoại lệ ra bên ngoài khối catch (trong một hàm gọi) Chúng ta

được phép phát sinh lại cùng một ngoại lệ hay phát sinh lại các ngoại lệ khác Nếuphát sinh ra ngoại lệ khác, chúng ta có thể phải nhúng ngoại lệ ban đầu vào bên trongngoại lệ mới để phương thức gọi có thể hiểu được lai lịch và nguồn gốc của ngoại lệ.Thuộc tính InnerException của ngoại lệ mới cho phép truy cập ngoại lệ ban đầu

Trang 9

BÀI 2: VISUAL STUDIO.NET 2.1 Lập trình với Visual Studio NET

Microsoft Visual Studio NET là ngôn ngữ hướng thành phần (component) rấtmạnh C# đóng vai trò quan trọng trong kiến trúc NET Framework của Microsoft

Visual Studio.NET là môi trường lập trình cung cấp rất nhiều công cụ cần thiếtcho việc xây dựng các dự án lớn hoặc nhỏ

Thanh trình đơn (menu bar) cho phép truy cập đến các lệnh sẽ sử dụng trongmôi trường lập trình

Thanh công cụ (toolbar) nằm ngay bên dưới thanh trình đơn cung cấp các núttruy cập nhanh đến hầu hết các lệnh thường dùng

Khung cửa sổ soạn thảo (code pane) hiển thị nội dung các tập nguồn, đối với dự

án có nhiều tập tin, mỗi tập tin nguồn có thẻ của riêng nó với nhãn là tên tập tin nguồn

Để thao tác một tập tin nguồn chỉ việc bấm chọn lên thẻ của tập tin nguồn của dự án

Khung cửa sổ kết xuất (Output pane) hiển thị các thông điệp biên dịch (baogồm các cảnh báo và thông báo lỗi) khi tạo dựng (build) lệnh

Trước khi viết mã (coding) cần kiểm tra các tập tin trong khung cửa sổ SolutionExplorer, chúng được tạo ra bởi Visual Studio.NET khi tạo dựng dự án

Ví dụ khi tạo dự án có tên TextHello thì xuất hiện một số tập tin sau:

 TextHello.shn: đây là tập tin giải pháp (solution file) cấp trên cùng, mỗiứng dụng có 1 tập tin loại này Mỗi tập tin giải pháp gồm một hay nhiềutập tin dự án Trong hệ thống tập tin, mỗi tập tin giải pháp có phần mở

rộng là shn, với phần tên hiển thị trong Solution Explorer thường dễ đọc.

 TextHello.csproj: đây là tập tin dự án (project) của C# Mỗi tập tin dự ángồm một hay nhiều tập tin nguồn, các tập tin nguồn trong cùng một dự ánphải được viết cùng một ngôn ngữ Loại tập tin này được hiển thị trongSolution Explorer chỉ sử dụng tên của dự án, tuy nhiên nó được lưu trong

hệ thống tập tin với phần mở rộng csproj

 Class1.cs: đây là 1 tập tin nguồn khác của C#, ta sẽ viết mã trong tập tinnày, Visual Studio.NET cũng tự động cung cấp một số mã lệnh (code) chotập tin này

 AssemblyInfo.cs: đây là 1 tập tin nguồn khác của C#, dùng tập tin này đểthêm một số thuộc tính vào chương trình

Trang 10

 App.ico: là tập tin icon được kết hợp với chương trình, tất cả các ứng dụngwindows có giao diện người dùng đều có icon, nó xuất hiện trên thanh tác

vụ (taskbar) khi chạy chương trình

Các ứng dụng của NET: được trình bày thông qua hình sau:

Trang 11

Các thành phần của NET framework:

2.2 Thêm và điều chỉnh các điều khiển

Các thành phần và điều khiển của windows form:

Trang 12

Ví dụ:

2.3 Thay đổi kích thước các Form:

Kênh điều khiển kích thước

Khung lưới này sẽ không xuất hiện trong solution

Nhấn giữ chuột phải, kéo và thả vào form

Trang 13

BÀI 3: THỰC ĐƠN 3.1 Thực đơn chính

 Thực đơn (Menu) là một thành phần quan trọng của cửa sổ, chúng chứa đựngcác chức năng chính của chương trình mà người dùng có thể thực hiện Thanhthực đơn chứa hầu hết tất cả chức năng chính của 1 chương trình, tổ chức theodạng phân cấp

 Thực đơn là điều khiển gồm nhiều phần tử được tổ chức dưới dạng phân cấp.Thanh thực đơn nằm trên đỉnh cửa sổ (dưới thanh tiêu đề) Các phần tử thựcđơn (Menu Item) xuất hiện trên thanh thực đơn được gọi là Menu Item mứcđỉnh

 Mỗi Menu Item mức đỉnh có thể chứa Menu Item cấp dưới (SubMenu) hoặcđược gắn trực tiếp với các bộ xử lý sự kiện (Event handler)

 Khi một menu Item chứa các Menu Item cấp dưới thì thường gọi là PopupMenu Các Menu Item được gắn trực tiếp với bộ xử lý sự kiện được gọi làCommand Menu

1 Tạo thêm trình đơn và xử lý các sự kiện trình đơn

Microsoft Visual Studio NET cho phép thêm thực đơn và các mục thực đơnvào form theo 2 cách

- Có thể sử dụng IDE và trình soạn thảo thực đơn để tạo thực đơn

Trang 14

- Viết mã lệnh để tạo đối tượng Main Menu, sau đó thêm đối tượng MenuItemvào nó

Tạo thực đơn

- Khởi động Visual Studio NET

- Mở dự án mới

- Hiển thị MemberForm trong cửa sổ Design View

- Trong hộp Toolbox, chọn điều khiển MainMenu

Thành phần điều khiển mặc định có tên mainMenu1 xuất hiện cuối form và 1thanh trình đơn chứa 1 nhãn Type Here được thêm vào form

- Bấm chọn nhãn Type Here trên thanh thực đơn, nhập vào &File rồi ấn Enter

- Khi nhập 1 giá trị mới, một nhãn Type Here thứ 2 xuất hiện bên phải củamục hiện thờim và nhãn Type Here thứ 3 xuất hiện bên dưới mục trình đơn File

Chú ý: Ký tự & phía trước một ký tự cung cấp 1 cách truy xuất nhanh tới mụctrình đơn đó khi người sử dụng ấn phím Alt và ký tự đi theo &

Trang 15

Thiết lập các thuộc tính của mục trình đơn

1 Bấm chọn thành phần điều khiển mainMenu bên dưới form, trong cửa sổProperties thay đổi tên của nó thành mainMenu

2 Bấm phải chuột lên mục trình đơn File trên thanh trình đơn củaMemberForm, trên trình đơn vừa xuất hiện bấm chọn Edit Names

3 Bấm chọn mục menuItem1 trên thanh thực đơn, nhập fileItem rồi ấnEnter

Các phím truy xuất cho các mục trình đơn này chỉ có sẵn khi trình đơn thật sựđược hiển thị Các mục trình đơn được truy xuất nói chung cũng sẽ có các phím tắt màngười sử dụng có thể nhấn bất cứ lúc nào để gọi lệnh tương ứng

4 Chọn trình đơn Save Member trong trình đơn File trong MemberForm,chọn shortcut trong cửa sổ Properties Chọn CtrlS từ danh sách thả xuống

Chú ý: Mặc dù các giá trị cho các phím tắt có tên như CtrlS, AltF4,… khi chúngđược hiển thị trên trình đơn, chúng sẽ xuất hiện như sau: Ctrl + S và Alt+F4

5 Có 1 thuộc tính khác là ShowShortcut bên dưới thuộc tính Shortcut.Thuộc tính này quyết định phím tắt được hiển thị trên trình đơn hay không khi ứngdụng chạy Kiểm tra rằng thuộc tính này được thiết lập True

6 Thay đổi các phím tắt cho các mục trình đơn dùng các giá trị trong bảng sau.Phải đảm bảo rằng thuộc tính ShowShortcut cho mỗi mục trình đơn còn lại được thiết lậpTrue

Kiểm tra trình đơn

1 Từ trình đơn Debug, chọn Start (F5) để biên dịch và chạy ứng dụng

Trang 16

2 Khi form xuất hiện, bấm chọn File (Alt+F) khi đó trình đơn mới xuấthiện Ở đây các phím tắt của lệnh Print không được hiển thị sẵn.

3 Đóng form lại

Các thuộc tính của mục thực đơn khác

Các mục trình đơn có 1 số ít các thuộc tính khác Bảng dưới đây mô tả những thuộctính chung nhất

Name Thuộc tính này là tên của thực đơn

Checked Các mục thực đơn có thể hành động như các hộp kiểm và hiện

ra dấu kiểm khi chúng được bấm chọn Thiết lập thuộc tính nàythành True để hiện thị dấu kiểm, thiết lập False để che dấuDefaultItem Thuộc tính này chỉ ra mục thực đơn là mục mặc định hay

không, nếu thiết lập true thì khi người sử dụng nhấp đôi chuộtlên thực đơn cha lệnh tương ứng với mục này sẽ được thực thi.Các mục mặc định xuất hiện nét đậm khi chúng được hiển thịEnable Thuộc tính này chỉ ra mục trình đơn có sẵn dung hay không

Nếu không có sẵn dùng được nó sẽ bị mờ đi và người dùng sẽkhông thể chọn nó được

RadioCheck Thuộc tính này hoạt động liên kết với thuộc tính Checked Nếu

RadioCheck là true thì mục thực đơn xuất hiện với “radio dot”chứ không là dấu kiểm khi nó được chọn

Shortcut Thuộc tính này chỉ ra phím tắt người dùng có thể nhấn để thực

thi lệnh tương ứngShowShortcut Nếu thuộc tình là true, phím tắt được hiển thị trên thực đơn

cùng với dòng văn bản của mục trình đơnText Đây là dòng văn bản hiển thị trên trình đơn cho mục trình đơn

Có thể dùng ký tự & để chi ra phím truy xuấtVisible Thuộc tính này quyết định một mục có được hiển thị trên trình

đơn hay không Thường thì dùng thuộc tính Enable để cho thấyrằng một mục trình đơn có mặt nhưng không sẵn dùng

Các sự kiện trình đơn

Trang 17

Có 5 sự kiện trình đơn khác nhau có thể xảy ra khi người sử dụng đặt được truyxuất tới một mục thực đơn

Click Sự kiện này xảy ra khi người sử dụng bấm lên mục trình đơnDrawItem Sự kiện này xảy ra khi mục trình đơn được vẽ lại

MeasureItem Sự kiện này xảy ra khi trình thực thi đang quyết định độ cao của

mục trình đơn Có thể sẽ không sử dụng sự kiện này thường xuấtPopup Sự kiện này xảy ra khi trình đơn được thực hiện, sử dụng sự kiện

này để điều chỉnh động các thuộc tính của mục trình đơn, tùytrường hợp và ngữ cảnh hiện thời

Select Sự kiện này xảy ra khi người dùng chọn mục trình đơn nhưng

chưa được bấm chọn

3.2 Các sự kiện popup và chia sẻ

Hầu hết các ứng dụng windows hiện đại đều có trình đơn popup, xuất hiện khinhấn phải chuột form hay thành phần điều khiển Những trình đơn này thường theongữ cảnh và chỉ hiển thị những lệnh nào có thể áp dụng cho form hay thành phần điềukhiển hiện thời đang được focus

Tạo trình đơn popup

Trình đơn popup thứ nhất được gắn vào 2 thành phần điều khiển Textbox có tên

là firstname và lastname và cho phép người dùng xóa các thành phần này Trình đơnthứ 2 được gắn vào form và chứa các lệnh để lưu thông tin của thành viên hiện thời vàxóa form Để thực hiện điều này cần dùng 1 trình đơn đang tồn tại và tạo 1 trình đơnmới

Tạo trình đơn popup firstname và lastname

1 Trong cửa sổ Design View đang hiển thị MemberForm, rẽ thành phần điềukhiển ContextMenu từ hộp công cụ và thả nó lên form Một đối tượngContextMenu là contextMenu1 xuất hiện cuối form

Trang 18

2 Chọn thành phần điều khiển contextMenu1, nhập vào textboxMenu trong hộpvăn bản (name) trong cửa sổ Properties rồi ấn Enter.

Khi chọn trình đơn popup(textboxMenu) có thể nhận thấy văn bản “ContextMenu” cũng xuất hiện trên thanh trình đơn của MemberForm Trình đơn không xuấthiện ở đó khi form chạy

3.3 Thực đơn ngữ cảnh

Thực đơn ngữ cảnh (ContextMenu) là loại thực đơn gắn với một điều khiển cụthể nào đó, ví dụ như bấm hay một hộp soạn thảo… Khi người dùng nhấn phải chuộtvào điều khiển có gắn thực đơn ngữ cảnh thì thực đơn ngữ cảnh của điều khiển đó sẽhiện ra và cho phép người dùng chọn công việc từ thực đơn

Trang 19

Tương tự như thực đơn Menu, thực đơn ngữ cảnh gồm nhiều phần tử thực đơnđược tổ chức dưới dạng cây phân cấp Mỗi phần tử thực đơn có thể là CommandMenuItem hay Popup Menu Item Tuy nhiên thực đơn ngữ cảnh không nằm trên đỉnhcủa cửa sổ, nó gắn trực tiếp với một điều khiển nào đó và xuất hiện khi người dùngnhấn chuột phải lên đối tượng tương ứng.

Thực đơn ngữ cảnh riêng biệt là thực đơn ngữ cảnh gắn với 1 điều khiển cụ thể,các trạng thái của menu này chỉ dành riêng cho điều khiển chứa nó sử dụng

Ví dụ: khi chọn Menu “đậm” của nút nào đó thì nội dung của nó hiển thị dạng

in đậm đồng thời menu tương ứng cũng ở trạng thái Checked và ngược lại trạng tháichecked của mục “đậm” của menu ngữ cảnh thuộc nút bấm 1 không ảnh hưởng đếnthực đơn của nút bấm 2

Trang 20

Bài tâp: thiết kế form như sau

Trang 21

BÀI 4: THANH TRẠNG THÁI 4.1 Lớp statusbar

Thanh trạng thái là thanh nằm ngang dưới đáy cửa sổ hiển thị các thông tin vềtrạng thái hoạt động của ứng dụng Một thanh trạng thái có thể có nhiều mục trạng thái(Status Item) khác nhau, mỗi mục thể hiện một loại thông tin nào đó tới người dùng

 Điều khiển statusstrip dùng để trình bày thông tin về điều khiển đangthực hiện trên form

 Một số các thuộc tính của statusstrip

Dock: chọn vị trí định vị trên form của điều khiển statusstrip

TextDirection: chọn hình thức trình bày statusStrip theo 3 cách

Items: Collection nắm giữ danh sách điều khiển

Chú ý: statusstrip được xem như điều khiển chứa các điều khiển khác

4.2 Các bảng (panel) thanh trạng thái

4.2.1 Thanh trạng thái với các phần tử văn bản(ToolstripStatusLabel)

Điều khiển ToolstripStatusLabel trình bày chuỗi trên điều khiển StatusStrip Form trên trình bày thanh status với 3 điều khiển toolstripStatusLabel : Ready,user, Module trong đó điều khiển Ready có chèn biểu tượng Image

Trang 22

4.2.2 Thanh trạng thái với phần tử là thanh tiến trình (Progress Bar)

Nếu muốn trên thanh trạng thái thể hiện trạng thái thực hiện của một công việcnào đó, ta có thể đưa thanh tiến trình vào một phần tử trên thanh trạng thái

Ví dụ:

Thiết kế form gồm 1 listview, 1 button, toolstripprogressbar

Khi người sử dụng click vào nút show thì sẽ load các file trong thư mụcwindows\system32 trong ổ C và đưa ra tổng số file

Trang 23

private void Form3_Load(object sender, EventArgs e)

// khai báo và khởi tạo đối tượng DirectoryInfo

DirectoryInfo dir = new DirectoryInfo(@"C:\WINDOWS\system32\"); ListViewItem item1;

// khai báo thuộc tính Maximum bằng số lượng tập tin

toolStripProgressBar1.Maximum = dir.GetFiles("*.*").Length;

// duyệt qua từng tập tin

foreach (FileInfo f in dir.GetFiles("*.*"))

{

item1 = new ListViewItem(f.Name );

item1.SubItems.Add( f.Length.ToString());

listView1.Items.Add(item1);

Trang 24

// khai báo thuộc tính value ứng với tập tin thứ i toolStripProgressBar1.Value = i;

i++;

}

// gán tổng số lượng tập tin duyệt qua

toolStripStatusLabel1.Text = i.ToString()+" file(s)"; }

Trang 25

BÀI 5: CÁC HỘP THOẠI

Có 2 kiểu hộp thoại: kiểu Modal (bắt buộc nhập liệu) và kiểu Modaless (khôngbắt buộc nhập liệu) Kiểu Modal yêu cầu người dùng phải hoàn tất thao tác nhập liệuhoặc những yêu cầu chọn lựa trước khi quay trở về dòng hoạt động chính của chươngtrình (ví dụ như các hộp thoại Options trong MS word) Hộp thoại kiểu Modaless cóthể được dùng để thực hiện thao tác nào đó nhưng vẫn cho phép người dùng tương tácvới phần còn lại của chương trình (ví dụ hộp thoại tìm kiếm Search Dialog)

Trong môi trường NET, hộp thoại là thành phần thiết yếu của Windows Form.Các điều khiển được đặt lên trên hộp thoại theo cùng cách mà người dùng để đặt trêncác cửa sổ form thông thường của ứng dụng – bằng công cụ trực quan hoặc bằng viếtcode

5.1 Hộp thoại thông điệp

Hộp thoại thông điệp được dùng với mục đích đơn giản hóa và tạo sự tương tácthống nhất cho người dùng sử dụng hệ điều hành windows Hộp thoại được hiển thịbằng cách gọi hàm ShowDialog() Tất cả các hộp thoại thông điệp đều ra đời và kếthừa từ lớp System.Windows.Forms.CommonDialog

Hộp thoại thường sử dụng nhất – FileDialog

Hộp thoại thường được sử dụng nhất trong các hộp thoại đó là hộp thoại mở,đọc và ghi file (file dialog) Windows Forms định nghĩa hai loại hộp thoại dạng file đó

là hộp thoại mở file (open file dialog) và hộp thoại lưu file (save file dialog) Để dùngcác hộp thoại này trong ứng dụng cần phải khai báo biến thành viên có kiểuOpenFileDialog hoặc SaveFileDialog trong lớp ứng dụng chính Và cũng như các hộpthoại cơ bản khác, 2 lớp này cũng bắt nguồn từ lớp System.Windows.Forms.Dialog.using System;

Trang 26

OpenFileDialog dlg=new OpenFileDialog();

if(dlg.ShowDialog() == DialogResult.OK){

MessageBox.Show("You selected the file

"+dlg.FileName);

}}

void OnExit(Object sender, EventArgs e)

Hộp thoại chọn màu – ColorDialog

Chọn màu là công việc rất thường hay làm trong môi trường đồ họa nhưwindows Rất nhiều chương trình đã cố gắng viết riêng cho mình một bộ chọn màu vì

lý do tạo tính cách riêng và nổi bật cho chương trình Tuy nhiên để đơn giản ta sử dụnglớp ColorDialog Ngoài ưu điểm dễ dùng, hộp thoại chọn màu là hộp thoại chuẩn dễdùng và quen thuộc đối với hầu hết người dùng ứng dụng Windows

Trang 27

Lớp ColorDialog trả về thông tin màu ở dạng đối tượng Color Thông tin nàybao gồm trị alpha (độ trong suốt), trị đỏ(red), xanh (green) và xanh(blue).

ColorDialog còn cung cấp một thuộc tính mang tên AllowFullOpen cho phéphiển thị nút nhấn tùy biến định nghĩa màu Nếu sử dụng thuộc tính FullOpen, hộp thoạichọn màu sẽ hiển thị ở chế độ phức tạp và đầy đủ nhất để định nghĩa giá trị màu cầnchọn

Trang 28

// 0xAARRGGBB where AA is alpha, RR is red, // GG is green and BB is blue expressed as the // hexadecimal byte equivalent

dlg.CustomColors = new int[5]{0x00ff8040, 0x00c256fe,

0x00aa2005, 0x0004f002, 0x002194b5};

dlg.ShowDialog();

}

ColorStretcher()

{

// first a menu for the choices

MainMenu m=new MainMenu();

temp=new MenuItem("No custom");

temp.Click+=new EventHandler(OnNoCustom);

top.MenuItems.Add(temp);

temp=new MenuItem("With Colours");

temp.Click+=new EventHandler(OnWithColours);top.MenuItems.Add(temp);

Trang 29

Để lấy về giá trị màu được chọn từ hộp thoại ColorDialog, ta chỉ cần đọc nộidung của thuộc tính Color Thiết lập giá trị cho thuộc tính này trước khi gọi phươngthức ShowDialog() sẽ áp đặt màu được chọn vào lúc hộp thoại hiển thị Điều này sẽthuận lợi cho việc thay đổi màu đã được thiết lập sẵn trong ứng dụng trước đó

Hộp thoại chọn font – FontDialog

Trong windows, chọn font chữ cho văn bản rất quan trọng và thường xuyênđược sử dụng trong rất nhiều chương trình Windows cho phép chọn tên font, cỡ chữ,kiểu chữ Lớp FontDialog một lần nữa giúp lập trình viên trong môi trường NET đơngiản hóa thao tác xử lý font

5.2 Hộp thoại Modal và Modaless

Hộp thoại được tạo ra theo cùng cách tạo form Lớp Form chứa một thuộc tínhmang tên Modal, nếu đặt thuộc tính này là True thì Form tạo ra sẽ là hộp thoại dạngmodal

Phương thức ShowDialog() của Form sẽ đặt giá trị cho thuộc tính này và chophép hiển thị form ở dạng modal

private Button ok,can;

public bool Modeless

{

set {

if(value){

ok.Click += new EventHandler(OnCloseModeless);

can.Click += new EventHandler(OnCloseModeless);

}}

}

Trang 30

void OnCloseModeless(Object sender, EventArgs e){

ok = new Button();

ok.Text = "OK";

ok.DialogResult = DialogResult.OK;

ok.Location = new Point(20,10);

ok.Size = new Size(80,25);

this.Controls.Add(ok);

can = new Button();

can.Text = "Cancel";

can.DialogResult = DialogResult.OK;

can.Location = new Point(110,10);

can.Size = new Size(80,25);

Trang 31

this.Size=new Size(400,100);

this.FormBorderStyle = FormBorderStyle.FixedDialog;

this.Text = "Dialog Mode Tester";

Button modal = new Button();

modal.Text = "New Modal dialog";

modal.Location = new Point(10,10);

modal.Size = new Size(180,25);

modal.Click += new EventHandler(OnModal);

this.Controls.Add(modal);

Button modeless = new Button();

modeless.Text = "New Modeless dialog";

modeless.Location = new Point(210,10);

modeless.Size = new Size(180,25);

modeless.Click += new EventHandler(OnModeless);this.Controls.Add(modeless);

Trang 32

BÀI 6: FORM VÀ CÁC ĐỊNH DẠNG FORM

Form có 3 loại chính là Multiple Document Interface (MDI) còn gọi là MDIform (form cha) cho phép trình bày các form khác bên trong ParentForm, form connày gọi là ChildForm Những form mở ra không nằm trong ParentForm thì gọi làNorma Form

Ví dụ gán thuộc tính IsMdiContainer cho Form2:

private void button1_Click(object sender, EventArgs e)

{

Form f1 = new Form2();

//khai bao thuoc tinh IsMdiContainer

f1.IsMdiContainer = true;

// xuat Form2 len man hinh

Trang 33

f1.Show();

}

Khi chạy chương trình, nếu click vào nút Form2 thì Form2 cũng sẽ xuất hiện là

1 MDI Form như hình sau:

Trong 1 project có thể có nhiều MDI Form, khi một form con kích hoạt, nếu làChildForm thì phải khai báo Parent Form của nó là MDI Form

Ta có thể thêm mới MDI từ Template có sẵn như trên

Trang 34

6.2 ChildForm

1 form con là form mà khi nạp lên sẽ nằm bên trong vùng làm việc của MDIForm Để form trở thành Child Form thì ta phải khai báo thuộc tính MdiParent ứng vớiMDI Form trong project

Ví dụ thêm mới form3 vào project, khai báo form3 là form con của form1:private void button2_Click(object sender, EventArgs e)

{

Form f2 = new Form3();

//khai báo MDI Form là Form hiện hành

f2.MdiParent = this;

f2.Show();

}

Chú ý: thuộc tính MdiParent không xuất hiện trong cửa sổ thuộc tính khi ở chế

độ thiết kế Và ta không thể sử dụng phương thức ShowDialog để mở cho form dạngChild Form vì kích thước và không gian làm việc của Child Form phụ thuộc vàokhông gian của MDI Form

6.3 Normal Form

1 form mở ra nếu không phải là MDI Form hay Child Form thì sẽ là NormalForm( Form thường) Để hiển thị Form dạng Normal ta cũng có thể sử dụng 2 phươngthức: Show() hay ShowDialog()

Sử dụng phương thức Show() thì form mở ra cho phép chuyển sang chế độ làmviệc trên những Form đã mở trước đó

Sử dụng phương thức ShowDialog() thì form mở ra dạng Modal, không chophép chuyển sang chế độ làm việc form đã mở trước đó trừ khi form này đóng lại

Ngoài ra, ta có thể tạo form bằng đoạn mã rồi nạp chúng lên màn hình :

private void button4_Click(object sender, EventArgs e)

{

Form frm = new Form();

frm.Text = "New Form";

frm.Show();

}

Trang 35

6.4 Thuộc tính của Form

Nhóm thuộc tính nhận dạng

 Thuộc tính Name: Là thuộc tính dùng để nhận dạng duy nhất của đối tượngForm trong Project Mỗi form phải có tên hợp lệ trong thuộc tính Form, không

có 2 Form cùng tên trong 1 Project

 Thuộc tính Text: Thuộc tính Text dùng để trình bày chuỗi trên thanh tiêu đề củaForm, ta có thể khai báo thuộc tính này trogn chế độ thiết kế hoặc trong khi thihành

 Thuộc tính ShowIcon: Mỗi Form khi nạp lên màn hình đều có biểu tượng mặcđịnh góc trên bên trái Biểu tượng này tùy thuộc vào tập tin hình ảnh mà ta khaibáo trong thuộc tính Icon

 Thuộc tính Opacity: cho phép làm trong suốt bề mặt của Form tuỳ thuộc vàogiá trị % khai báo trong thuộc tính này Ta có thể khai báo giá trị % trong khithiết kế hoặc trong lúc thi hành

private void Form1_Load(object sender, EventArgs e)

 Thuộc tính BackColor: Dùng để định dạng màu nền của Form

 Thuộc tính ForeColor: Dùng để định dạng màu mặc định cho chuỗi các Controltrên Form

 Thuộc tính IsMdiContainer: Giá trị mặc định của thuộc tính IsMdiContainer làFalse tương đương với Normal Form Nếu là true sẽ là MDI Form

Thuộc tính chỉ thị:

2 thuộc tính chính của Form dùng để thực hiện chức năng chỉ thị với điều khiển

Button là AcceptButton và CancelButton

 AcceptButton: Khi 1 button được AcceptButton thì khi nhấn Enter tự động nút

đó được thực hiện

Trang 36

 CancelButton: Khi 1 button được CancelButton thì khi nhấn Esc tự động nút đóđược thực hiện.

6.5 Sự kiện của Form

 Sự kiện FormClosed: Sự kiện này xảy ra khi đã đóng form Nếu ta đóng formthì nó sẽ đưa ra lý do tại sao đóng form

private void Form1_FormClosed(object sender, FormClosedEventArgs e)

Trang 37

 Sự kiện Load: xảy ra trước khi form hiển thị lần đầu tiên

private void Form1_Load(object sender, EventArgs e)

 Sự kiện KeyPress: xảy ra khi 1 phím được nhấn

 Sự kiện Resize: xảy ra khi kích thước của Form thay đổi

 Chú ý: Nếu không muốn sử dụng sự kiện đang tồn tại thì R_click vào tên sựkiện trong cửa sổ Properties rồi chọn Reset

Trang 38

BÀI 7: CÁC ĐỐI TƯỢNG 7.1 Sự thừa kế form

Khi có nhiều form có định dạng tương tự nhau, thay vì tạo Form dạng Template

ta có thể thiết kế Form và khai báo mã rồi khai báo kế thừa vào các form khác

Ví dụ, khai báo form để trình bày danh sách tên tập tin của thư mục chỉ địnhnào đó Mỗi khi cần trình bày danh sách mẩu tin, ta chỉ việc khai báo kế thừa từ Formnày và có thể thay đổi định dạng cho phù hợp

Đầu tiên thiết kế Form có tên frmInherit, thêm 3 điều khiển ListView, textbox

và button vào form:

Sau đó khai báo sự kiện click của nút btnShow:

private void btnShow_Click(object sender, EventArgs e) {

}

Trang 39

Thay vì kế thừa từ Form, ta kế thừa từ frmInherit:

public partial class Form6 : frmInherit

Trang 40

Khi thực thi chương trình, thì form6 xuất hiện, tại TextBox ta lựa chọn ổ D:\ thìdanh sách tập tin được trình bày như sau:

Các thuộc tính chung của các điều khiển trên Form:

BackColor Màu nền của điều khiển

ForeColor Màu chữ của chuỗi trình bày trên điều khiển

Text Chuỗi trình bày trên điều khiển

Visible Thuộc tính che dấu hay hiển thị điều khiển

Locked Khóa không cho di chuyển trên Form

Các sự kiện (event) thông thường của điều khiển trên Form:

Click Xảy ra khi người sử dụng nhấn chuột phải

MouseMove Xảy ra khi người sử dụng di chuyển chuột qua vùng làm việc

của điều khiển MouseUp Xảy ra khi người sử dụng nhấn chuột xuống vùng làm việc

của điều khiển rồi thả ra

Ngày đăng: 12/11/2018, 14:09

TỪ KHÓA LIÊN QUAN

w