Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 11 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
11
Dung lượng
609,73 KB
Nội dung
Mục tiêu Biết cách sử dụng lớp đối tượng quản lý file, folder Biết cách sử dụng GDI+ để thực vẽ WinForm Nội dung Chương trình File Explorer đơn giản Ở phần ôn lại cách xây dựng chương trình WinForm - Bước 1: Xây dựng giao diện sau (áp dụng từ giao diện việc duyệt file, folder) cbView tv tv - Bước 2: Phân tích tương tác (hành động) xảy người dùng chương trình để tìm event cần thiết Cần phải lấy liệu thư mục ổ đĩa chương trình khởi chạy nên cần xử lý event Load Form Mục đích cbView phép lựa chọn chế độ View ListView nên cần xử lý event SelectedIndexChanged ComboBox Với việc hiển thị thư mục TreeView chọn TreeView phải có danh sách chứa thư mục chọn nên cần xử lý event AfterSelect TreeView Với ListView tương tác thông thường lựa chọn xem ds thư mục hay thực thi file cách nhấn đúp nên cần xử lý event DoubleClick ListView - Bước 3: Sau có danh sách event tiến hành tạo phương thức xử lý gắn kết thích hợp public frmMain() { InitializeComponent(); Load += new EventHandler(frmMain_Load); cbView.SelectedIndexChanged += new EventHandler(cbView_SelectedIndexChanged); tv.AfterSelect += new TreeViewEventHandler(tv_AfterSelect); lv.DoubleClick += new EventHandler(lv_DoubleClick); } void frmMain_Load(object sender, EventArgs e) { } void cbView_SelectedIndexChanged(object sender, EventArgs e) { } void tv_AfterSelect(object sender, TreeViewEventArgs e) { } void lv_DoubleClick(object sender, EventArgs e) { } - Bước 4: Thực cài đặt phương thức xử lý event (đã qua q trình phân tích u cầu để biết hành động cần làm gì) Event Load Form: cần thực load thư mục máy cho TreeView (sử dụng lớp đối tượng thích hợp từ namespace System.IO) void frmMain_Load(object sender, EventArgs e) { FillTreeView(); } void FillTreeView() { tv.Nodes.Clear(); //đầu tiên thêm node gốc "Computer" TreeNode tn = new TreeNode("Computer"); tv.Nodes.Add(tn); //lấy ds ổ đĩa máy DriveInfo[] arrDriveInfo = DriveInfo.GetDrives(); //lưu ý rằng: PC với hệ thống file/folder vơ lớn //(ít với folder Windows) nên việc duyệt hết thư mục //để đưa vào TreeView lần không khả thi mà nên đưa vào //các node mức ngoài, lựa chọn tiếp tục đưa vào foreach (DriveInfo di in arrDriveInfo) { //cần kiểm tra ổ đĩa có sẵn sàng hay khơng if (!di.IsReady) { continue; } tn = new TreeNode(string.Format("{0}{1}", di.Name, di.VolumeLabel)); //giữ lại thông tin DirectoryInfo để mở tiếp lựa chọn tn.Tag = di.RootDirectory; //đưa vào node gốc TreeView (là node "Computer") tv.TopNode.Nodes.Add(tn); //kiểm tra node có node (sẽ thêm sau) thêm //1 node tạm (để xuất hiên hiển thị TreeView) if (di.RootDirectory.GetDirectories().Length > 0) { var tnTemp = new TreeNode(""); tn.Nodes.Add(tnTemp); } } //expand node gốc cho đẹp tv.TopNode.Expand(); } Event SelectedIndexChanged cbView: thay đổi thuộc tính View ListView tùy vào lựa chọn ComboBox (cần khởi tạo item cho cbView hàm khởi tạo Form) public frmMain() { InitializeComponent(); Load += new EventHandler(frmMain_Load); cbView.SelectedIndexChanged += new EventHandler(cbView_SelectedIndexChanged); tv.AfterSelect += new TreeViewEventHandler(tv_AfterSelect); lv.DoubleClick += new EventHandler(lv_DoubleClick); //tạo item cbView lấy loại enum //(trong trường hợp enum View ListView) cbView.Items.AddRange(Enum.GetNames(typeof(View))); //set lại cho phù hợp với current cbView.SelectedText = lv.View.GetType().Name; } void cbView_SelectedIndexChanged(object sender, EventArgs e) { if (cbView.SelectedIndex >= 0) { lv.View = (View)cbView.SelectedIndex; } } Event AfterSelect TreeView: lựa chọn item TreeView (thể thư mục) nghĩa lựa chọn thư mục nên cần thể (thư mục tệp tin) có thư mục chọn đồng thời load thêm thư mục vào TreeView void tv_AfterSelect(object sender, TreeViewEventArgs e) { //lấy TreeNode chọn TreeNode tnCur = e.Node; //kiểm tra node "Computer" khơng xử lý if (tnCur == tv.TopNode) { return; } //lấy DirectoryInfo tương ứng lưu giữ TreeNode DirectoryInfo diCur = tnCur.Tag as DirectoryInfo; //thêm node cho TreeNode AddChildNodeForTreeNode(tnCur, diCur); //thực điền folder file //folder chọn vào ListView FillListView(diCur); } void AddChildNodeForTreeNode(TreeNode tnCur, DirectoryInfo di) { //trước tiên clear để tránh trùng tnCur.Nodes.Clear(); TreeNode tn = null; foreach (DirectoryInfo diE in di.GetDirectories()) { tn = new TreeNode(diE.Name); tn.Tag = diE; //vì số folder bị phụ thuộc vào quyền truy xuất //nên cần thực khối bắt lỗi try { if (diE.GetDirectories().Length > 0) { var tnTemp = new TreeNode(""); tn.Nodes.Add(tnTemp); } tnCur.Nodes.Add(tn); } catch (Exception) { } } tnCur.Expand(); } void FillListView(DirectoryInfo diCur) { //trước tiên tạo column cho ListView chưa có if (lv.Columns.Count == 0) { string[] arrColumnName = new string[] { "Name", "Type", "Extension" }; ColumnHeader ch = null; foreach (string cn in arrColumnName) { ch = new ColumnHeader(); ch.Text = cn; lv.Columns.Add(ch); } } //bắt đầu thêm item cho ListView lv.Items.Clear(); ListViewItem lvi = null; //lấy folder trước foreach (DirectoryInfo di in diCur.GetDirectories()) { lvi = new ListViewItem(di.Name); lvi.SubItems.Add("Folder"); lvi.Tag = di; lv.Items.Add(lvi); } //tiếp theo lấy file foreach (FileInfo fi in diCur.GetFiles()) { lvi = new ListViewItem(fi.Name); lvi.SubItems.Add("File"); lvi.SubItems.Add(fi.Extension); lvi.Tag = fi; lv.Items.Add(lvi); } } Event DoubleClick ListView: folder tiếp tục mở vào trong, file thực thi (ở mở MessageBox) void lv_DoubleClick(object sender, EventArgs e) { if (lv.SelectedItems.Count == 0) { return; } //lấy ListViewItem chọn ListViewItem lviCur = lv.SelectedItems[0]; //lấy DirectoryInfo tương ứng var diCur = lviCur.Tag as DirectoryInfo; //phải kiểm tra file if (diCur != null) { //thực fill ListView FillListView(diCur); } else { var fiCur = lviCur.Tag as FileInfo; MessageBox.Show(string.Format("Là file: {0}", fiCur.Name)); } } - Bước 5: Thực thi chương trình Một số loại Custom Control Extended Control control tạo cách kế thừa từ control có sẵn (mục đích khơng thay đổi cách thể hành vi mà thêm vào số chức cần thiết) Ví dụ TextBox cho nhập số - Bước 1: Thêm class vào project đặt tên MyTextBox - Bước 2: Cài đặt cho class MyTextBox sau: public class MyTextBox : TextBox { //để ngăn chặn việc nhập khơng phải ký số //cần cài đặt lại cách xử lý nhấn phím //của TextBox protected override void OnKeyPress(KeyPressEventArgs e) { //tất phím khơng phải ký số hay //phím điều khiển (ENTER, BACK, ) bỏ qua if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar)) { //bỏ qua event cách thông báo với //hệ thống event xử lý xong e.Handled = true; } base.OnKeyPress(e); } } - Bước 3: Biên dịch chương trình thêm MyTextBox vào Form từ ToolBox để sử dụng Ví dụ PictureBox cho phép thay đổi hình nhấn chuột (nhấn LEFT hay RIGHT thứ tự thay đổi khác nhau) - Bước 1: Thêm class MyPictureBox vào project - Bước 2: Cài đặt sau: public class MyPictureBox : PictureBox { //đặt thuộc tính lưu trữ hình public ImageList ListIMG { get; set; } //lưu lại số hình int indexIMG = 0; //để thay đổi hình dựa vào việc nhấn chuột //thì cài đặt lại xử lý cho event MouseDown protected override void OnMouseDown(MouseEventArgs e) { int numIMG = ListIMG.Images.Count; //kiểm tra ds hình có hay chưa if (numIMG > 0) { //tùy theo việc nhấn LEFT hay RIGHT switch (e.Button) { case MouseButtons.Left: indexIMG = (indexIMG + 1) % numIMG; break; case MouseButtons.Right: indexIMG -= 1; if (indexIMG < 0) { indexIMG = numIMG - 1; } break; } //thay đổi hình this.Image = ListIMG.Images[indexIMG]; } base.OnMouseDown(e); } } - Bước 3: Biên dịch thêm MyPictureBox vào Form thông qua ToolBox để sử dụng Có thể gán ImageList vào ListIMG từ designer (trước phải tạo ImageList) Composite Control (hay User Control) tập hợp nhiều control có sẵn để hồn thành hành động cộng tác Ví dụ tạo ProgressBar có hiển thị thơng tin text - Bước 1: Thêm UserControl vào project đặt tên ucProgressBar - Bước 2: Thiết kế giao diện ucProgressBar sau proBar lblInfo - Bước 3: Xây dựng frmCC sau - Bước 4: Cài đặt cho frmCC sau public partial class frmCC : Form { public frmCC() { InitializeComponent(); ucProgressBar1.Step = 5; ucProgressBar1.Maximum = 200; ucProgressBar1.Value = 36; btnStep.Click += new EventHandler(btnStep_Click); } void btnStep_Click(object sender, EventArgs e) { ucProgressBar1.PerformStep(); } } - Bước 5: Thực thi chương trình Thực hành GDI+ Mở form vẽ hình lên form (đoạn thẳng, hình chữ nhật, hình ellipse, hình vng, hình trịn) - Bước 1: Tạo project WinForm đặt tên form frmGDIPlus - Bước 2: Để vẽ cần yếu tố quan trọng đối tượng Graphics (hiểu đơn giản đại diện cho bề mặt để vẽ, gắn liền với đối tượng cụ thể nên tạo từ đối tượng (1 control chẳng hạn) tự tạo) Cách đơn giản để có đối tượng Graphics lấy event Paint control public frmGDIPlus() { InitializeComponent(); Paint += new PaintEventHandler(frmGDIPlus_Paint); } void frmGDIPlus_Paint(object sender, PaintEventArgs e) { } - Bước 3: Lấy đối tượng Graphics event Paint thực vẽ hình void frmGDIPlus_Paint(object sender, PaintEventArgs e) { //lấy đối tượng Graphics Graphics g = e.Graphics; //để vẽ hình (liên quan đến vẽ nét) //thì cần có đối tượng Pen Pen pen = Pens.DarkRed; //để tơ màu cần có Brush Brush brush = Brushes.LightSkyBlue; //thực vẽ đoạn thẳng //cần điểm đầu cuối Point p1 = new Point(10, 10); Point p2 = new Point(100, 100); g.DrawLine(pen, p1, p2); //thực vẽ hình chữ nhật //khái niệm hình chữ nhật tương đương //đối tượng Recangle NET //định hình tọa độ X, Y kích thước Width, Height Rectangle rect = new Rectangle(p2.X, p2.Y, 200, 150); g.DrawRectangle(pen, rect); //tô màu hình chữ nhật rect.X += (int)pen.Width; rect.Y += (int)pen.Width; rect.Width -= (int)pen.Width * 2; rect.Height -= (int)pen.Width * 2; g.FillRectangle(brush, rect); //thực vẽ hình ellipse g.DrawEllipse(pen, rect); //thực vẽ hình vng //hình vng hình chữ nhật có cạnh rect.Height = rect.Width; rect.X += rect.Width + 10; g.DrawRectangle(pen, rect); //thực vẽ đường tròn g.DrawEllipse(pen, rect); } - Bước 4: Thực thi chương trình Bài tập Bài Hoàn thành Explorer, làm thêm chức có hiển thị icon tương đối hợp lý, đồng thời làm Button Back cho ListView Bài Hoàn thành loại User Control Bài Sử dụng GDI+ để viết chương trình Paint đơn giản ... Bước 4: Thực thi chương trình Bài tập Bài Hồn thành Explorer, làm thêm chức có hiển thị icon tương đối hợp lý, đồng thời làm Button Back cho ListView Bài Hoàn thành loại User Control Bài Sử dụng... ucProgressBar1.Value = 36 ; btnStep.Click += new EventHandler(btnStep_Click); } void btnStep_Click(object sender, EventArgs e) { ucProgressBar1.PerformStep(); } } - Bước 5: Thực thi chương trình Thực hành GDI+... sender, EventArgs e) { } - Bước 4: Thực cài đặt phương thức xử lý event (đã qua trình phân tích u cầu để biết hành động cần làm gì) Event Load Form: cần thực load thư mục máy cho TreeView (sử