Tài liệu Windows Form Microsoft .NET Framework phần 4 doc

12 546 0
Tài liệu Windows Form Microsoft .NET Framework phần 4 doc

Đ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

1.1 Sử dụng phần menu cho menu ngữ cảnh Bạn cần tạo menu ngữ cảnh hiển thị item giống với số item menu ứng dụng Sử dụng phương thức CloneMenu lớp MenuItem để lại phần menu Trong nhiều ứng dụng, menu ngữ cảnh điều kiểm lại phần menu Tuy nhiên, NET không cho phép bạn tạo đối tượng MenuItem lúc nằm nhiều menu Giải pháp tạo phần menu phương thức CloneMenu Phương thức không chép item MenuItem (và submenu), mà đăng ký đối tượng MenuItem với phương thức thụ lý kiện Do đó, người dùng nhắp vào item menu ngữ cảnh (bản sao), phương thức thụ lý kiện tương ứng thực thi thể người dùng nhắp vào item menu Ví dụ, xét ứng dụng thử nghiệm hình 6.6 Trong ví dụ này, menu ngữ cảnh cho TextBox hiển thị item giống menu File Đây đối tượng MenuItem, người dùng nhắp vào item, phương thức thụ lý kiện tương ứng thực thi The image part with relationship ID rId5 was not found in the file Hình 6.6 Chép phần menu vào menu ngữ cảnh Dưới phần mã cho form để tạo ví dụ Nó lại item menu form nạp (đáng tiếc thao tác với item lúc thiết kế) using System; using System.Windows.Forms; using System.Drawing; public class ContextMenuCopy : System.Windows.Forms.Form { // (Bỏ qua phần mã designer.) private void ContextMenuCopy_Load(object sender, System.EventArgs e) { ContextMenu mnuContext = new ContextMenu(); // Chép item từ menu File vào menu ngữ cảnh foreach (MenuItem mnuItem in mnuFile.MenuItems) { mnuContext.MenuItems.Add(mnuItem.CloneMenu()); } // Gắn menu ngữ cảnh vào TextBox TextBox1.ContextMenu = mnuContext; } private void TextBox1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { if (e.Button == MouseButtons.Right){ TextBox1.ContextMenu.Show(TextBox1, new Point(e.X, e.Y)); } } private void mnuOpen_Click(object sender, System.EventArgs e) { MessageBox.Show("This is the event handler for Open."); } private void mnuSave_Click(object sender, System.EventArgs e) { MessageBox.Show("This is the event handler for Save."); } private void mnuClick_Click(object sender, System.EventArgs e) { MessageBox.Show("This is the event handler for Exit."); } } 1.2 Tạo form đa ngôn ngữ Bạn cần tạo form địa hóa (localizable form); nghĩa form triển khai nhiều ngôn ngữ khác Lưu trữ tất thông tin địa đặc thù file resource (các file biên dịch thành Satellite Assembly) .NET Framework hỗ trợ địa hóa (localization) thơng qua việc sử dụng file resource Ý tưởng lưu trữ thông tin địa đặc thù (chẳng hạn, phần text Button) file resource Sau đó, bạn tạo nhiều file resource cho nhiều địa khác biên dịch chúng thành Satellite Assembly Khi chạy ứng dụng, NET tự động sử dụng Satellite Assembly dựa thiết lập địa (locale setting) máy tính hành Bạn đọc ghi file resource mã lệnh Tuy nhiên, Visual Studio NET hỗ trợ việc thiết kế form địa hóa: Trước tiên, thiết lập thuộc tính Localizable form true cửa sổ Properties Thiết lập thuộc tính Language form địa bạn muốn nhập thông tin cho (xem hình 6.7) Kế đó, cấu hình thuộc tính địa hóa tất điều kiểm form Thay lưu trữ thay đổi phần mã thiết kế form, Visual Studio NET tạo file resource để lưu trữ liệu bạn Lặp lại bước cho ngôn ngữ bạn muốn hỗ trợ Mỗi lần thế, file resource tạo Nếu bạn thay đổi thuộc tính Language thành địa mà bạn cấu hình thiết lập trước xuất trở lại, bạn chỉnh sửa chúng The image part with relationship ID rId6 was not found in the file Hình 6.7 Chọn ngơn ngữ để địa hóa form Bây giờ, bạn biên dịch thử nghiệm ứng dụng hệ thống địa khác Visual Studio NET tạo thư mục Satellite Assembly riêng biệt file resource dự án Bạn chọn Project | Show All Files từ trình đơn Visual Studio NET để xem file bố trí (xem hình 6.8) Bạn buộc ứng dụng chấp nhận địa cụ thể cách thay đổi thuộc tính Thread.CurrentUICulture Tuy nhiên, bạn phải thay đổi thuộc tính trước form nạp The image part with relationship ID rId7 was not found in the file Hình 6.8 Satellite assembly cho địa Vietnamese using System; using System.Windows.Forms; using System.Threading; using System.Globalization; public class MultiLingualForm : System.Windows.Forms.Form { private System.Windows.Forms.Label label1; // (Bỏ qua phần mã designer.) static void Main() { Thread.CurrentThread.CurrentUICulture = new CultureInfo("vi"); Application.Run(new MultiLingualForm()); } } Bạn sử dụng tiện ích WinRes.exe (nằm thư mục \Program Files\Microsoft Visual Studio NET 2003\SDK\v1.1\Bin) để soạn thảo thơng tin resource Nó cung cấp trình soạn thảo form thu nhỏ khơng có chức chỉnh sửa mã nguồn, hữu dụng cho nhà phiên dịch chuyên gia phi lập trình cần nhập thông tin địa đặc thù The image part with relationship ID rId8 was not found in the file Hình 6.9 Tiện ích Windows Resource Localization Editor Ngồi tiện ích trên, bạn sử dụng chương trình chun dùng địa hóa ứng dụng, chẳng hạn RC-WinTrans (bạn tải dùng thử [http://www.schaudin.com]) Chương trình cho phép bạn phát triển dự án phần mềm đa ngôn ngữ hay địa hóa ứng dụng có sẵn Win32, NET, Java 1.3 Tạo form di chuyển Bạn muốn tạo form chiếm giữ vị trí cố định hình khơng thể di chuyển Tạo form không đường viền cách thiết lập thuộc tính FormBorderStyle form None Bạn tạo form không đường viền cách thiết lập thuộc tính FormBorderStyle None Các form khơng thể di chuyển Và chúng khơng có kiểu đường viền—nếu muốn có đường viền xanh, bạn phải tự thêm vào cách viết mã sử dụng hình Cịn cách khác để tạo form khơng thể di chuyển có kiểu đường viền giống điều kiểm Trước tiên, thiết lập thuộc tính ControlBox, MinimizeBox, MaximizeBox form false Kế tiếp, thiết lập thuộc tính Text chuỗi rỗng Khi đó, form có đường viền màu xám đường kẻ màu đen (tùy thuộc vào tùy chọn FormBorderStyle mà bạn sử dụng), tương tự Button 1.4 Làm cho form không đường viền di chuyển Bạn muốn tạo form khơng có đường viền di chuyển Điều gặp trường hợp bạn cần tạo cửa sổ tùy biến có hình dáng “độc vơ nhị” (ví dụ, ứng dụng game media player) Tạo điều kiểm đáp ứng cho kiện MouseDown, MouseUp, MouseMove; viết mã để di chuyển form Người dùng thường sử dụng tiêu đề để di chuyển form Tuy nhiên, form khơng có đường viền khơng có tiêu đề Bạn bù vào thiếu hụt cách thêm điều kiểm vào form để phục vụ mục đích Ví dụ, form hình 6.10 chứa Label hỗ trợ việc kéo rê Người dùng nhắp vào Label này, kéo rê form đến vị trí khác hình lúc giữ chuột Khi người dùng di chuyển chuột, form tự động di chuyển tương ứng (form “gắn” với trỏ chuột) The image part with relationship ID rId9 was not found in the file Hình 6.10 Form khơng có đường viền di chuyển Để thực giải pháp này, bạn cần thực bước sau: Tạo biến cờ mức-form dùng để theo vết form (form có kéo rê hay không) Khi người dùng nhắp vào Label, cờ thiết lập biết form chế độ kéo rê Cùng lúc này, vị trí thời chuột ghi lại Bạn cần thêm logic vào phương thức thụ lý kiện Label.MouseDown Khi người dùng di chuyển chuột Label, form di chuyển tương ứng để vị trí chuột Label không thay đổi Bạn cần thêm logic vào phương thức thụ lý kiện Label.MouseMove Khi người dùng thả chuột, chế độ kéo rê chuyển thành off Bạn cần thêm logic vào phương thức thụ lý kiện Label.MouseUp Dưới phần mã hoàn chỉnh cho form: using System; using System.Windows.Forms; using System.Drawing; public class DragForm : System.Windows.Forms.Form { // (Bỏ qua phần mã designer.) // Biến cờ dùng để theo vết form // Nếu chế độ kéo rê, việc di chuyển chuột // Label chuyển thành việc di chuyển form private bool dragging; // Lưu trữ offset (vị trí nhắp vào Label) private Point pointClicked; private void lblDrag_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e) { if (e.Button == MouseButtons.Left) { dragging = true; pointClicked = new Point(e.X, e.Y); } else { dragging = false; } } private void lblDrag_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e) { if (dragging) { Point pointMoveTo; // Tìm vị trí chuột tọa độ hình pointMoveTo = this.PointToScreen(new Point(e.X, e.Y)); pointMoveTo.Offset(-pointClicked.X, -pointClicked.Y); // Di chuyển form this.Location = pointMoveTo; } } private void lblDrag_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e) { dragging = false; } private void cmdClose_Click(object sender, System.EventArgs e) { this.Close(); } } 1.5 Tạo icon động khay hệ thống Bạn cần tạo icon động khay hệ thống (chẳng hạn, cho biết tình trạng tác vụ chạy) Tạo hiển thị NotifyIcon Sử dụng Timer, Timer phát sinh cách định kỳ (mỗi giây chẳng hạn) cập nhật thuộc tính NotifyIcon.Icon Với NET Framework dễ dàng để hiển thị icon khay hệ thống NotifyIcon Bạn cần thêm điều kiểm vào form, cung cấp hình icon thuộc tính Icon Bạn thêm menu ngữ cảnh vào điều kiểm thuộc tính ContextMenu (tùy chọn) Không giống với điều kiểm khác, NotifyIcon tự động hiển thị menu ngữ cảnh nhắp phải Bạn làm động icon khay hệ thống cách thay đổi icon định kỳ Ví dụ, chương trình sau sử dụng tám icon, thể hình mặt trăng từ khuyết đến đầy Bằng cách dịch chuyển từ hình sang hình khác, ảo giác hình động tạo using System; using System.Windows.Forms; using System.Drawing; public class AnimatedSystemTrayIcon : System.Windows.Forms.Form { // (Bỏ qua phần mã designer.) Icon[] images; int offset = 0; private void Form1_Load(object sender, System.EventArgs e) { // Nạp vào tám icon images = new Icon[8]; images[0] = new Icon("moon01.ico"); images[1] = new Icon("moon02.ico"); images[2] = new Icon("moon03.ico"); images[3] = new Icon("moon04.ico"); images[4] = new Icon("moon05.ico"); images[5] = new Icon("moon06.ico"); images[6] = new Icon("moon07.ico"); images[7] = new Icon("moon08.ico"); } private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) { // Thay đổi icon // Phương thức thụ lý kiện phát sinh giây lần notifyIcon.Icon = images[offset]; offset++; if (offset > 7) offset = 0; } } 1.6 Xác nhận tính hợp lệ đầu vào cho điều kiểm Bạn cần cảnh báo cho người dùng có liệu khơng hợp lệ nhập vào điều kiểm (như TextBox) Sử dụng ErrorProvider để hiển thị icon lỗi kế bên điều kiểm có lỗi Kiểm tra lỗi trước cho phép người dùng tiếp tục Có số cách để bạn thực việc xác nhận tính hợp lệ ứng dụng dựa-trên-Windows Một cách tiếp cận đáp ứng kiện điều khiển việc xác nhận tính hợp lệ khơng cho người dùng thay đổi focus từ điều kiểm sang điều kiểm khác lỗi xảy Một cách tiếp cận khác dựng cờ cho điều kiểm có lỗi theo cách để người dùng nhìn thấy tất lỗi lượt Bạn sử dụng cách tiếp cận NET với điều kiểm ErrorProvider ErrorProvider điều kiểm provider đặc biệt, sử dụng để hiển thị icon lỗi kế bên điều kiểm có lỗi Bạn hiển thị icon lỗi kế bên điều kiểm cách sử dụng phương thức ErrorProvider.SetError, định điều kiểm thích hợp chuỗi thông báo lỗi ErrorProvider hiển thị icon lỗi cách tự động bên phải điều kiểm Khi người dùng đưa chuột lên icon lỗi, xuất thơng báo chi tiết (xem hình 6.11) Chỉ cần thêm ErrorProvider vào form, bạn sử dụng để hiển thị icon lỗi kế bên điều kiểm Để thêm ErrorProvider, bạn kéo vào khay thành phần (component tray) tạo mã Đoạn mã kiểm tra nội dung TextBox phím nhấn, xác nhận tính hợp lệ TextBox biểu thức quy (kiểm tra nội dung TextBox có tương ứng với địa email hợp lệ hay không) Nếu nội dung không hợp lệ, ErrorProvider sử dụng để hiển thị thông báo lỗi Nếu nội dung hợp lệ, thơng báo lỗi có ErrorProvider bị xóa Cuối cùng, phương thức thụ lý kiện Click cho nút OK duyệt qua tất điều kiểm form xác nhận khơng điều kiểm có lỗi trước cho phép ứng dụng tiếp tục The image part with relationship ID rId10 was not found in the file Hình 6.11 Form xác nhận tính hợp lệ với ErrorProvider using System; using System.Windows.Forms; using System.Text.RegularExpressions; public class ErrorProviderValidation : System.Windows.Forms.Form { // (Bỏ qua phần mã designer.) private void txtEmail_TextChanged(object sender, System.EventArgs e) { Regex regex; regex = new Regex(@"\S+@\S+\.\S+"); Control ctrl = (Control)sender; if (regex.IsMatch(ctrl.Text)) { errProvider.SetError(ctrl, ""); } else { errProvider.SetError(ctrl, "This is not a valid e-mail address."); } } private void cmdOK_Click(object sender, System.EventArgs e) { string errorText = ""; bool invalidInput = false; foreach (Control ctrl in this.Controls) { if (errProvider.GetError(ctrl) != "") { errorText += " * " + errProvider.GetError(ctrl) + "\n"; invalidInput = true; } } if (invalidInput) { MessageBox.Show( "The form contains the following unresolved errors:\n\n" + errorText, "Invalid Input", MessageBoxButtons.OK, MessageBoxIcon.Warning); } else { this.Close(); } } } ... chỉnh cho form: using System; using System .Windows. Forms; using System.Drawing; public class DragForm : System .Windows. Forms .Form { // (Bỏ qua phần mã designer.) // Biến cờ dùng để theo vết form //... Java 1.3 Tạo form di chuyển Bạn muốn tạo form chiếm giữ vị trí cố định hình khơng thể di chuyển Tạo form khơng đường viền cách thiết lập thuộc tính FormBorderStyle form None Bạn tạo form khơng... System.Threading; using System.Globalization; public class MultiLingualForm : System .Windows. Forms .Form { private System .Windows. Forms.Label label1; // (Bỏ qua phần mã designer.) static void Main()

Ngày đăng: 23/12/2013, 20:15

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan