Giáo trình Lập trình Windows Forms với C# (Phần 2)

pdf 129 trang Gia Huy 17/05/2022 21761
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình Windows Forms với C# (Phần 2)", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdfgiao_trinh_lap_trinh_windows_forms_voi_c_phan_2.pdf

Nội dung text: Giáo trình Lập trình Windows Forms với C# (Phần 2)

  1. CHƢƠNG 6: ĐIỀU KHIỂN CHỨA CÁC ĐIỀU KHIỂN KHÁC 6.1. Điều khiển GroupBox GroupBox là dạng điều khiển chứa, có thể chứa các điều khiển khác hiển thị trên form, giúp cho việc thiết kế giao diện của form dễ nhìn và khoa học hơn. GroupBox không hỗ trợ thanh trượt (ScrollBar). GroupBox có thể có tiêu đề hiển thị, tiêu đề này được thiết lập trong thuộc tính Text. Nếu không muốn hiển thị tiêu đề, lập trình viên có thể thiết lập chuỗi rỗng trong thuộc tính Text. Điều khiển GroupBox được đặt trong nhóm Containers của cửa sổ Toolbox như hình 6.1. Hình 6.1: Điều khiển GroupBox trong cửa sổ Toolbox Thông thường GroupBox sử dụng để nhóm điều khiển RadioButton (xem mục 3.5.2 của chương 3).  Một số thuộc tính thường dùng của GroupBox: Bảng 6.1: Bảng mô tả các thuộc tính của GroupBox Thuộc tính Mô tả Name Đặt tên cho GroupBox Text Chuỗi hiển thị Font Thiết lập kiểu chữ, kích thước chữ, ForeColor Thiết lập màu chữ hiển thị BackColor Thiết lập màu nền của GroupBox Visible Mang giá trị True hoặc False. - Nếu là True: Hiển thị GroupBox - Nếu là False: Không hiển thị GroupBox AutoSize Mang giá trị True hoặc False. 176
  2. - Nếu là True: GroupBox tự động thay đổi kích thước để có thể hiển thị hết các điều khiển chứa bên trong - Nếu là False: GroupBox có kích thước như lập trình viên thiết lập. AutoSizeMode Quy định cách thức điều khiển thay đổi kích thước. - GrowAndShrink: GroupBox có thể co và giãn - GrowOnly: Mặc định, chỉ giãn lớn Khi thiết lập giá trị thuộc tính cho GroupBox trong bảng 6.1, thì những điều khiển như: RadioButton, TextBox, Label, nếu nằm trong GroupBox cũng sẽ có những giá trị thuộc tính tương tự như của GroupBox. Ví dụ 6.1: Viết chương trình định dạng chuỗi văn bản, thiết kế giao diện chương trình như hình 6.2. Hình 6.2: Giao diện forn định dạng chuỗi ví dụ 6.1 Yêu cầu: Khi người dùng nhập chuỗi văn bản trong TextBox thì Label “Chuỗi định dạng” sẽ hiển thị chuỗi văn bản vừa nhập. Khi nhấp chuột chọn các Radio trong GroupBox “Màu” và GroupBox “Kiểu hiển thị” thì chuỗi định dạng sẽ thay đổi định dạng tương ứng với lựa chọn của người dùng. Bước 1: Thiết kế giao diện chương trình. Kéo các điều khiển: Label, GroupBox, RadioButton, TextBox từ cửa sổ Toolbox vào form như hình 6.3. 177
  3. textBox1 Hình 6.3: Giao diện form sau khi thêm các điều khiển vào form Bước 2: Thiết lập giá trị thuộc tính cho các điều khiển trong cửa sổ Properties - label1: Thuộc tính Text: “Định dạng chuỗi” Thuộc tính Size: 14 Thuộc tính FontStyle: Bold - label2: Thuộc tính Text: “Nhập chuỗi muốn định dạng:” - label3: Thuộc tính Text: “Chuỗi định dạng” Thuộc tính Name: lblChuoiDinhDang - textBox1: Thuộc tính Name: txtNhapChuoi - groupBox1: Thuộc tính Text: “Màu” - groupBox2: Thuộc tính Text: “Kiểu hiển thị” - groupBox3: Thuộc tính Text: “Chuỗi sau khi định dạng” - radioButton1: Thuộc tính Name: radXanh - radioButton2: Thuộc tính Name: radDo - radioButton3: 178
  4. Thuộc tính Name: radDen - radioButton4: Thuộc tính Name: radInDam - radioButton5: Thuộc tính Name: radInNghieng - radioButton6: Thuộc tính Name: radGachChan - button1: Thuộc tính Name: btnThoat Thuộc tính Text: “Thoát” Bước 3: Viết mã lệnh cho điều khiển - Sự kiện Click của nút btnThoat: privatevoid btnThoat_Click(object sender, EventArgs e) { Close(); } - Sự kiện TextChanged của txtNhapChuoi: private void txtNhapChuoi_TextChanged(object sender, EventArgs e) { lblChuoiDinhDang.Text = txtNhapChuoi.Text; } - Sự kiện CheckedChanged của radXanh: private void radXanh_CheckedChanged(object sender, EventArgs e) { if (radXanh.Checked == true) { lblChuoiDinhDang.ForeColor = Color.Blue; } } - Sự kiện CheckedChanged của radDo: private void radDo_CheckedChanged(object sender, EventArgs e) { if (radDo.Checked == true) { lblChuoiDinhDang.ForeColor = Color.Red; } } 179
  5. - Sự kiện CheckedChanged của radDen: private void radDen_CheckedChanged(object sender, EventArgs e) { if (radDen.Checked == true) { lblChuoiDinhDang.ForeColor = Color.Black; } } - Sự kiện CheckedChanged của radInDam: private void radInDam_CheckedChanged(object sender, EventArgs e) { if (radInDam.Checked == true) { lblChuoiDinhDang.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Bold); } } - Sự kiện CheckedChanged của radInNghieng: private void radInNghieng_CheckedChanged(object sender, EventArgs e) { if (radInNghieng.Checked == true) { lblChuoiDinhDang.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Italic); } } - Sự kiện CheckedChanged của radGachChan: private void radGachChan_CheckedChanged(object sender, EventArgs e) { if (radGachChan.Checked == true) { lblChuoiDinhDang.Font = new System.Drawing.Font("Microsoft Sans Serif", 12F, System.Drawing.FontStyle.Underline); } } 180
  6. 6.2. Điều khiển Panel Cũng như GroupBox, Panel là một điều khiển dùng để chứa các điều khiển khác. Panel có các thuộc tính AutoSize, AutoSizeMode như GroupBox và thuộc tính đường viền BorderStyle như Label. Điểm khác biệt của Panel với GroupBox là điều khiển Panel không có tiêu đề mô tả (không có thuộc tính Text) và có thanh trượt ScrollBar ngang và ScollBar dọc (có thuộc tính AutoScroll). Điều khiển Panel đặt trong nhóm Containers của cửa sổ Toolbox như hình 6.4 Hình 6.4: Điều khiển Panel trong cửa sổ Toolbox  Một số thuộc tính thường dùng của Panel: Bảng 6.2: Bảng mô tả các thuộc tính của Panel Thuộc tính Mô tả AutoScroll Mang giá trị True hoặc False. - Nếu là True: Panel tự động xuất hiện thanh trượt khi kích thước Panel không thể hiển thị hết các điều khiển chứa bên trong - Nếu là False: Panel sẽ không hiển thị thanh trượt BorderStyle Kiểu đường viền của Panel khi hiển thị. Có 3 giá trị: None, FixedSingle và Fixed3D - None: Không hiển thị đường viền - FixedSingle:Quanh Panel sẽ hiển thị một đường viền đơn. - Fixed3D: Hiển thị đường viền của Panel dạng 3 chiều. 181
  7. 6.3. Điều khiển FlowLayoutPanel FlowLayoutPanel là lớp con của điều khiển Panel, do đó có thể chứa các điều khiển khác như Panel. Mục đích chính của FlowLayoutPanel là giúp bố trí các điều khiển trên form một cách có tổ chức và khoa học. Khi thêm một điều khiển nào đó vào FlowLayoutPanel thì FlowLayoutPanel sẽ tự động sắp xếp các điều khiển đặt bên trong theo quy tắc định trước và đồng thời cũng thay đổi kích thước của các điều khiển bên trong cho phù hợp với kích thước của FlowLayoutPanel. Vì vậy có thể nói điều khiển FLowLayoutPanel là điều khiển hỗ trợ tuyệt vời trong việc thiết kế giao diện người dùng. Điều khiển FlowLayoutPanel nằm trong nhóm Containers của cửa sổ Toolbox như hình 6.5. Hình 6.5: Điều khiển FlowLayoutPanel trên cửa sổ Toolbox Điều khiển FlowLayoutPanel cũng hỗ trợ dạng thanh trượt (ScrollBar) như Panel, khi thuộc tính AutoScroll được thiết lập là True thì khi kích thước các điển khiển được chứa vượt ngoài kích thước FlowLayoutPanel, thì FlowLayoutPanel sẽ hiển thị thanh trượt. Việc bố trí các điều khiển khi thêm vào FlowLayoutPanel như thế nào là do thuộc tính FlowDirection quy định. Thuộc tính tính mang 4 giá trị cho phép các điều khiển lần lượt thêm vào theo 4 hướng: từ trái qua phải (LeftToRight), từ phải qua trái (RightToLeft), từ trên xuống (TopDown) và từ dưới lên (BottomUp). Các điều khiển được thêm vào đến khi vượt ngoại phạm vi của FlowLayoutPanel, nếu muốn các điều khiển tự động bố trí xuống dòng mới hoặc sang một cột mới như các hình 6.6, hình 6.7, hình 6.8 và hình 6.9, thì cần phải thiết lập thuộc tính WrapContents là True. Còn nếu thuộc tính WrapContents là False thì FLowLayoutPanel sẽ hiển thị thanh trượt (thuộc tính AutoScroll là True) để hiển thị các điều khiển nằm ngoài phạm vi. Thuộc tính FlowDirection là LeftToRight: 182
  8. Hình 6.6: Bố trí điều khiển từ trái sang phải với WrapContents là True Thuộc tính FlowDirection là RightToLeft: Hình 6.7: Bố trí điều khiển từ phải sang trái với WrapContents là True Thuộc tính FlowDirection là TopDown: Hình 6.8: Bố trí điều khiển từ trên xuống dưới với WrapContents là True Thuộc tính FlowDirection là BottomUp: Hình 6.9: Bố trí điều khiển từ dưới lên trên với WrapContents là True  Một số thuộc tính thường dùng của FLowLayoutPanel: 183
  9. Bảng 6.3: Bảng mô tả các thuộc tính của FLowLayoutPanel Thuộc tính Mô tả AutoScroll Mang giá trị True hoặc False. - Nếu là True: FLowLayoutPanel tự động xuất hiện thanh trượt khi kích thước Panel không thể hiển thị hết các điều khiển chứa bên trong - Nếu là False: FLowLayoutPanel sẽ không hiển thị thanh trượt BorderStyle Kiểu đường viền của FLowLayoutPanel khi hiển thị. Có 3 giá trị: None, FixedSingle và Fixed3D - None: Không hiển thị đường viền - FixedSingle:Quanh FLowLayoutPanel sẽ hiển thị một đường viền đơn. - Fixed3D: Hiển thị đường viền của FLowLayoutPanel dạng 3 chiều. FlowDirection Cách thức bổ trí các điều khiển khi các điều khiển nằm ngoài phạm vi của FLowLayoutPanel. Bao gồm 4 giá trị: LeftToRight, RightToLeft, TopDown, BottomUp WrapContents Mang giá trị True hoặc False. - Nếu là True: Các điều khiển vượt ngoài kích thước FLowLayoutPanel sẽ tự động bố trí trên một dòng mới hoặc một cột mới - Nếu là False: FLowLayoutPanel sẽ xuất hiện thanh trượt để hiển thị các điều khiển ngoài kích thuốc của FLowLayoutPanel (với thuộc tính AutoSroll là True). Nếu thuộc tính AutoSroll là False thì các điều khiển nằm ngoài kích thước sẽ bị ẩn đi.  Phương thức thường dùng của FLowLayoutPanel: Bảng 6.4: Bảng mô tả các phương thức của FLowLayoutPanel Phƣơng thức Mô tả Controls.Add Phương thức có chức năng thêm điều khiển vào FlowLayoutPanel Ví dụ 6.2: Thiết kế giao diện chương trình gồm có 1 PictureBox và 1 FlowLayoutPanel như hình 6.10. Với FlowLayoutPanel chứa danh sách các hình. Khi người dùng nhấp chuột chọn hình nào trong FlowLayoutPanel thì hình đó sẽ hiển thị trên PictureBox. 184
  10. Hình 6.10: Giao diện form hiển thị hình ví dụ 6.2 Hướng dẫn: Bước 1: Thiết kế giao diện chương trình. Kéo các điều khiển FlowLayoutPanel, PictureBox và ImageList và form như hình 6.11. Hình 6.11: Giao diện form sau khi thêm PictureBox, FlowLayoutPicture và ImageList Bước 2: Thiết lập giá trị thuộc tính cho điều khiển trong cửa sổ Properties - Form1: Thuộc tính Text: “FlowLayoutPanel” - pictureBox1: Thuộc tính Name: myPictureBox - flowLayoutPanel1: Thuộc tính Name: myFlowLayoutPanel Thuộc tính BorderStyle: FixSingle Thuộc tính AutoScroll: True 185
  11. Thuộc tính WrapContents: False - imageList1: Thuộc tính Name: myImageList Thuộc tính ImageSize: 256, 256 Thuộc tính Images: Thêm một số hình ảnh vào myImageList như hình 6.12 Hình 6.12: Cửa sổ thêm hình cho myImageList Bước 3: Viết mã lệnh cho điều khiển - Sự kiện Load của Form1: private void Form1_Load(object sender, EventArgs e) { for (int i = 0; i < myImageList.Images.Count; i++) { PictureBox pic = new PictureBox(); pic.Image = myImageList.Images[i]; pic.Size = new Size(50, 50); pic.Click += new EventHandler(Form1_Click); myFlowLayoutPanel.Controls.Add(pic); } } 186
  12. - Sự kiện Click của Form1: private void Form1_Click(object sender, EventArgs e) { try { PictureBox pic = (PictureBox)sender; myPictureBox.Image = pic.Image; }catch (Exception ex) { } } 6.4. Điều khiển TableLayoutPanel Cũng như điều khiển FlowLayoutPanel, TableLayoutPanel là điều khiển dẫn xuất từ điều khiển Panel và được dùng cho mục đích thiết kế giao diện form. TableLayoutPanel nằm trong nhóm Containers của cửa sổ Toolbox như hình 6.13. Hình 6.13: Điều khiển TableLayoutPanel trong cửa sổ Toolbox TableLayoutPanel bao gồm các ô theo dòng và cột để thêm điều khiển vào. Lập trình viên có thể thêm các dòng và các cột cho TableLayoutPanel qua các thuộc tính Columns và Rows trong cửa sổ Properties như hình 6.14, hoặc thêm dòng và cột qua ContextMenuStrip khi nhấp chuột phải vào TableLayoutPanel như hình 6.15. 187
  13. Hình 6.14: Thêm dòng và cột trên cửa sổ Column and Rown Styles Hình 6.15: Thêm dòng hoặc cột trên ContextMenuStrip Trên cửa sổ Column and Rown Styles như hình 6.14, các dòng và cột thêm vào có thể xác định kích thước bằng pixel (mục chọn Absolute), phần trăm (mục chọn Percent) hoặc tự động điều chỉnh kích thước (mục chọn AutoSize). 188
  14. Với mỗi ô của TableLayoutPanel, chỉ có thể chứa được một điều khiển. Tuy nhiên lập trình viên có thể thêm nhiều điều khiển trong một ô bằng cách thêm một điều khiển loại Containers như: GroupBox, Panel, vào ô của TableLayoutPanel, khi đó lập trình viên có thể thêm nhiều điều khiển vào điều khiển loại Containers nằm trong ô của TableLayoutPanel. TableLayoutPanel cũng được cung cấp thanh trượt (ScrollBar) khi thuộc tính AutoScroll là True. TableLayoutPanel là điều khiển dạng bảng chia thành các ô (cell) do đó không có thuộc tính BorderStyle mà thay vào đó có thuộc tính CellBorderStyle. Thuộc tính CellBorderStyle chỉ định kiểu đường viền cho TableLayoutPanel. Thông thường, thuộc tính TableLayoutStyle có giá trị mặc định là None, nghĩa là không hiển thị đường viền quanh các ô của TableLayoutPanel. Lập trình có thể thiết lập các loại đường viền được hổ trợ cho thuộc tính CellBorderStyle như: Single, Inset, InsetDouble, Outset, OutsetDouble, hoặc OutsetPartial.  Một số thuộc tính thường dùng của TableLayoutStyle: Bảng 6.5: Bảng mô tả các thuộc tính của TableLayoutStyle Thuộc tính Mô tả AutoScroll Mang giá trị True hoặc False. - Nếu là True: TableLayoutStyle tự động xuất hiện thanh trượt khi kích thước Panel không thể hiển thị hết các điều khiển chứa bên trong - Nếu là False: TableLayoutStyle sẽ không hiển thị thanh trượt CellBorderStyle Kiểu đường viền của TableLayoutStyle khi hiển thị. Có 3 giá trị: None, Single và Inset, InsetDouble, Outset, OutsetDouble, OutsetPartial. ColumnCount Số cột của TableLayoutPanel. Lập trình viên có thể thêm hoặc giảm số cột bằng cách thay đổi giá trị thuộc tính ColumnCount Columns Thuộc tính này giúp hiển thị bảng Column and Rown Styles để thêm, sửa hoặc xóa cột. GrowStyle Thuộc tính chỉ định việc thay đổi kích thước của TableLayoutPanel như thế nào. Gồm các giá trị: - FixedSize: Cố định kích thước, không 189
  15. thay đổi. - AddRows: Thêm dòng mới - AddColumns: Thêm cột mới RowCount Số cột của TableLayoutPanel. Lập trình viên có thể thêm hoặc giảm số dòng bằng cách thay đổi giá trị thuộc tính RowCount Rows Thuộc tính này giúp hiển thị bảng Column and Rown Styles để thêm, sửa hoặc xóa dòng.  Phương thức thường dùng của TableLayoutStyle: Bảng 6.6: Bảng mô tả các phương thức của TableLayoutStyle Phƣơng thức Mô tả Controls.Add Phương thức có chức năng thêm điều khiển vào TableLayoutStyle 6.5. Điều khiển TabControl TabControl là điều khiển dạng Containers, do đó có thể chứa các diều khiển khác. Điểm đặc biệt của TabControl là cho phép thể hiện nhiều page trên một form duy nhất. Mỗi page có thể chứa nhiều điều khiển khác bên trong. Điều khiển TabControl nằm trong nhóm Containers của cửa sổ Toolbox như hình 6.16. Hình 6.16: Điều khiển TabControl trong cửa sổ Toolbox  TabPage: Thuộc tính quan trọng nhất của TabControl là TabPage. Một TabControl có thể có nhiều TabPage như hình 6.17. Người dùng có thể nhấp vào các tab để chuyển đổi qua lại giữa các TabPage với nhau 190
  16. TabControl TabPage Hình 6.17: TabControl chứa nhiều TabPage TabPage là điều khiển dạng Container nằm trong TabControl và có thể chứa các điều khiển khác bên trong. Mỗi TabPage có các thuộc tính riêng, lập trình viên có thể thiết lập giá trị thuộc tính khác nhau trên mỗi TabPage của TabControl bằng cách nhấp chuột trái chọn thuộc tính TabPages trên cửa sổ Properties. Khi đó một cửa sổ TabPage Collection Editor sẽ hiển thị như hình 6.18. Tại cửa sổ này, lập trình viên cũng có thể thêm hoặc xóa các TabPage bằng cách nhấn nút Add hoặc Remove. Các thuộc tính của TabPage Hình 6.18: Cửa sổ thiết lập giá trị thuộc tính cho TabPage Điều khiển TabPage có nhiều điểm giống với điều khiển Panel. TabPage cũng hỗ trợ thanh trượt khi cần nếu như thuộc tính AutoScroll được thiết lập là True, có thuộc tính BorderStyle để thiết lập đường viền quanh TabPage với 3 giá trị: None, FixedSingle, Fixed3D. Tuy nhiên có điềm khác biệt với Panel là TabPage hỗ trợ thuộc 191
  17. tính Text, chuỗi mô tả được thiết lập trong thuộc tính Text sẽ hiển thị trên tab của TabPage: Text của Text của Text của TabPage1 là TabPage2 là TabPage3 là MyTab1 MyTab2 MyTab3  Các thuộc tính thường dùng của TabControl: Bảng 6.7: Bảng mô tả các thuộc tính của TabControl Thuộc tính Mô tả Appearance Thuộc tính chỉ định TabPage sẽ hiển thị ở hình dạng nào. Có 3 giá trị: - Normal: - Button: - FlatButtons: Alignment Thuộc tính xác định các tab sẽ hiển thị ở trên, dưới, trái hay phải của TabControl. Gồm các giá trị: - Top: 192
  18. - Bottom: - Left: - Right: Multiline Mang hai giá trị True hoặc False. - Nếu là True: Cho phép hiển thị nhiều dòng để chứa các tab nếu số lượng các tab vượt ngoài phạm vi kích thước của TabControl. - Nếu là False: Chỉ cho phép tab hiển thị trên một dòng. 193
  19. TabPages Chứa tập các các TabPage có trong TabControl TabCount Trả về số lượng TabPage mà TabControl có SelectedTab Trả về điều khiển TabPage được chọn SelectedIndex Trả về vị trí của TabPage được chọn  Các sự kiện thường dùng của TabControl: Bảng 6.8: Bảng mô tả các sự kiện của TabControl Sự kiện Mô tả SelectedIndexChanged Phát sinh khi người dùng chọn một TabPage khác trên TabControl Ví dụ 6.3: Viết chương trình quản lý nhân sự như hình 6.19 và 6.20. Chương trình gồm 2 TagPage: TagPage Quản lý nhân viên và TagPage Quản lý giáo viên.  TagPage quản lý nhân viên: Cho phép thêm, sửa và xóa nhân viên. Thông tinh nhân viên cần quản lý bao gồm: Họ tên nhân viên, chức vụ của nhân viên, hệ số lương và lương cơ bản.  TagPage Quản lý giáo viên: Cho phép thêm sửa xóa giáo viên. Thông tin giáo viên cần quản lý gồm: Họ tên giáo viên, chức vụ của giáo viên, tiền giảng một tiết, số tiết dạy và học vị của giáo viên. Hình 6.19: Giao diện TabPage Quản lý nhân viên 194
  20. Hình 6.20: Giao diện TagPage Quản lý giáo viên Hướng dẫn: Tạo TagPage Quản lý nhân viên: Bước 1: Thiết kế giao diện ban đầu. Thêm các điều khiển Label, TextBox, TabControl và ListView vào form như hình 6.21. tabControl1 textBox3 textBox1 textBox3 4 textBox2 listView 1 Hình 6.21: Giao diện TabPage Quản lý nhân viên sau khi thêm điều khiển Bước 2: Thiết lập giá trị thuộc tính cho điều khiển trong cửa sổ Properties - Form1: 195
  21. Thuộc tính Text: “TabControl” - label1: Thuộc tính Text: “Quản lý nhân sự” Thuộc tính Size: 14 - label2: Thuộc tính Text: “Họ tên:” - label3: Thuộc tính Text: “Lương cơ bản:” - label4: Thuộc tính Text: “Chức vụ:” - label5: Thuộc tính Text: “Hệ số lương:” - textBox1: Thuộc tính Name: txtHoTenNV - textBox2: Thuộc tính Name: txtLuongCBNV - textBox3: Thuộc tính Name: txtChucVuNV - textBox4: Thuộc tính Name: txtHeSoLuongNV - button1: Thuộc tính Name: btnThoat Thuộc tính Text: “Thoát” - button2: Thuộc tính Name: btnThemNV Thuộc tính Text: “Thêm nhân vien” - button3: Thuộc tính Name: btnCapNhatNV Thuộc tính Text: “Cập nhật” - button4: Thuộc tính Name: btnXoaNV Thuộc tính Text: “Xóa nhân viên” - listView1: Thuộc tính Name: listNhanVien Thuộc tính View: Detail Thuộc tính FullRowSelect: True Thuộc tính MultiSelect: False 196
  22. Thuộc tính Columns: Mở cửa sổ ColumnHeader Collection Editor, thêm 4 cột: colHoTen, colChucVu, colHeSoLuong, colLuongCoBan như hình 6.22. o Cột colHoTen: Thiết lập thuộc tính Text là “Họ tên” o Cột colChucVu: Thiết lập thuộc tính Text là “Chức vụ” o Cột colHeSoLuong: Thiết lập thuộc tính Text là “Hệ số lương” o Cột colLuongCoBan: Thiết lập thuộc tính Text là “Lương cơ bản” Hình 6.22: Thêm cột cho listView1 trong cửa sổ ColumnHeader Collection Editor - tabControl1: Thuộc tính Name: myTabControl Thuộc tính TabPage: Mở cửa sổ TabPage Collection Editor, thêm 2 TabPage: Quản lý nhân viên và Quản lý giáo viên như hình 6.23. Trên tabQuanLyNhanVien: o Thiết lập thuộc tính Text: “Quản lý nhân viên” Trên tabQuanLyGiaoVien: o Thiết lập thuộc tính Text: “Quản lý giáo viên” 197
  23. Hình 6.23: Thêm TabPage cho TabControl trên cửa sổ TabPage Collection Editor Bước 3: Viết mã lệnh cho các điều khiển - Sự kiện Click của btnThoat: private void btnThoat_Click(object sender, EventArgs e) { Close(); } - Sự kiện Click của btnCapNhatNV: private void btnCapNhatNV_Click(object sender, EventArgs e) { foreach (ListViewItem lvi in listNhanVien.SelectedItems) { lvi.SubItems[0].Text = txtTenNV.Text; lvi.SubItems[1].Text = txtChucVuNV.Text; lvi.SubItems[2].Text = txtHeSoLuongNV.Text; lvi.SubItems[3].Text = txtLuongCBNV.Text; } } 198
  24. - Sự kiện Click của btnThemNV: private void btnThemNV_Click(object sender, EventArgs e) { if (txtLuongCBNV.Text != "" && txtTenNV.Text != "" && txtHeSoLuongNV.Text != "" && txtChucVuNV.Text != "") { ListViewItem LVItem = new ListViewItem(txtTenNV.Text); ListViewItem.ListViewSubItem LVSItemCV = new ListViewItem.ListViewSubItem(LVItem, txtChucVuNV.Text); ListViewItem.ListViewSubItem LVSItemHSL = new ListViewItem.ListViewSubItem(LVItem, txtHeSoLuongNV.Text); ListViewItem.ListViewSubItem LVSItemLCB = new ListViewItem.ListViewSubItem(LVItem, txtLuongCBNV.Text); LVItem.SubItems.Add(LVSItemCV); LVItem.SubItems.Add(LVSItemHSL); LVItem.SubItems.Add(LVSItemLCB); listNhanVien.Items.Add(LVItem); txtLuongCBNV.Text = ""; txtTenNV.Text = ""; txtHeSoLuongNV.Text = ""; txtChucVuNV.Text = ""; } else MessageBox.Show("Phải nhập đầy đủ thông tin nhân viên"); } - Sự kiện Click của btnXoaNV: private void btnXoaNV_Click(object sender, EventArgs e) { if (listNhanVien.SelectedIndices.Count > 0) { listNhanVien.Items.RemoveAt(listNhanVien.FocusedItem.Index); } else MessageBox.Show("Phải chọn nhân viên muốn "); } 199
  25. - Sự kiện SelectedIndexChanged của listNhanVien: private void listNhanVien_SelectedIndexChanged(object sender, EventArgs e) { foreach (ListViewItem lvi in listNhanVien.SelectedItems) { txtTenNV.Text = lvi.SubItems[0].Text; txtChucVuNV.Text = lvi.SubItems[1].Text; txtHeSoLuongNV.Text = lvi.SubItems[2].Text; txtLuongCBNV.Text = lvi.SubItems[3].Text; } } Tạo TagPage Quản lý giáo viên: Thiết kế và viết mã lệnh tương tự như TagPage Quản lý nhân viên. 6.6. Điều khiển SplitContainer Điều khiển SplitContainer giúp phân chia form thành hai phần. Cụ thể hơn SplitContainer được cấu tạo bởi hai điều khiển Panel, mỗi Panel trong điều khiển SplitContaner đều có chức năng như một điều khiển Panel thông thường. Khi thêm điều khiển SplitContainer từ cửa sổ Toolbox vào form thì mặc định SplitContainer có thuộc tính Dock mang giá trị Fill. Kích thước của hai Panel trong SplitContainet có thể thay đổi nhờ Splitter, Splitter là một vạch phân cách hai Panel. Điều khiển SplitContainer nằm trong nhóm Containers của cửa sổ Toolbox như hình 6.24. Hình 6.24: Điều khiển SpliContainer trong cửa sổ Toolbox Các Panel đều hỗ trợ thanh trượt (ScrollBar) khi thuộc tính AutoScroll được thiết lập là True. Tuy nhiên Panel trong SplitContainer không có thuộc tính BorderStyle để thiết lập đường viền, vì là điều khiển chứa trong SplitContainer, do đó thuộc tính BorderStyle được đặt ở điều khiển SplitContainer. Các giá trị của thuộc tính 200
  26. BorderStyle của SplitContainer cũng gồm 3 giá trị như Panel: None, Fixed3D, FixedSingle. Vạch phân cách Splitter có thể phân cách theo chiều dọc hoặc chiều ngang tùy thuộc vào thuộc tính Orientation. Thuộc tính Orientation mang hai giá trị để thiết lập SplitContair là: Vertical và Horizontal như hình 6.25, hình 6.26. Hình 6.25: Thuộc tính Orientation là Hình 6.26: Thuộc tính Orientation là Vertical Horizontal Nếu không muốn cho người dùng dịch chuyển vạch phân cách Splitter để thay đổi kích thước của hai Panel, lập trình viên có thể thiết lập thuộc tính IsSplitterFixed của SplitContainer là True. Ngoài ra một điểm đặc biệt là có thể chỉ định không cho phép thay đổi kích thước của Panel1 hoặc Panel2 bằng cách kết hợp thuộc tính FixedPanel và thuộc tính IsSplitterFixed như bảng 6.9. Bảng 6.9: Bảng mô tả thuộc tính IsSplitterFixed và FixedPanel Thuộc tính Tác dụng IsSplitterFixed = False Thuộc tính FixedPanel không có hiệu lực. Người dùng có thể thay đổi kích thước của Panel1 và cả Panel2 IsSplitterFixed = True Thiết lập thuộc tính FixedPanel: - FixedPanel = None: Người dùng không thể sử dụng vạch phân cách Splitter để thay đổi kích thước của cả Panel1 và Panel2. Nhưng kích thước cả hai Panel sẽ thay đổi khi SplitContainer có thuộc tính Dock là Fill và người dùng thay đổi kích thước form. - FixedPanel = Panel1: Người dùng không thể thay đổi kích thước Panel1 (Khi thay đổi kích thước form thì kích thước Panel2 thay đổi, kích thước Panel1 là không đổi). - FixedPanel = Panel2: Người dùng không thể thay đổi kích thước Panel2 (Khi thay đổi kích thước form 201
  27. thì kích thước Panel1 thay đổi, kích thước Panel2 là không đổi). Một trong hai Panel của SplitContainer có thể ẩn đi bằng cách thiết lập thuộc tính Panel1Collapsed và Panel2Collapsed là True. Việc ẩn hai Panel chỉ có có tác dụng với một Panel. Nghĩa là chỉ có thể thiết lập một trong hai thuộc tính Panel1Collapsed và Panel2Collapsed là True. Khi Panel1Collapsed là True thì Panel2Collapsed là False và ngược lại.  Các thuộc tính thường dùng của SplitContainer: Bảng 6.10: Bảng mô tả các thuộc tính của SplitContainer Thuộc tính Mô tả BorderStyle Thiêt lập đường viên cho SplitContainer. Gồm 3 giá trị: None, FixedSingle, Fixed3D. FixedPanel CỐ định kích thước của các Panel trong SplitContainer. Gồm 3 giá trị: None, Panel1, Panel2. IsSplitterFixed Mang hai giá trị True và False. Nếu là True, cố định vạch phân cách Splitter Orientation Xác định vạch phân cách Splitter sẽ phân cách theo chiều ngang hay dọc. Gồm 2 giá trị: Vertical, Horizontal. Panel1Collapsed Mang hai giá trị True hoặc False. Nếu là True sẽ ẩn Panel1 Panel1MinSize Lấy kích thước nhỏ nhất hoặc thiết lập kích thước nhò nhất cho Panel1 Panel2Collapsed Mang hai giá trị True hoặc False. Nếu là True sẽ ẩn Panel2 Panel2MinSize Lấy kích thước nhỏ nhất hoặc thiết lập kích thước nhò nhất cho Panel2 SplitterDistance Trả về khoảng cách bằng pixel từ Splitter đến cạnh bên trái (nếu hai Panel nằm dọc) hay đến cạnh trên (nếu hai Panel nằm ngang) SplitterWidth thiết lập độ rộng của vạch phân cách Splitter Ví dụ 6.4: Viết chương trình có giao diện như hình 6.27. Gồm: 1 điều khiển SplitContainer với Panel1 chứa 1 điều khiển ListView và Panel2 chứa 1 điều khiểnWebBrowser. 202
  28. Yêu cầu: Người dùng nhập đường dẫn website vào TextBox và nhấn nút thêm. Đường dẫn website vừa nhập sẽ được đưa vào ListView. Người dùng có thể hiển thị bất cứ website nào trên WebBrowser bằng cách nhấp chuột vào đường dẫn chứa trong ListView. Hình 6.27: Giao diện quản lý địa chỉ website Bước 1: Thiết kế giao diện ban đầu cho form. Thêm các điều khiển Label, TextBox, Button, SplitContaner và ListView, WebBrowser từ cửa sổ Toolbox vào form như hình 6.28. textBox1 SplitContainer1 webBrowser1 listView1 203
  29. Hình 6.28: Giao diện form sau khi thêm điều khiển Bước 2: Thiết lập giá trị thuộc tính cho các điều khiển trong cửa sổ Properties - Form1: Thuộc tính Text: “SplitContainer” - label1: Thuộc tính Text: “Thêm đường dẫn:” textBox1: Thuộc tính Name: txtLink - button1: Thuộc tính Name: btnThem Thuộc tính Text: “Thêm” - button2: Thuộc tính Name: btnCapNhat Thuộc tính Text: “Cập nhật” - button3: Thuộc tính Name: btnXoa Thuộc tính Text: “Xóa” - button4: Thuộc tính Name: btnThoat Thuộc tính Text: “Thoát” - listView1: Thuộc tính Name: listLinkWebsite Thuộc tính Dock: Fill - webBrowser1: Thuộc tính Name: myWebsite Thuộc tính Dock: Fill - splitContainer1: Thuộc tính BorderStyle: FixedSingle Thuộc tính Dock: None Thuộc tính Orientation: Vertical Thuộc tính IsSplitterFixed: True Bước 3: Viết mã lệnh cho điều khiển - Sự kiện Click của btnThoat: private void btnThoat_Click(object sender, EventArgs e) { Close(); } 204
  30. - Sự kiện Load của Form1: private void Form1_Load(object sender, EventArgs e) { myWebsite.Navigate("www.google.com"); } - Sự kiện Click của nút btnThem: private void btnThem_Click(object sender, EventArgs e) { ListViewItem lvi = new ListViewItem(txtLink.Text); listLinkWebsite.Items.Add(lvi); txtLink.Text = ""; } - Sự kiện Click của nút btnCapNhat: private void btnCapNhat_Click(object sender, EventArgs e) { listLinkWebsite.FocusedItem.Text = txtLink.Text; } - Sự kiện Click của nút btnXoa: private void btnXoa_Click(object sender, EventArgs e) { int i = listLinkWebsite.FocusedItem.Index; listLinkWebsite.Items.RemoveAt(i); txtLink.Text = ""; myWebsite.Navigate("www.google.com"); } - Sự kiện MouseClick của listLinkWebsite: private void listLinkWebsite_MouseClick(object sender, MouseEventArgs e) { txtLink.Text = listLinkWebsite.FocusedItem.Text; if (e.Button == MouseButtons.Left) myWebsite.Navigate(listLinkWebsite.FocusedItem.Text); } 6.7. Bài tập cuối chƣơng Câu 1: Thiết kế chương trình tạo Button có giao diện như hình 6.29. Yêu cầu: - Khi nhấn F5 chạy chương trình xuất hiện giao diện như hình 629. - Người dùng nhập tổng số Button cần phát sinh trong TextBox txtTongNut; nhập số Button muốn phát sinh trên một hàng trong TextBox txtNutHang. 205
  31. Hình 6.29: Giao diện chương trình tạo Button - Khi người dùng nhấn nút Phát Sinh sẽ phát sinh các Button như yêu cầu vào Panel1 như hình 6.30. Hình 6.30: Giao diện chương trình sau khi phát sinh Button - Khi người dùng nhấn vào một nút nhấn xuất thông báo “Bạn vừa nhấn nút: _” như hình 6.31. Riêng nút số 10 khi người dùng nhấn sẽ xuất thông báo “Chúc mừng bạn đã trúng 01 tỉ USD” như hình 6.32. 206
  32. Hình 6.31: MessageBox thông báo Hình 6.32: MessageBox thông báo người dùng nút người dùng vừa nhấn vừa nhấn nút 10 Câu 2: Viết chương trình tạo câu hỏi trắc nghiệm như hình 6.33. textBox1 textBox2 checkBox1 listView1 Hình 6.33: Giao diện tạo câu hỏi trắc nghiệm Yêu cầu: - Người dùng nhập nội dung câu hỏi trong textBox1 - Người dùng nhập đáp án trả lời trong textBox2. Nếu đáp án đúng thì checkBox1 sẽ được chọn tương ứng với giá trị 1. Nếu đáp án sai thì checkBox1 sẽ không được chọn tương ứng với giá trị 0. - Người dúng nhấn Button “Thêm” để thêm đáp án vào listView1 - Nhấn Button “Thoát” để đóng chương trình. 207
  33. - Nhấn Button “Hoàn thành” để hoàn tất việc tạo 1 câu hỏi trắc nghiệm. Khi đó sẽ hiển thị form như hình 6.34. label1 flowLayoutPanel1 Hình 6.34: Giao diện trả lời trắc nghiệm Trên giao diện trả lời trắc nghiệm như hình 6.34: - Nội dung câu hỏi nhập trong textBox1 ở hình 6.33 sẽ hiển thị trên label1. - Các đáp án trả lời trong listView1 ở hình 6.33 tương ứng sẽ tạo thành các radioButton đáp án để người dùng chọn trong flowLayoutPanel1. - Nhấn Button “Trả lời” để hoàn thành việc chọn đáp án đúng, nếu chọn đúng thì MessageBox với nội dung “Bạn đã trả lời đúng” được hiển thị, nếu chọn sai thì MessageBox với nội dung “Bạn đã trả lời sai” được hiển thị. 208
  34. CHƢƠNG 7: ĐIỀU KHIỂN DIALOG VÀ PHƢƠNG THỨC MESSAGE 7.1. Lớp MessageBox Lớp MessageBox giúp hiển thị một hộp thoại trên màn hình. Khi hộp thoại xuất hiện thì người dùng bắt buộc phải thao tác trên hộp thoại trước thì mới có tiếp tục thực hiện công việc trên ứng dụng. Việc hiển thị như thế hữu ích khi muốn cảnh báo một lỗi hoặc hướng dẫn cho người dùng. Sử dụng lớp MessageBox thì cần khai báo không gian tên: System.Windows.Forms Để hiển thị hộp thoại, người dùng chỉ cần sử dụng phương thức tĩnh Show() của lớp MessageBox mà không cần phải có bất cứ khai báo nào để tạo đối tượng lớp MessageBox.  Phương thức Show(): DialogResult Show(string text, string caption, MessageBoxButtons buttons, MessageBoxIcon icon, MessageBoxDefaultButton defaultButton, MessageBoxOptions options); - Text: Chuỗi hiển trên trên hộp thoại MessageBox - Caption: Chuỗi hiển thị trên thanh titlebar của hộp thoại MessageBox - Kiểu liệt kê MessageBoxIcon gồm các giá trị xác định biểu tượng hiển thị trên MessageBox: public enum MessageBoxIcon { Asterisk = 0x40, Error = 0x10, Exclamation = 0x30, Hand = 0x10, Information = 0x40, None = 0, Question = 0x20, Stop = 0x10, Warning = 0x30 } - Kiểu liệt kê MessageBoxDefaulButtons gồm các giá trị xác định nút được Focus trên MessageBox: 209
  35. public enum MessageBoxDefaultButton { Button1 = 0, Button2 = 0x100, Button3 = 0x200 } - Kiểu liệt kê MessageBoxButtons gồm các giá trị xác định nút hiển thị trên MessageBox: public enum MessageBoxButtons { OK, OKCancel, AbortRetryIgnore, YesNoCancel, YesNo, RetryCancel } - Kiểu liệt kê MessageBoxOption gồm các giá trị xác định nút hiển thị bên phải hoặc bên trái của MessageBox: public enum MessageBoxOptions { DefaultDesktopOnly = 0x20000, RightAlign = 0x80000, RtlReading = 0x100000, ServiceNotification = 0x200000 } Lưu ý: Khi hộp thoại hiển thị từ phương thức Show() có sử dụng tham số MessageBoxButton thì phương thức này sẽ trả về một giá trị có kiểu DialogResult. DialogResult không phải là lớp mà là một kiều liệt kê bao gồm các giá trị: public enum DialogResult { None, OK, Cancel, Abort, Retry, Ignore, Yes, No } 210
  36. Lập trình viên có thể sử dụng DialogResult để xác định xem người dùng đã nhấn nút nào trên hộp thoại MessageBox. Ví dụ 7.1: Hiển thị các dạng khác nhau của hộp thoạiMessageBox. - Hiển thị hộp thoại hiển thị dòng thông báo đơn giản như hình 7.1: Hình 7.1: Hộp thoại MessageBox đơn giản Mã lệnh: MessageBox.Show(“Xin chào đến với Khoa Công nghệ thông tin”); - Hiển thị hộp thoại với dòng thông báo trên MessageBox và dòng tiêu đề trên titlebar của hộp thoại như hình 7.2. Hình 7.2: Hộp thoại MessageBox với dòng tiêu đề trên titlebar Mã lệnh: MessageBox.Show(“Xin chào đến với Khoa Công nghệ thông tin”, “Trường Đại học Lạc Hồng”); - Hiển thị hộp thoại với hai nút Yes/ No như hình 7.3. Muốn hiển thị nút trong hộp thoại cần sử dụng tham số thuộc kiểu MessageBoxButton, đồng thời để biết người dùng nhấn nút Yes hay No thì cần sử dụng biến thuộc kiểu DialogResult để nhận kết quả trả về từ hộp thoại. 211
  37. Hình 7.3: Hộp thoại MessageBox với hai nút Yes/ No Mã lệnh: DialogResult r = MessageBox.Show("Bạn muốn tiếp tục làm bài”, "Chọn đáp án", MessageBoxButtons.YesNo); if (r == DialogResult.Yes) MessageBox.Show("Bạn đã chọn Yes"); else MessageBox.Show("Bạn đã chọn No"); - Hi ển thị hộp thoại có 3 nút Yes/ No/ Cancel và có thêm biểu tượng dạng câu hỏi cạnh chuỗi hiển thị trên MessageBox như hình 7.4. Hình 7.4: Hộp thoại MessageBox với biểu tượng dạng câu hỏi Mã lệnh: DialogResult r = MessageBox.Show("Trả lời đáp án (Yes/ No)", "Chọn đáp án", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (r == DialogResult.Yes) MessageBox.Show("Bạn đã chọn Yes"); else if(r==DialogResult.No) MessageBox.Show("Bạn đã chọn No"); else MessageBox.Show("Bạn đã thoát chương trình"); 212
  38. - Hiển thị hộp thoại có 2 nút Ok/ Cancel và có thêm biểu tượng dạng lỗi cạnh chuỗi hiển thị trên MessageBox như hình 7.5. Nút mặc định được Focus khi hộp thoại hiển thị là nút Cancel. Hình 7.5: Hộp thoại MessageBox báo lỗi Mã lệnh: DialogResult r = MessageBox.Show("Chương trình lỗi, bạn muốn thoát", "Lỗi chương trình", MessageBoxButtons.OKCancel, MessageBoxIcon.Error, MessageBoxDefaultButton.Button2); if (r == DialogResult.OK) MessageBox.Show("Bạn đã chọn OK, thoát chương trình"); else if(r==DialogResult.No) MessageBox.Show("Bạn đã chọn Cancel, tiếp tục chạy chương trình"); 7.2. Điều khiển ColorDiaLog Để thiết lập màu cho các điều khiển, C# hỗ trợ lớp ColorDialog để người dùng sử dụng và hiển thị trực quan qua một hộp thoại gọi là ColorDialog Box. ColorDialog Box chứa một danh sách các màu sắc được xác định cho hệ thống hiển thị. Người dùng có thể lựa chọn hoặc tạo ra một màu sắc đặc biệt từ danh sách, sau đó áp dụng khi thoát khỏi hộp thoại. ColorDialog nằm trong nhóm Dialog của cửa sổ Toolbox như hình 7.6. 213
  39. Điều khiển ColorDialog Hình 7.6: Điều khiển ColorDialog trong cửa sổ Toolbox Lập trình có thể tạo ra đối tượng ColorDialog bằng cách kéo điều khiển vào form từ cửa sổ Toolbox hoặc sử dụng mã lệnh tạo đối tượng và hiển thị ColorDialog Box bằng cách gọi phương thức ShowDialog() để hiển thị hộp thoại như hình 7.7. Mã lệnh: ColorDialog clbox= new ColorDialog(); 4clbox.ShowDialog(); Hình 7.7: Giao diện ColorDialog Box 214
  40. Ví dụ 7.2: Viết chương trình chọn màu chữ và màu nền cho Label có giao diện như hình 7.8. Hình 7.8: Giao diện form lựa chọn màu cho Label Yêu cầu: Người dùng chọn thay đổi màu nền hoặc màu chữ của Label có dòng chữ “Khoa Công nghệ thông tin” bằng cách chọn một trong hai RadioButton: “Màu chữ”, “Màu nền”. Sau khi đã có lựa chọn, người dùng nhấn vào nút “Chọn màu” để hiện thị ColoDialog Box và chọn màu muốn thay đổi cho Label. Hướng dẫn: Bước 1: Thiết kế giao diện ban đầu: Thêm các điều khiển Label, Button, Panel, GroupBox và RadioButton từ cửa sổ Toolbox vào form như hình 7.9. panel1 Hình 7.9: Giao diện form sau khi thêm điều khiển Bước 2: Thiết lập giá trị thuộc tính cho điều khiển trong cửa sổ Properties - label1: Thuộc tính Text: “Khoa Công nghệ thông tin” 215
  41. Thuộc tính Font Size: 14 Thuộc tính Font style: Bold Thuộc tính AutoSize: False Thuộc tính Size: 428, 86 Thuộc tính TextAlign: MiddleCenter - panel1: Thuộc tính BorderStyle: FixedSingle - groupBox1: Thuộc tính Text: “Chọn màu chữ hoặc màu nền” - radioButton1: Thuộc tính Text: “Màu chữ” Thuộc tính Name: radMauChu - radioButton2: Thuộc tính Text: “Màu nền” Thuộc tính Name: radMauNen - button1: Thuộc tính Text: “Chọn màu” Thuộc tính Name: btnChonMau - button2: Thuộc tính Text: “Thoát” Thuộc tính Name: btnThoat Bước 3: Viết mã lệnh cho các điều khiển - Sự kiện Click nút btnChonMau: private void btnChonMau_Click(object sender, EventArgs e) { ColorDialog clDLog = new ColorDialog(); DialogResult rs = clDLog.ShowDialog(); if (rs == DialogResult.OK) { if (radMauChu.Checked == true) { lblHienThi.ForeColor = clDLog.Color; } if (radMauNen.Checked == true) { lblHienThi.BackColor = clDLog.Color; } } } 216
  42. - Sự kiện Click nút btnThoat: private void btnThoat_Click(object sender, EventArgs e) { Close(); } 7.3. Điều khiển FontDiaLog Tương tự như ColorDialog Box, để thiết lập font chữ hiển thị, C# cũng hỗ trợ hộp thoại gọi là FontDialog Box. FontDialog Box sẽ hiển thị một danh sách các font chữ hiện đang được cài đặt trên hệ thống; Cho phép người dùng lựa chọn các thuộc tính cho một font chữ hợp lý, như kiểu font chữ, kích cỡ chữ, hiệu ứng, . FontDialog nằm trong nhóm Dialogs của cửa sổ Toolbox như hình 7.10. Điều khiển FontDialog Hình 7.10: Điều khiển FontDialog trong cửa sổ Toolbox Lập trình có thể tạo ra đối tượng FontDialog bằng cách kéo điều khiển vào form từ cửa sổ Toolbox hoặc sử dụng mã lệnh tạo đối tượng và hiển thị FontDialog Box bằng cách gọi phương thức ShowDialog() để hiển thị hộp thoại như hình 7.11. 217
  43. Hình 7.11: Giao diện FontDialog Box Mã lệnh hiển thị FontDialog Box: FontDialog fontbox= new FontDialog(); fontbox.ShowDialog(); Ví dụ 7.3: Dựa vào ví dụ 7.2. Thêm nút lệnh “Chọn Font chữ” như hình 7.12 Hình 7.12: Giao diện form sau khi thêm nút “Chọn Font chữ” Yêu cầu: Khi người dùng nhấn vào nút “Chọn Font chữ” sẽ hiển thị hộp thoại FontDialog Box cho phép người dùng thay đổi font chữ, kiểu chữ và kích thước của dòng chữ “Khoa Công nghệ thông tin”. Bước 1: Thêm một điều khiển Button từ cửa sổ Toolbox vào frm như hình 7.13 218
  44. Hình 7.13: Giao diện form sau khi thêm Button Bước 2: Thiết lập giá trị thuộc tính cho nút button1: Thuộc tính Name: btnChonFont Thuộc tính Text: “Chọn Font chữ” Bước 3: Viết mã lệnh cho sự kiện. - Khai báo biến fontbox có kiểu FontDialog: FontDialog fontbox = new FontDialog(); - Sự kiện Click nút btnChonFont private void btnChonFont_Click(object sender, EventArgs e) { DialogResult rs = fontbox.ShowDialog(); if (rs == DialogResult.OK) { lblHienThi.Font = fontbox.Font; } } 7.4. Điều khiển OpenFileDiaLog Điều khiển OpenFileDialog cho phép hiển thị hộp thoại OpenFileDialog để lấy về ổ đĩa, tên thư mục, tên tập tin đối với một tập tin hay thư mục đang tồn tại. Thông thường các ứng dụng Windows Forms sử dụng hộp thoại OpenFileDialog để mở một tập tin nào đó lưu trên bộ nhớ máy tính. Hộp thoại OpenFielDialog có giao diện như hình 7.14 và đặt trong nhóm Dialogs của cửa sổ Toolbox như hình 7.15. 219
  45. Hình 7.14: Hộp thoại OpenFileDialog Điều khiển OpenFileDialog Hình 7.15: Điều khiển OpenFileDialog trong cửa sổ Toolbox  Một số thuộc tính thường dùng của OpenFileDialog: Thuộc tính Mô tả Tilte Thiết lập chuỗi hiển thị trên titlebar của hộp thoại OpenFileDialog 220
  46. Filter Thuộc tính nhận giá trị là một chuỗi. Chuỗi này chứa các đuôi mở rộng của tập tin, giúp lọc ra trên hộp thoại OpenFileDialog chỉ hiển thị đúng loại đuôi có trong chuỗi. Ví dụ: Thiết lập chuỗi chỉ hiển thị file hình ảnh có đuôi JPG và đuôi GIF: “jpg images|*.jpg|gif images|*.gif” Thiết lập chuỗi hiển thị tất cả những gì có trong thư mục trên hộp thoại: “All|*.*” FileName Thuộc tính trả về đường dẫn cùng tên tập tin được chọn FileNames Thuộc tính trả về một mảng các đường dẫn cùng tên tập tin được chọn. Lưu ý: Thuộc tính thường được sử dụng khi thuộc tính MultiSelect được thiết lập là True FilterIndex Thuộc tính sử dụng cùng với thuốc tính Filter. Có ý nghĩa sẽ ưu tiên lọc loại tập tin nào trước trong chuỗi Filter. Ví dụ: Chuỗi Filter lọc hai loại tập tin JPG và GIF: “jpg images|*.jpg|gif images|*.gif” Nếu muốn hộp thoại khi hiển thị lọc hình có đuôi JPG đầu tiên thiết lập thuộc tính FilterIndex có giá trị 1. Nếu muốn hộp thoại khi hiển thị lọc hình có đuôi GIF đầu tiên thiết lập thuộc tính FilterIndex có giá trị 2. InitialDirectory Giá trị thuộc tính là một đường dẫn đến một thư mục hoặc ổ đĩa. Khi hộp thoại OpenFileDialog được mở lên sẽ hiển thị nội dung của đường dẫn này đầu tiên. RestoreDirectory Mang hai giá trị True hoặc False, cho biết hộp thoại có trả lại đường dẫn thư mục vừa mở trước đó. Lưu ý: Thuộc tính chỉ có hiệu lực khi thuộc tính InitialDirectory mang giá trị rỗng MultiSelect Mang giá trị True hoặc False. - Nếu là True: Cho phép người dùng chọn nhiều tập tin hoặc thư mục - Nếu là False: Chỉ được chọn 1 tập tin hoặc một thư mục CheckFileExists Mang hai giá trị True hoặc False. 221
  47. Nếu là True sẽ cho phép hộp thoại hiển thị một cảnh báo nếu người dùng chỉ định một tập tin không tồn tại và nhấn nút Open. ReadOnlyChecked Mang giá trị True hoặc False. - Nếu là True: Hiển thị một CheckBox với tiêu đề Open as Read Only phía dưới ComboBox Files Of Types - Nếu là False: Không hiển thị CheckBox. Lưu ý: Thuộc tính chỉ có hiệu lực khi thuộc tính ShowReadOnly mang giá trị True AddExtension Mang hai giá trị True hoặc False. - Nếu là True sẽ cho phép thêm vào tên mở rộng (jpg, gif, ) vào tập tin. - Nếu là False: Không cho phép DefaultExt Thêm tên mở rộng (.jpg, .gif, ) cho tập tin nếu người dùng không cung cấp tên mở rộng.  Một số phương thức thường dùng của OpenFileDialog: Phƣơng thức Mô tả Reset() Thiết lập giá trị các thuộc tính trở lại giá trị mặc định ShowDialog() Hiển thị hộp thoai, bắt buộc người dùng phải thao tác và đóng hộp thoại lại mới có thể thực hiện công việc khác. 7.5. Điều khiển SaveFileDialog Điều khiển SaveFileDialog cho phép hiển thị hộp thoại SaveFileDialog để người dùng lựa chọn đường dẫn đến một thư mục hoặc ổ đĩa trên hệ thống để ghi một tập tin mới hoặc ghi đè tập tin đã có. Hộp thoại SaveFileDialog có giao diện như hình 7.16 và đặt trong nhóm Dialogs của cửa sổ Toolbox như hình 7.17. 222
  48. Hình 7.16: Giao diện hộp thoại SaveFileDialog Điều khiển OpenFileDialog Hình 7.17: Điều khiển SaveFileDialog trong cửa sổ Toolbox  Một số thuộc tính thường dùng của SaveFileDialog: SaveFileDialog và OpenFileDialog đều thừa kế từ lớp cơ sở là FileDialog do đó SaveFileDialog có nhiều thuộc tính giống như OpenFileDialog. Một số thuộc tính OpenFileDialog có nhưng SaveFileDialog không có như: Multiselect, ReadOnlyChecked, ShowReadOnly. Do là hộp thoại giúp lưu tập tin do đó SaveFileDialog hỗ trợ hai thuộc tính mới là: CreatePrompt và OverwritePrompt. Thuộc tính Mô tả Tilte Thiết lập chuỗi hiển thị trên titlebar của hộp thoại OpenFileDialog 223
  49. Filter Thuộc tính nhận giá trị là một chuỗi. Chuỗi này chứa các đuôi mở rộng của tập tin, giúp lọc ra trên hộp thoại OpenFileDialog chỉ hiển thị đúng loại đuôi có trong chuỗi. Ví dụ: Thiết lập chuỗi chỉ hiển thị file hình ảnh có đuôi JPG và đuôi GIF: “jpg images|*.jpg|gif images|*.gif” Thiết lập chuỗi hiển thị tất cả những gì có trong thư mục trên hộp thoại: “All|*.*” FileName Thuộc tính trả về đường dẫn cùng tên tập tin được chọn FilterIndex Thuộc tính sử dụng cùng với thuốc tính Filter. Có ý nghĩa sẽ ưu tiên lọc loại tập tin nào trước trong chuỗi Filter. Ví dụ: Chuỗi Filter lọc hai loại tập tin JPG và GIF: “jpg images|*.jpg|gif images|*.gif” Nếu muốn hộp thoại khi hiển thị lọc hình có đuôi JPG đầu tiên thiết lập thuộc tính FilterIndex có giá trị 1. Nếu muốn hộp thoại khi hiển thị lọc hình có đuôi GIF đầu tiên thiết lập thuộc tính FilterIndex có giá trị 2. InitialDirectory Giá trị thuộc tính là một đường dẫn đến một thư mục hoặc ổ đĩa. Khi hộp thoại OpenFileDialog được mở lên sẽ hiển thị nội dung của đường dẫn này đầu tiên. RestoreDirectory Mang hai giá trị True hoặc False, cho biết hộp thoại có trả lại đường dẫn thư mục vừa mở trước đó. Lưu ý: Thuộc tính chỉ có hiệu lực khi thuộc tính InitialDirectory mang giá trị rỗng CheckFileExists Mang hai giá trị True hoặc False. Nếu là True sẽ cho phép hộp thoại hiển thị một cảnh báo nếu người dùng chỉ định một tập tin không tồn tại và nhấn nút Open. CheckPathExists Mang hai giá trị True hoặc False. Nếu là True sẽ kiểm tra đường dẫn tới tập tin có hợp lệ hay không. AddExtension Mang hai giá trị True hoặc False. - Nếu là True sẽ cho phép thêm vào tên mở rộng (jpg, gif, ) vào tập tin. 224
  50. - Nếu là False: Không cho phép DefaultExt Thêm tên mở rộng (.jpg, .gif, ) cho tập tin nếu người dùng không cung cấp tên mở rộng. OverwritePrompt Mang hai giá trị True và False. Nếu là True sẽ hiện cảnh báo khi người dùng ghi đè vào một tập tin đã tồn tại CreatePrompt Mang hai giá trị True và False. Nếu là True sẽ hiện thông báo khi người dùng lưu một tập tin mới Ví dụ 7.4: Viết chương trình soạn thảo văn bản đơn giản sử dụng OpenFileDialog để mở tập tin và SaveFileDialog để lưu tập tin. Chương trình có giao diện như hình 7.18. Hình 7.18: Giao diện chương trình soạn thảo văn bản Yêu cầu: Người dùng nhấn nút “Mở tập tin” để mở một tập tin có định dạng .txt. Nội dung của tập tin này sẽ hiển thị trên TextBox (chỉ cho phép hiển thị tập tin .txt) Người dùng nhấn nút “Lưu tập tin” để lưu nội dung vừa soạn thảo trong TextBox vào một thư mục nào đó trên hệ thống. Hướng dẫn: Bước 1: Thiết kế giao diện chương trình. Lập trình viên thêm các điều khiển: Label, TextBox, Button, OpenFileDialog và SaveFileDialog từ cửa sổ Toolbox vào form như hình 7.19 225
  51. textBox1 Hình 7.19: Giao diện form soạn thảo văn bản khi thêm điều khiển Bước 2: Thiết lập giá trị thuộc tính cho điều khiển trong cửa sổ Properties - label1: Thuộc tính Text: “Soạn thảo văn bản” Thuộc tính Font Size: 14 - button1: Thuộc tính Name: btnMoTapTin Thuộc tính Text: “Mở tập tin” - button2: Thuộc tính Name: btnLuuTapTin Thuộc tính Text: “Lưu tập tin” - button3: Thuộc tính Name: btnThoat Thuộc tính Text: “Thoát” - textbox1: Thuộc tính Name: txtNoiDung Thuộc tính MultiLine: True Thuộc tính Size: 93, 55 - openFileDialog1: Thuộc tính RestoreDirectory: True Thuộc tính Title: “Mở tập tin Text để soạn thảo” Thuộc tính Filter: “File Text|*.txt” 226
  52. - saveFileDialog1: Thuộc tính RestoreDirectory: True Thuộc tính Title: “Lưu tập tin Text” Thuộc tính Filter: “File Text|*.txt” Thuộc tính OverwritePrompt: True Bước 3: Viết mã lệnh cho các điều khiển - Sự kiện Click của nút btnMoTapTin: private void btnMoTapTin_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { string tentaptin = openFileDialog1.FileName; StreamReader rd = new StreamReader(tentaptin); txtNoiDung.Text = rd.ReadToEnd(); rd.Close(); } } - Sự kiện Click của nút btnThoat: private void btnThoat_Click(object sender, EventArgs e) { Close(); } - Sự kiện Click của nút btnLuuTapTin: private void btnLuuTapTin_Click(object sender, EventArgs e) { if (saveFileDialog1.ShowDialog() == DialogResult.OK) { string noidung = txtNoiDung.Text; string tentaptin = saveFileDialog1.FileName; StreamWriter wt = new StreamWriter(tentaptin); wt.Write(noidung); wt.Close(); } } 7.6. Điều khiển FolderBrowserDiaLog Điều khiển FolderBrowserDialog cho phép người dùng chọn một thư mục nào đó đang tồn tại trong hệ thống. Ngoài ra trong quá trình chọn người dùng cũng có thể tạo thư mục mới trên thư mục đang chọn. Điều khiển ForlderBrowserDialog nằm trong nhóm Dialogs của cửa sổ Toolbox như hình 7.20 227
  53. Điều khiển FolderBrowserDialog Hình 7.20: Điều khiển FolderBrowserDialog trong cửa sổ Toolbox Sự khác biệt cơ bản FolderBrowserDialog và OpenFileDialog là FolderBrowserDialog chỉ cho phép chọn thư mục mà không phải là chọn tập tin và mở như OpenFileDialog. Lập trình viên có thể tạo đối tượng FolderBrowserDialog bằng cách kéo điều khiển từ cửa sổ Toolbox vào form hoặc viết mã lệnh để tạo đối tượng FolderBrowserDialog và hiển thị hộp thoại FolderBrowserDialog bằng phương thức ShowDialog. Giao diện hộp thoại FolderBrowserDialog như hình 7.21 Hình 7.21: Giao diện hộp thoại FolderBrowserDialog Mã lệnh tạo đối tượng và hiển thị hộp thoại FolderBrowserDialog: FolderBrowserDialog fd = new FolderBrowserDialog(); fd.ShowDialog(); 228
  54.  Một số thuộc tính thường dùng của FolderBrowserDialog: Thuộc tính Mô tả Name Thiết lập tên cho FolderBrowserDialog SelectedPath Trả về đường dẫn cùng tên của thư mục mà người dùng chọn Description Thiết lập chuỗi mô tả hộp thoại, chuỗi mô tả này được hiển thị dưới titlebar của FolderBrowserDialog ShowNewFolderButton Mang hai giá trị True hoặc False. - Nếu là True: Sẽ xuất hiện nút lệnh “Make New Folder” phía dưới bên trái nút lệnh “OK”. Nút lệnh này cho phép người dùng tạo một thư mục mới bên trong thư mục đang chọn. - Nếu là False: Không hiển thị nút lệnh “Make New Folder” RootFolder Thiết lập thư mục mặc định sẽ mở ra khi hiển thị hộp thoại FolderBrowserDialog. Các vị trí thư mục mặc định sẽ mở đã được thiết lập sẵn để lập trình viên lựa chọn. Ví dụ 7.5: Viết chương trình hiển thị hình ảnh có trên hệ thống máy tính. Giao diện chương trình như hình 7.21. Yêu cầu: Chương trình cho phép người dùng chọn đường dẫn đến thư mục chứa hình. Một ListView trên form sẽ hiển thị danh sách tên các hình có đuôi tập tin dạng .JPG, Khi 229
  55. người dùng chọn một hình trên ListView thì hình đó sẽ tương ứng hiển thị trên PictureBox. Hình 7.21: Giao diện chương trình hiển thị hình ảnh Bước 1: Thiết kế giao diện chương trình. Thêm các điều khiển: Label, Button, PictureBox, ListView và FolderBrowserDialog vào form như hình 7.22. pictureBox1 listview1 Hình 7.22: Giao diện form sau khi thêm điều khiển Bước 2: Thiết lập giá trị thuộc tính cho các điều khiển trong cửa sổ Properties - label1: 230
  56. Thuộc tính Text: “HIỂN THỊ HÌNH” Thuộc tính Font Size: 14 Thuộc tính Font Style: Bold - button1: Thuộc tính Text: “Chọn đường dẫn” Thuộc tính Name: btnChon - button2: Thuộc tính Text: “Thoát” Thuộc tính Name: btnThoat - listView1: Thuộc tính Name: listPath Thuộc tính View: Tile Thuộc tính MultiSelect: False Thuộc tính AllowDrop: True - pictureBox1: Thuộc tính Name: picboxHienThi Thuộc tính SizeMode: StretchImage - folderBrowserDialog1: Thuộc tính Name: myFolderBrowser Bước 3: Viết mã lệnh cho các điều khiển - Sự kiện Click của nút btnChon: private void btnChon_Click(object sender, EventArgs e) { DialogResult dr = myFolderBrowser.ShowDialog() ; string[] path = Directory.GetFiles(myFolderBrowser.SelectedPath,"*.jpg"); if (dr == DialogResult.OK) { foreach (string i in path) { int vt = i.LastIndexOf('\\'); listPath.Items.Add(i.Substring(vt+1, i.Length - vt-1)); } } } - Sự kiện Click của nút btnThoat: private void btnThoat_Click(object sender, EventArgs e) { Close(); } 231
  57. - Sự kiện SelectedIndexChanged của nút listPath: private void listPath_SelectedIndexChanged(object sender, EventArgs e) { picboxHienThi.ImageLocation = folderBrowserDialog1.SelectedPath + "\\" + listPath.FocusedItem.Text; } 7.7. Bài tập cuối chƣơng Câu 1: Thiết kế chương trình xử lý văn bản có giao diện như hình 7.23. Hình 7.23: Giao diện chương trình xử lý văn bản Xử lý menu “Hệ Thống”: - Mở (Ctr+M): dùng OpenFileDialog để mở một file text bất kỳ hiện có trên ổ cứng máy tính và hiển thị nội dung của file text đó. Nếu không có sinh viên tự tạo ra một file text với nội dung bất kỳ. Xử lý menu “Thiết Lập”: - Đổi (Ctrl+D): để viết IN kí tự đầu của mỗi từ và cắt bỏ những kí tự trắng hiện có trong đoạn văn bản đang hiển thị. - Font (Ctrl+F): dùng FontDialog và ColorDialog để thay đổi font, size, color của vùng văn bản đang được chọn khối trong khung hiển thị. Xử lý menu “Thông tin”: 232
  58. - Sinh viên: Hiển thị MessageBox bao gồm các thông tin Họ tên – Mã số sinh viên của sinh viên. Gợi ý: khoảng trắng thừa là những khoảng trắng đứng đầu và cuối đoạn văn bản, những khoảng trắng đứng sau một khoảng trắng khác, những khoảng trắng đứng trước các dấu ngắt câu như dấu phẩy “,” dấu chấm “.” dấu chấm phẩy ”;” dấu hai chấm “:” dấu hỏi “?” dấu chấm than “!” Câu 2: Thiết kế chương trình tính toán có giao diện như hình 7.24. Hình 7.24: Giao diện chương máy tính Yêu cầu:  Xử lý sự kiện điều khiển form hình 7.24: - Khi chưa nhấn lên Button “On/Off” một lần nào hoặc số lần kích lên nút là chẵn thì máy tính trong điều kiện không sẵn sàng sử dụng, nghĩa là không cho tác động lên các thành phần khác trên form máy tính. - Mặc định, RadioButton “Có” đang được chọn. - Bẫy lỗi nhập, chỉ cho nhập số vào hai TextBox txtSoA và txtSoB. - TextBox kết quả không cho người dùng nhập liệu mà chỉ để xuất kết quả của phép toán khi người dùng nhấn các Button “Cộng”, “Trừ”, “Nhân”, “Chia” tương ứng. Khi kích nút phép toán nào thì nút đang được chọn sẽ đổi màu nền. Nếu kích lên nút phép toán khác thì nút phép toán đã được kích trước đó sẽ trở về màu nền ban đầu. - Khi RadioButton “Có” đang được chơn, cứ mỗi phép toán ra được kết quả thì ghi toàn bộ phép toán đó thành một dòng dạng Giá trị A Tên phép toán Giá tri B = Kết quả tính vào tập tin GhiText.txt (xem hình 7.25), đồng thời, cho tác 233
  59. động Button “Xem File”. File GhiText.txt phải đặt cùng vị trí với file chạy (.exe) của chương trình. - Khi chọn RadioButton “Không” thì tập tin GhiText.txt hiện có sẽ bị xóa, đồng thời, không cho tác động lên Button “Xem File”. - Kích Button “Xem File” cho phép hiển thị form ghi chép phép toán (hình 7.25) - Kích Button “Làm lại” sẽ xóa sạch nội dung các ô nhập, ô kết quả và nội dung tập tin GhiText.txt, chờ thực hiện bài toán mới Hình 7.25: Giao diện form ghi chép phép toán  Xử lý sự kiện điều khiển form hình 7.25: - Khi load form, xuất hiện OpenFileDialog cho chọn tập tin GhiText.txt và hiển thị nội dung file lên form. - Button “Dừng Xem” thì đóng form ghi chép phép toán để trở về màn hình form máy tính. Câu 3: Thiết kế chương trình tính toán Fibonacy có giao diện như hình 7.26. 234
  60. Hình 7.26: Giao diện chương trình tính toán Fibonacy Yêu cầu: - Button “Mở/Tắt”: Khi chưa kích lên nút một lần nào hoặc số lần kích lên nút là chẵn thì tắt máy, nghĩa là không cho tác động lên các thành phần khác trên form. Nếu số lần kích lên nút là lẻ thì mở máy, nghĩa là cho tác động lên các thành phần còn lại trên form. - Nhập và tính kết quả: Cách tính giá trị từng số hạng trong dãy Fibonaci: F0=1, F1=1, Fn=Fn-1+Fn-2 (với n>=2) o Hình 7.27: Giao diện ban đầu khi chưa nhập số n, chờ nhập số n. Bẫy lỗi nhập, chỉ cho nhập vào một số n thỏa 2 ≤ n ≤ 10. Hình 7.27: Giao diện ban đầu khi chưa nhập n o Hình 7.28: khi vừa nhập vào số n thỏa điều kiện, hiển thị giá trị của F0 và F1. Đồng thời, điền thêm giá trị n vào nhãn của số hạng F đang để trống. 235
  61. Hình 7.28: Giao diện khi nhập n thỏa điều kiện o Hình 7.29: khi nhấp chọn Button “=”., in giá trị số hạng Fn vào ô kết quả. Khi đã in kết quả thì không cho thay đổi giá trị trong ô nhập n. Hình 7.29: Kết quả tính Fibonacy khi n = 5 - GroupBox “Ghi từng số hạng vào file văn bản”: o Khi radioButton “Có” đang được chọn, cứ mỗi giá trị n nhập hợp lệ và ra được kết quả thì ghi vào tập tin GhiChep.txt đầy đủ từng số hạng từ F0 Fn, mỗi số hạng ghi thành một dòng dạng giống như trong Hình 2, đồng thời, cho tác động Button “Xem File”. (Tập tin GhiChep.txt phải đặt cùng vị trí với file chạy (.exe) của chương trình.) o Khi chọn vào radioButton “Không” thì tập tin GhiChep.txt hiện có sẽ bị xóa, đồng thời, không cho tác động lên Button “Xem File”. o Nhấn chọn Button “Xem File” cho hiển thị form Dãy Fibonaci trên form như hình 7.30. 236
  62. - Hình 7.30: Giao diện form hiển thị kết quả Fibonacy từ F0 đến F10 - Xử lý form Dãy Fibonaci: o Khi load form, xuất hiện OpenDialog cho chọn tập tin GhiChep.txt và hiển thị nội dung tập tin lên form. o Nhấn chọn Button “Dừng Xem” thì đóng form Dãy Fibonaci để trở về form hình 7.26. - Nhấn chọn Button “Tiếp tục” xóa sạch nội dung các ô nhập, ô xuất kết quả và nội dung tập tin GhiChep.txt và chờ nhập số n mới. 237
  63. CHƯƠNG 8: LÀM VIỆC VỚI ĐIỀU KHIỂN IN ẤN 8.1. Điều khiển PageSetupDialog Điều khiển PageSetupDialog được hiển thị dạng hộp thoại khi chương trình thực thi. Việc hiển thị dạng hộp thoại cho phép người dùng dễ dàng thay đổi các thiết lập về trang như: canh lề, định hướng, kích thước trang, . Hộp thoại PageSetupDialog có giao diện như hình 8.1. Hình 8.1: Giao diện hộp thoại PageSetupDialog Những thay đổi của người dùng trên hộp thoại PageSetupDialog cũng sẽ làm thay đổi các giá trị tương ứng trên hộp thoại PrintDocument. Do đó việc thiết lập các giá trị trong hộp thoại PageSetupDialog cũng ảnh hưởng đến hình dạng của trang khi in ấn. Hiển thị hộp thoại PageSetupDialog sử dụng phương thức ShowDialog(). Tuy nhiên, điểm khác biệt là để có thể gọi được phương thức ShowDialog() thì cần phải thực hiện một thao tác trước là gán một đối tượng thuộc lớp PrintDocument cho thuộc tính Document của điều khiển PageSetupDialog. Bởi vì như đã nói ở trên là PageSetupDialog và PrintDocument có liên hệ với nhau. Những thay đổi tùy chọn trong PageSetupDialog đều ảnh hưởng đến hình dạng của trang khi in, mặt khác 238
  64. PrintDocument là đối tượng chính để thực hiện tiến trình in ấn. Do đó cần phải thiết lập một đối tượng thuộc lớp PrintDocument cho thuộc tính Document trước. Điều khiển PageSetupDialog nằm trong nhóm Printing của cửa sổ Toolbox như hình 8.2. Điều khiển PageSetupDialog Hình 8.2: Điều khiển PageSetupDialog trong cửa sổ Toolbox  Một số thuộc tính thường dùng của PageSetupDialog: Bảng 8.1: Bảng mô tả các thuộc tính của PageSetupDialog Thuộc tính Mô tả AllowMargins Mang hai giá trị True hoặc False. - Nếu là True: Cho phép thiết lập độ rộng lề trên, dưới, phải và trái của trang - Nếu là False: Không cho phép thiết lập lề của trang AllowOrientation Mang hai giá trị True hoặc False. - Nếu là True: Cho phép thiết lập trang hiển thị theo chiều ngang hoặc theo chiều dọc. - Nếu là False: Không cho phép thiết lập chiều hiển thị của trang. AllowPaper Mang hai giá trị True hoặc False. - Nếu là True: Cho phép thiết lập kích thước của trang. Có thể thiết lập trang kích thước A4, A3, - Nếu là False: Không cho phép thiết lập kích thước của trang AllowPrinter Mang hai giá trị True hoặc False. - Nếu là True: Cho phép người dùng sử dụng chọn nút máy in. Khi người dùng nhấp vào nút Printer sẽ 239
  65. xuất hiện hộp thoại cho phép chọn máy in. - Nếu là False: Nút printer không có hiệu lực Document Mang giá trị là một đối tượng thuộc lớp PrintDocument. Lưu ý: Thuộc tính Document phải được gán giá trị trước khi hộp thoại PageSetupDialog được hiển thị bằng phương thức ShowDialog(). MinMargins Kích thước nhỏ nhất mà người dùng có thể thiết lập để canh lề trên, dưới, trái hay phải của trang. ShowHelp Mang hai giá trị True hoặc False. - Nếu là True: Trên hộp thoại xuất hiện thêm nút Help - Nếu là False: Không xuất hiện nút Help trên hộp thoại ShowNetwork Mang hai giá trị True hoặc False. - Nếu là True: Trên hộp thoại xuất hiện nút Network. Nút này cho phép người dùng có thể chọn máy in mạng. - Nếu là False: Không hiển thị nút Network  Hiển thị hộp thoại PageSetupDialog: Lâp trình viên có thể sử dụng điều khiển PageSetupDialog bằng cách thêm điều khiển PageSetupDialog từ cửa sổ Toolbox vào form. Sau đó, trước khi hiển thị hộp thoại PageSetupDialog bằng phương thức ShowDialog(), lập trình viên cần phải thiết lập thuộc tính Document bằng 1 đối tượng thuộc PrintDocument như hình 8.3. 240
  66. Thuộc tính Name của nút là btnHienThi Kéo điều khiển PageSetupDialog Thiết lập giá trị thuộc tính và PrintDocument Document là đối tượng vào form printDocument1 vừa kéo từ Toolbox vào form Hình 8.3: Giao diện hiển thị hộp thoại PageSetupDialog Sự kiện Click của nút btnHienThi: private void btnHienThi_Click(object sender, EventArgs e) { pageSetupDialog1.ShowDialog(); } Ngoài ra, nếu không sử dụng điều khiển PageSetupDialog và PrintDocument bằng cách kéo thả vào form từ cửa sổ Toolbox, lập trình viên cũng có thể tạo đối tượng PageSetupDialog và hiển thị hộp thoại này bằng mã lệnh như sau: private void btnHienThi_Click(object sender, EventArgs e) { PageSetupDialog PageSD = new PageSetupDialog(); System.Drawing.Printing.PrintDocument printDoc = new System.Drawing.Printing.PrintDocument(); PageSD.Document = printDoc; PageSD.ShowDialog(); } 8.2. Điều khiển PrintPreviewDiaLog Điều khiển PrintPreviewDialog giúp cho người dùng có thể xem trước trang in sẽ trông như thế nào trước khi trang đó được in ra trên trên giấy. Lý do điều khiển PrintPreviewDiaLog có thể xem trước được trang in như vậy là vì đã gọi phương thức Print() của đối tượng lớp PrintDocument được thiết lập trong thuộc tính Document của PrintPreviewDialog. Khi đó, thay vì phương thức Print() thực hiện chức năng in trực 241
  67. tiếp trên giấy thì trang in sẽ xuất ra trên một giao diện đồ họa được biểu diễn như một trang giấy của hộp thoại Print preview hình 8.4. Hình 8.4: Giao diện PrintPreviewDialog khi được hiển thị Trên giao diện hình 8.4 của điều khiển PrintPreviewDialog, người dùng có thể lựa chọn trang sẽ xem, phóng to hoặc thu nhỏ trang, lựa chọn chế độ hiển thị trang (1 trang, 2 trang, 3 trang, ). Sau khi đã xem xong, người dùng có thể in trang hiển thị trên giấy bằng cách nhấn vào biểu tượng máy in trên hộp thoại Print preview. Điều khiển PrintPreviewDialog nằm trong nhóm Printing của cửa sổ Toolbox như hình 8.5. 242
  68. Điều khiển PrintPreviewDialog Hình 8.5: Điều khiển PrintPreviewDialog trong cửa sổ Toolbox  Hiển thị hộp thoại PrintPreviewDialog: Hộp thoại PrinPreviewDialog hiển thị bằng phương thức ShowDialog() hoặc phương thức Show(). Tuy nhiên trước khi hộp thoại được hiển thị lập trình viên cần thiết lập thuộc tính Document của PrintPreviewDialog có giá trị là một đối tượng PrintDocument. Lập trình viên có thể tạo đối tượng và hiển thị hộp thoại PrintPreviewDialog bằng mã lệnh như sau: private void btnHienThi_Click(object sender, EventArgs e) { PrintPreviewDialog preview = new PrintPreviewDialog (); System.Drawing.Printing.PrintDocument printDoc = new System.Drawing.Printing.PrintDocument(); preview.Document = printDoc; preview.ShowDialog(); } Ví dụ 8.1: Thiết kế chương trình có giao diện gồm Button và Textbox như hình 8.6. Yêu cầu: Người dùng có thể nhập văn bản vào Textbox và khi ấn vào Button cho phép xem trang văn bản trước khi in như hình 8.7. 243
  69. Hình 8.6: Giao diện chương trình nhập văn bản Hình 8.7: Giao diện hộp thoại xem trang văn bản trước khi in Hướng dẫn: Bước 1: Thiết kế giao diện ban đầu: Thêm các điều khiển Button, Textbox, PrintDocument và PrintPreviewDialog từ cửa sổ Toolbox vào form như hình 8.8. textBox1 Hình 8.8: Giao diện ban đầu của form sau khi thêm điều khiển Bước 2: Thiết lập giá trị thuộc tính cho các điều khiển trong cửa sổ Properties. - textBox1: Thuộc tính Name: txtNoiDung Thuộc tính Multiline: True Thuộc tính Size: 297, 161 244
  70. - Button1: Thuộc tính Name: btnXemBanIn Thuộc tính Text: “Xem trước bản in” Thuộc tính Size: 296, 35 - printPreviewDialog1: Thuộc tính Document: printDocument1 Bước 3: Viết mã lệnh cho các điều khiển - Xây dựng hàm DrawText: private void DrawText(object sender, System.Drawing.Printing.PrintPageEventArgs e) { string text = txtNoiDung.Text; System.Drawing.Font printFont = new System.Drawing.Font("Arial", 35, System.Drawing.FontStyle.Regular); e.Graphics.DrawString(text, printFont, System.Drawing.Brushes.Black, 0, 0); } - Viết mã lệnh cho sự kiện Click nút btnXemBanIn: private void button1_Click(object sender, EventArgs e) { printDocument1.PrintPage += DrawText; printPreviewDialog1.Document = printDocument1; printPreviewDialog1.ShowDialog(); } 8.3. Điều khiển PrintPreviewControl Cũng như điều khiển PrintPreviewDialog, điều khiển PrintPreviewControl sử dụng để xem trước trang in trước khi in văn bản trên giấy bằng máy in. Tuy nhiên, điểm khác biệt là PrintPreviewDialog hiển thị ở dạng hộp thoại độc lập với form, còn PrintPreviewControl thì hiển thị trên form, do đó việc hiển thị PrintPreviewControl không cần phải sử dụng phương thức Show() hay phương thức ShowDialog(). Lập trình viên có thể kéo PrintPreviewControl từ cửa sổ Toolbox vào form và bố trí cạnh các điều khiển khác như TextBox, Button, Label, Điều khiển PrintPreviewControl nằm trong nhóm Printing của cửa sổ Toolbox như hình 8.9. 245
  71. Điều khiển PrintPreviewControl Hình 8.9: Điều khiển PrintPreviewControl trong cửa sổ Toolbox  Một số thuộc tính thường dùng của PrintPreviewControl: Bảng 8.2: Bảng mô tả các thuộc tính của PrintPreviewControl Thuộc tính Mô tả AutoZoom Mang hai giá trị True hoặc False. - Nếu là True: Cho phép trang hiển thị tự động phóng to hay thu nhò vừa với điều khiển khi kích thước bị thay đổi. - Nếu là False: Kích thước trang sẽ cố định. Nếu kích thước điều khiển nhỏ hơn kích thước trang sẽ hiển thị thanh trượt. Columns Thiết lập số trang hiển thị theo chiều ngang trên màn hình Document Thiết lập tài liệu sẽ được xem trước. Lưu ý: Giá trị thiết lập là một đối tượng thuộc lớp PrintDocument Rows Thiết lập số trang hiển thị theo chiều dọc trên màn hình. StartPage Thiết lập trang sẽ hiển thị đầu tiên khi xem trước trang in. UseAntiAlias Mang hai giá trị True hoặc False. - Nếu là True: Cho phép người dùng loại bỏ răng 246
  72. cưa trên trang hiển thị. Giúp trang hiển thị trông mượt hơn. Tuy nhiên, sử dụng chế độ này sẽ làm cho chương trình bị chậm. - Nếu là False: Không sử dụng chế độ loại bỏ răng cưa. Zoom Thiết lập kích thước hiển thị của trang. Ví dụ 8.2: Viết chương trình có giao diện như hình 8.10. Chương trình bao gồm các điều khiển TextBox, GroupBox, Button, PrintDocument, PrintPreviewControl Hình 8.10: Giao diện chương trình xem trước trang in bằng PrintPreviewControl Yêu cầu: Người dùng nhập đoạn văn bản vào TextBox. Khi nhấn nút “Xem bản in” thì sẽ hiển thị trước trang in trên PrintPreviewControl. Ngoài ra người dùng có thể sử dụng nút “Phóng to” và nút “Thu nhỏ” để thay đổi kích thước trang hiển thị. Sử dụng nút “In” để in trang hiển thị ra giấy trên máy in. Hướng dẫn: Bước 1: Thiết kế giao diện ban đầu: Thêm các điều khiển TextBox, GroupBox, Button, PrintDocument, PrintPreviewControl từ Toolbox vào form như hình 8.11. 247
  73. textBox1 printPreviewControl1 Hình 8.11: Giao diện thiết kế form khi thêm điều khiển Bước 2: Thiết lập giá trị thuộc tính cho các điều khiển trong cửa sổ Properties - Form1: Thuộc tính Size: 607, 412 - groupBox1: Thuộc tính Text: “Nhập nội dung văn bản” - groupBox2: Thuộc tính Text: “Xem trước bản in” - textBox1: Thuộc tính Name: txtVanBan Thuộc tính Multiline: True Thuộc tính Size: 270, 286 - printPreviewControl1: Thuộc tính AutoZoom: True Thuộc tính Document: printDocument1 - button1: Thuộc tính Name: btnXemBanIn Thuộc tính Text: “Xem bản in” - button2: Thuộc tính Name: btnThoat Thuộc tính Text: “Thoát” - button3: Thuộc tính Name: btnPhongTo 248
  74. Thuộc tính Text: “Phóng to” - button4: Thuộc tính Name: btnThuNho Thuộc tính Text: “Thu nhỏ” - button5: Thuộc tính Name: btnIn Thuộc tính Text: “In” Bước 3: Viết mã lệnh cho các điều khiển - Xây dựng hàm DrawText: private void DrawText(object sender, System.Drawing.Printing.PrintPageEventArgs e) { string text = txtVanBan.Text; System.Drawing.Font printFont = new System.Drawing.Font("Arial", 35, System.Drawing.FontStyle.Regular); e.Graphics.DrawString(text, printFont, System.Drawing.Brushes.Black, 0, 0); } - Sự kiện Click nút btnXemBanIn: private void btnXemBanIn_Click(object sender, EventArgs e) { PreView(); } - Xây dựng hàm PreView: private void PreView() { printDocument1.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(DrawText); printPreviewControl1.Document = printDocument1; } - Sự kiện Click nút btnThoat: private void btnThoat_Click(object sender, EventArgs e) { Close(); } - Sự kiện Click nút btnIn: private void btnIn_Click(object sender, EventArgs e) { printDocument1.Print(); } 249
  75. - Sự kiện Click nút btnPhongTo: private void btnPhongTo_Click(object sender, EventArgs e) { printPreviewControl1.Zoom += 0.01; PreView(); } - Sự kiện Click nút btnThuNho: private void btnThuNho_Click(object sender, EventArgs e) { printPreviewControl1.Zoom -= 0.01; PreView(); } 8.4. Điều khiển PrintDialog Điều khiển PrintDialog cho phép hiển thị dạng hộp thoại như hình 8.12 để người dùng chọn máy in và in văn bản. Cũng như các điều khiển thực hiện công viêc in ấn khác, hộp thoại PrintDialog được hiển bằng phương thức ShowDialog() nhưng trước khi gọi phương thức ShowDialog() lập trình viên cần thiết lập giá trị cho thuộc tính Document. Hình 8.12: Giao diện hộp thoại PrintDialog 250
  76. Điều khiển PrintDialog nằm trong nhóm Printing của cửa sổ Toolbox như hình 8.13. Điều khiển PrintDialog Hình 8.13: Điều khiển PrintDialog trong cửa sổ Toolbox  Một số thuộc tính thường dùng của PrintDialog: Bảng 8.2: Bảng mô tả các thuộc tính của PrintDialog Thuộc tính Mô tả AllowCurrentPage Mang hai giá trị True hoặc False. - Nếu là True: Cho phép chọn trang hiện hành để in. - Nếu là False: Không cho phép in chọn in trang hiện hành. AllowPrintToFile Mang hai giá trị True hoặc False. - Nếu là True: Cho phép hiển thị Checkbox , người dùng có thể in ra thành file thay vì in ra giấy trên máy in - Nếu là False: Không hiển thị Checkbox AllowSelection Mang hai giá trị True hoặc False. - Nếu là True: Cho phép hiển thị RadioButton Selection để người dùng chọn trang sẽ in. 251
  77. - Nếu là False: Không hiển thị RadioButton Selection AllowSomePages Mang hai giá trị True hoặc False. - Nếu là True: Cho phép hiển thị RadioButton Pages để người dùng chọn in trang thứ i - Nếu là False: Không hiển thị RadioButton Pages Document Thiết lập tài liệu sẽ được in. Lưu ý: Giá trị thiết lập là một đối tượng thuộc lớp PrintDocument PrintToFile Mang hai giá trị True hoặc False. - Nếu là True: Checkbox PrintToFile trên hộp thoại được chọn. - Nếu là False: Checkbox PrintToFile trên hộp thoại không được chọn. PrintSettings Thuộc tính PrintSettings có nhiều tùy chọn bên trong giúp thiết lập các công việc như: - PrintSettings.PrinterName = : Chọn máy in - PrintSettings.PrintToFile = : Cho phép hoặc không cho phép in ra tập tin. - PrintSettings.FromPage = : Thiết lập bắt đầu in từ trang thứ mấy. - PrintSettings.ToPage = : Thiết lập trang cuối cùng sẽ in - PrintSettings.Size: Lấy kích cỡ giấy mà máy in hỗ 252
  78. trợ. - PrintSettings.Resolutions: Lấy tất cả độ phân giải mà máy in hỗ trợ. - PrintSettings.Duplex = : Thiết lập chế độ in một mặt hay hai mặt của trang giấy. - PrintSettings.CanDuplex: Trả về giá trị True hoặc False, cho biết máy in có hỗ trợ in hai mặt của trang giấy hay không. Ví dụ 8.3: Viết chương trình in hình ảnh. Chương trình có giao diện như hình 8.14 cho phép người dùng chọn 1 hình ảnh trên máy tính và hiển thị trên PictureBox. Người dùng có thể sử dụng Button “In Hình” để gọi hộp thoại PrintDialog và in hình ra giấy bầng máy in. Hình 8.14: Giao diện chương trình in hình ảnh Hướng dẫn: Bước 1: Thiết kế giao diện ban đầu: Thêm các điều khiển Button, PictureBox, PrintDialog, PrintDocument và OpenFileDialog từ cửa sổ Toolbox và form như hình 8.15. 253
  79. pictureBox1 Hình 8.15: Giao diện ban đầu form in hình ảnh Bước 2: Thiết lập giá trị thuộc tính cho điều khiển trong cửa sổ Properties. - button1: Thuộc tính Name: btnChonHinh Thuộc tính Text: “Chọn hình” - button2: Thuộc tính Name: btnIn Thuộc tính Text: “In hình” - button3: Thuộc tính Name: btnThoat Thuộc tính Text: “Thoát” - pictureBox1: Thuộc tính BorderStyle: FixedSingle Thuộc tính SizeMode: StretchImage - openFileDialog1: Thuộc tính Filter: “jpg images|*.jpg” - PrintDialog: Thuộc tính AllowCurrentPage: True Thuộc tính AllowPrintToFile: True 254
  80. Thuộc tính AllowSelection: True Thuộc tính AllowSomePages: True Thuộc tính Document: printDocument1 Thuộc tính PrintToFile: True Thuộc tính ShowHelp: True Thuộc tính ShowNetwork: True Bước 3: Viết mã lệnh cho các điều khiển - Viết hàm printPicture_PrintPage: void printPicture_PrintPage(object sender, PrintPageEventArgs e) { try { if (pictureBox1.Image != null) { Bitmap bitmap = new Bitmap(pictureBox1.Image); if (bitmap != null) { e.Graphics.DrawImage(bitmap, 10, 10); } } } catch (Exception ex) { MessageBox.Show(ex.Message); } } - Sự kiện Click nút btnThoat: private void btnThoat_Click(object sender, EventArgs e) { Close(); } - Sự kiện Click nút btnChonHinh: private void btnChonHinh_Click(object sender, EventArgs e) { if (openFileDialog1.ShowDialog() == DialogResult.OK) { pictureBox1.ImageLocation = openFileDialog1.FileName; } } 255
  81. - Sự kiện Click nút btnIn: private void btnIn_Click(object sender, EventArgs e) { printDocument1.PrintPage += new PrintPageEventHandler(printPicture_PrintPage); printDialog1.Document = printDocument1; if (printDialog1.ShowDialog() == DialogResult.OK) { printDocument1.PrinterSettings = printDialog1.PrinterSettings; printDocument1.Print(); } } 8.5. Điều khiển PrintDocument Lớp PrintDocument có không gian tên là System.Drawing.Printing. PrintDocument là lớp thường xuyên lớp nắm giữ nội dung cần in ra tập tin hay máy in, do đó PrintDocument được sử dụng nhiều trong việc in ấn. Đối tượng tạo ra từ PrintDocument được sử dụng cùng với các điều khiển PrinDialog, PrintPreviewDialog, PrintPreviewControl, Lập trình viên có thể tạo ra đối tượng PrintDocument bằng cách kéo điều khiển PrinDocument từ cửa sổ Toolbox vào form như hình 8.16. Hình 8.16: Điều khiển PrintDocument trong cửa sổ Toolbox Hoặc có thể tạo đối tượng PrintDocument bằng mã lệnh như sau: PrintDocument prtDC= new PrintDocument(); 256
  82.  Sử dụng điều khiển PrintDocument: Trong công việc in ấn, để in nội dung mà PrintDocument nắm giữ ra máy in hoặc ra tập tin, lập trình viên sử dụng phương thức Print() của lớp PrintDocument: prtDC.Print(); Khi gọi phương thức Print thì sự kiện PrintPage được phát sinh để tiến hành vẽ các nội dung PrintDocument nắm giữ trên các trang giấy. Như vậy, lập trình viên cần phải định nghĩa các công việc cần phải làm khi sự kiện PrintPage phát sinh, thông thường công việc này là vẽ các nội dung PrintDocument nắm giữ lên trang giấy. Để đơn giản lập trình viên sẽ xây dựng một hàm độc lập thực hiện công việc vẽ này và gọi hàm thực hiện trong sự kiện PrintPage. - Hàm vẽ văn bản: private void DrawText(object sender, System.Drawing.Printing.PrintPageEventArgs e) { string text = "Khoa Công nghệ thông tin"; System.Drawing.Font printFont = new System.Drawing.Font("Arial", 35, System.Drawing.FontStyle.Regular); e.Graphics.DrawString(text, printFont, System.Drawing.Brushes.Black, 0, 0); } - Hàm vẽ hình chứa trong pictureBox1 ra trang giấy: private void DrawPicture(object sender, System.Drawing.Printing.PrintPageEventArgs e) { try { if (pictureBox1.Image != null) { Bitmap bitmap = new Bitmap(pictureBox1.Image); if (bitmap != null) { e.Graphics.DrawImage(bitmap, 10, 10); } } } catch (Exception ex) { MessageBox.Show(ex.Message); } } 257
  83. - Thực hiện gọi hàm vẽ văn bản hoặc vẽ hình ảnh lên trang giấy in hoặc lên tập tin trong sự kiện PrintPage: private void btnIn_Click(object sender, EventArgs e) { //khai báo đối tượng lớp PrintDocument PrintDocument printDC = new PrintDocument(); //S ử dụng hàm vẽ văn bản trong sự kiện PrintPage. Nếu muốn vẽ //hình thì thay Drawtext bằng DrawPicture printDC.PrintPage += new PrintPageEventHandler(DrawText); //Khai báo đối tượng lớp PrintPreviewDialog PrintPreviewDialog printPrev = new PrintPreviewDialog(); printPrev.Document = printDC; //Hiển thị hộp thoại PrintPreviewDialog để xem trước trang in if (printPrev.ShowDialog() == DialogResult.OK) { //Nếu người dùng nhấn nút in thì phương thức Print sẽ //thực hiện và khi đó sẽ phát sinh sự kiện PrintPage thực //hiện công việc vẽ văn bản hoặc vẽ hình ảnh printDC.Print(); } }  In nội dung trên nhiều trang: Có vấn đề phát sinh với việc in ấn khi nội dung cần in quá nhiều, nhiều hơn kích thước của một trang giấy và nếu xử lý bằng những các câu lệnh trên thì người dùng sẽ chỉ in được một trang. những nội dung vượt quá kích thước trang sẽ bị mất đi. Vấn đề này xảy ra bởi vì PrintDocument không có ký tự ngắt dòng và cũng không thể tự động ngắt trang. Do đó, cần phải viết mã lệnh thực hiện các công việc ngắt dòng và ngắt trang này. Để có thể ngắt dòng in, lập trình viên cần biết được kích thước dòng và tính ra số ký tự tối đa có thể in trên một dòng của trang. Tương tự, muốn ngắt trang thì lập trình viên cũng phải tính toán được kích thước trang từ đó lấy ra thông tin số dòng có thể in trên một trang giấy. Ví dụ 8.4: Viết chương trinh in văn bản có giao diện như hình 8.17. Chương trình gồm các điều khiển Button, TextBox, GroupBox. Yêu cầu: Người dùng nhập văn bản vào TextBox. Khi nhấn nút “Xem bản in” sẽ hiển thị trước trang in. Trang hiển thị sẽ tự động ngắt dòng xuống hàng và sang trang mới nếu số lượng ký tự của văn bản vượt kích thước trang in. 258
  84. Hình 8.17: Giao diện chương trình in văn bản Bước 1: Thiết kế giao diện ban đầu cho điều khiển: Thêm các điều khiển Button, TextBox, GroupBox trong cửa sổ Toolbox vào form như hình 8.18. textBox1 Hình 8.18: Giao diện form sau khi thêm điều khiển Bước 2: Thiết lập giá trị thuộc tính cho điều khiển trong cửa sổ Properties. - button1: Thuộc tính Name: btnIn Thuộc tính Text: “Xem bản in” 259
  85. - button2: Thuộc tính Name: btnThoat Thuộc tính Text: “Thoát” - textBox1: Thuộc tính Name: txtVanBan Thuộc tính Multiline: True Thuộc tính Size: 274, 234 - groupBox1: Thuộc tính Text: “Nội dung văn bản” Thuộc tính Size: 308, 273 Bước 3: Viết mã lệnh cho các điều khiển - Khai báo biến: string stringtoPrint = ""; - Sự kiện Click nút btnIn: private void btnIn_Click(object sender, EventArgs e) { stringtoPrint = txtVanBan.Text; PrintDocument printDC = new PrintDocument(); printDC.PrintPage += new PrintPageEventHandler(DrawText); PrintPreviewDialog printPrev = new PrintPreviewDialog(); printPrev.Document = printDC; if (printPrev.ShowDialog() == DialogResult.OK) { printDC .Print(); } } - Sự kiện Click nút btnThoat: private void btnThoat_Click(object sender, EventArgs e) { Close(); } 260
  86. - Mã lệnh hàm DrawText: private void DrawText(object sender, System.Drawing.Printing.PrintPageEventArgs e) { int sokytu, sodong; string chuoiin; //khai báo font chữ System.Drawing.Font printFont = new System.Drawing.Font("Arial", 35, System.Drawing.FontStyle.Regular); //khai báo chuỗi định dạng StringFormat chuoidinhdang=new StringFormat(); //khai báo vùng sẽ in trên trang System.Drawing.RectangleF vungin = new RectangleF(e.MarginBounds.Left, e.MarginBounds.Top, e.MarginBounds.Width, e.MarginBounds.Height); //khai báo kích thước SizeF kichthuoc = new SizeF(e.MarginBounds.Width, e.MarginBounds.Height - printFont.GetHeight(e.Graphics)); chuoidinhdang.Trimming = StringTrimming.Word; //Sử dụng phương thức MeasureString để lấy số ký tự trên một //dòng và số lượng dòng văn bản e.Graphics.MeasureString(stringtoPrint, printFont, kichthuoc, chuoidinhdang,out sokytu,out sodong); //Trích các ký tự sẽ hiển thị trên một dòng chuoiin = stringtoPrint.Substring(0, sokytu); e.Graphics.DrawString(chuoiin, printFont, Brushes.Black, vungin, chuoidinhdang); if (sokytu < stringtoPrint.Length) { stringtoPrint = stringtoPrint.Substring(sokytu); e.HasMorePages = true; } else { e.HasMorePages = false; stringtoPrint = txtVanBan.Text; } } 261
  87. CHƢƠNG 9: ĐIỀU KHIỂN NGƢỜI DÙNG TỰ TẠO 9.1. User Control User Control là điều khiển do lập trình viên tạo ra theo nhu cầu sử dụng riêng. Trong nhiều trường hợp, lập trình viên đã thiết kế xong một điều khiển hay một giao diện chương trình gồm nhiều điều khiển, và nếu có nhu cầu sử dụng nhiều lần hoặc mang sang một dự án khác sử dụng thì lập trình viên sẽ chuyển những điều khiển hay nhóm điều khiển đó về dạng User Control. Một cách cụ thể hơn User Control là điều khiển được tạo ra trên cơ sở các điều khiển mà Windows Form hỗ trợ sẵn như: TextBox, Label, Button, Việc sử dụng User Control như vậy sẽ giúp tiết kiệm chi phí thời gian khi thiết kế giao diện chương trình. Lập trình viên có thể tạo ra User Control bằng các cách như sau:  Thêm mới User Control ngay trong dự án.  Tạo lớp và khai báo thừa kế từ lớp Control.  Tạo dự án mới bằng cách chọn loại dự án là Windows Control Library. 9.2. Xây dựng User Control 9.2.1. Thêm mới User Control ngay trong dự án Lập trình viên thêm mới User Control trên thanh thực đơn như hình 9.1. Chọn mục Add User Control Hình 9.1: Thêm User Control từ thực đơn Project Hoặc thêm mới User Control từ cửa sổ Solution Explorer như hình 9.2. 262
  88. Bước 2: Nhấn chuột Bước 1: Nhấn chuột phải trái chọn mục Add trên tên của dự án Bước 3: Nhấn chuột trái chọn mục User Control Hình 9.2: Thêm mới User Control từ cửa sổ Solution Explorer Sau khi lập trình viên thêm mới một User Control vào dự án thì bên cửa sổ Toolbox sẽ hiển thị thêm một điều khiển là User Control vừa thêm trong nhóm UserControlInProject Components như hình 9.3. User Control được thêm trong Toolbox User Control được thêm trong dự án Hình 9.3: User Control mới được hiển thị trên cửa sổ Toolbox Nếu sau khi thêm mới User Control mà không thấy hiển thị trên cửa sổ Toolbox có thể xử lý bằng cách nhấp phải vào Toolbox và chọn mục Show All như hình 9.4. 263
  89. Bước 1: Nhấp chuột phải vào Toolbox Bước 2: Nhấp chuột trái chọn mục Show All Hình 9.4: Chọn chức năng hiển thị tất cả điều khiển trên Toolbox Sau khi đã thêm User Control, lập trình viên có thể sử dụng User Control bằng cách kéo User Control trên Toolbox vào form như hình 9.5. UserControl 1 Hình 9.5: Giao diện form sau khi thả User Control vào Ví dụ: Tạo UserControl Đăng nhập như hình 9.6. Sau đó kéo thả UserControl vào form. 264
  90. Hình 9.6: Form đăng nhập Bước 1: Thêm User Control có tên UserControl1 vào form. Sau đó thêm các điều khiển Label, TextBox và Button vào UserControl1 như hình 9.7. Bước 1: Nhấp đúp chuột trái vào UserControl1 Bước 2: Kéo Button, Label, TextBox vào form Hình 9.7: Giao diện UserControl1 sau khi thêm điều khiển. Bước 2: Thiết lập giá trị thuộc tính cho điều khiển trên UserControl1 trong cửa sổ Properties. - label1: Thuộc tính Text: “Đăng nhập” Thuộc tính Font Size: 14 - label2: Thuộc tính Text: “Tên đăng nhập:” - label3: Thuộc tính Text: “Mật khẩu: - textBox1: Thuộc tính Name: txtTen - textBox2: 265
  91. Thuộc tính Name: txtMatKhau - button1: Thuộc tính Name: btnDangNhap Thuộc tính Text: “Đăng nhập” - button2: Thuộc tính Name: btnThoat Thuộc tính Text: “Thoát” Bước 3: Khi đã thiết kế xong UserControl1, tiến hành biên dịch chương trình để UserControl1 cập nhật các thay đổi. Sau đó lập trình viên kéo UserControl1từ cửa sổ Toolbox vào form sẽ được giao diện đăng nhập như hình 9.8 Hình 9.8: Giao diện form sau khi kéo điều khiển UserControl1 thả vào form 9.2.2. Tạo lớp và khai báo thừa kế từ lớp Control Lập trình viên có thể tạo ra Controls riêng bằng cách tạo ra một lớp mới và chỉ định thừa kế đến một lớp cụ thể. Lớp cụ thể này có thể là lớp: TextBox, Label, ComboBox, Ví dụ 9.2: Tạo ra điều khiển MyTextBox. Điều khiển MyTextBox thừa kế từ lớp TextBox và có thêm thuộc tính mới là NewValue. Hướng dẫn: Bước 1: Tạo lớp mới bằng cách chọn Project > Add Class để hiển thị cửa sổ Add New Item và đặt tên lớp là MyTextBox như hình 9.9. 266
  92. Hình 9.9: Giao diện cửa sổ Add New Item Bước 2: Viết mã lệnh cho lớp MyTextBox - Khai báo thừa kế đến lớp TextBox và thêm thuộc tính NewValue: using System; Khai báo thêm using System.Collections.Generic; using System.Linq; không gian tên using System.Text; Forms using System.Windows.Forms; namespace WindowsFormsApplication1 Thừa kế đến lớp { class MyTextBox:TextBox TextBox { string strNewValue; public string NewValue { get { return strNewValue; } set { strNewValue = value; } } Bư ớ c }3: Biên dịch chương trình, điều khiển MyTextBox sẽ xuất hiện trên cửa sổ Toolbox} như hình 9.10. 267
  93. Điều khiển MyTextBox sau khi Thuộc tính mới biên dịch NewValue của điều khiển NewValue Hình 9.10: Giao diện form sau khi thêm điều khiển MyTextBox Lập trình viên cũng có thể khai báo chuỗi diễn giải để mô tả chức năng của thuộc tính vừa thêm. Để làm được việc này cần khai báo không gian tên System.ComponentModel và thiết lập thuộc tnh1 Description. Ví dụ: Khai báo diễn giải cho thuộc tính NewValue cho điều khiển MyTextBox ở ví dụ 9.2. - Viết mã lệnh trong lớp MyTextBox như sau: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.ComponentModel; namespace WindowsFormsApplication1 { class MyTextBox:TextBox { string strNewValue; [Desciption(“Thuộc tính mới thêm”)] public string NewValue { get{ return strNewValue; } set{ strNewValue = value; } } } } - Giao diện chương trình khi thêm mô tả thuộc tính như hình 9.11: 268
  94. Hình 9.11: Mô tả thuộc tính NewValue 9.2.3. Tạo dự án mới bằng cách chọn loại dự án là Windows Control Library Trong trường hợp muốn tạo User Control để sử dụng cho các dự án khác nhau, lập trình viên có thể tạo User Control và đưa về dạng tập tin .DLL. Để tạo được User Control ở dạng .DLL, cần tạo mới dự án ở dạng Windows Forms Control Library: Chọn File > New Project hiển thị cửa sổ New Project như hình 9.12. 269
  95. Bước 1: Chọn loại dự án Bước 2: Đặt tên User Control và chọn đường dẫn lưu trữ Bước 3: Chọn OK Hình 9.12: Cửa sổ New Project tạo User Control dạng DLL. Sau khi chọn OK sẽ được giao diện User Control như hình 9.13: Giao diện thiết kế User Control Hình 9.13: Giao diện User Control khi thêm Khi thiết kế xong User Control, lập trình viên cần biên dịch dự án để tạo User Control ở dạng tập tin DLL. Tập tin DLL được tạo trong thư mục Debug. Khi muốn sử dụng User Control trong trong án nào chỉ cần thêm DLL đó vào Toolbox như sau: - Trên dự án muốn thêm, nhấp phải chuột trên Toolbox chọn Choose Items, cửa sổ Choose Toolbox Items được hiển thị như hình 9.14: 270
  96. Bước 1: Chọn thẻ .NET Framwork Components Bước 2: Nhấn Browse và tìm đến đường dẫn chứa tập tin DLL vừa tạo Bước 3: Chọn OK Hình 9.14: Cửa sổ Choose Toolbox Item User Control được hiển thị trên cửa sổ Toolbox, lập trình viên sử dụng bằng cách kéo User Control vừa thêm vào form như hình 9.15. Hình 9.15: Thêm User Control vào form từ cửa sổ Toolbox 9.3. Sử dụng User Control Sau khi thêm User Control từ cửa sổ Toolbox vào form, lập trình viên có thể truy xuất từng điển khiển trên User Control thông qua thuộc tính Controls. Ví dụ muốn gán giá trị “Xin chào các bạn” cho thuộc tính Text cho điều khiển Label có tên lblNhan của UserControl1 cần thực hiện như sau: UserControl1.Controls[“lblNhan”].Text = “Xin chào các bạn”; 271
  97. Ví dụ 9.3: Xây dựng kiểm tra số nguyên tố, giao diện xây dựng từ User Control gồm các điều khiển Label, TextBox để nhập số nguyên như hình 9.16. textBox1 label1 Hình 9.16: Giao diện User Control kiểm tra số nguyên tố Sau khi xây dựng xong User Control, tiến hành kéo User Control vào form. Trên form thêm hai Button “Kiểm tra”để kiểm tra số nhập vào có phải số nguyên tố hay không và một Button để thoát chương trình. Giao diện form như hình 9.17. Hình 9.17: Giao diện form kiểm tra số nguyên tố Yêu cầu: Khi nhấn Button “Kiểm tra”, nếu giá trị trong textBox1 là số nguyên tố thì hiển thị trên label1 chuỗi “Là số nguyên tố”, nếu không phải số nguyên tố thì hiển thị trên label1 chuỗi “Không phải số nguyên tố”. Hướng dẫn: Bước 1: Xây dựng giao diện ban đầu: - Thêm mới User Control: chọn Project > Add User Control. User Control có tên UserControl1 được thêm vào. Trên UserControl1 kéo các điều khiển Label và TextBox từ cửa số Toolbox vào như hình 9.18. 272
  98. Hình 9.18: Giao diện ban đầu UserControl1 o Thiết lập thuộc tính cho label3: Thuộc tính Text: “Kiểm tra số nguyên tố” Thuộc tính Font Size: 14 o Thiết lập thuộc tính cho label2: Thuộc tính Text: “Nhập số:” o Thiết lập thuộc tính cho label1: Thuộc tính Text: “ ” Thuộc tính Name: lblKetQua o Thiết lập thuộc tính textBox1: Thuộc tính Name: txtNhapSo Khi thiết lập xong thuộc tính sẽ được giao diện UserControl1 như hình 9.16 - Trên form, kéo User Control vừa tạo vào form và thêm hai Button như hình 9.19. Hình 9.19: Giao diện form khi thêm UserControl1 và Button o Thiết lập thuộc tính cho button1: Thuộc tính Text: “Kiểm tra” Thuộc tính Name: btnKiemTra o Thiết lập thuộc tính cho button2: Thuộc tính Text: “Thoát” 273
  99. Thuộc tính Name: btnThoat Khi thiết lập xong thuộc tính sẽ được giao diện form như hình 9.17. Bước 2: Viết mã lệnh cho điều khiển - Viết hàm kiểm tra số nguyên tố: bool kiemTraSoNguyenTo(int x) { bool kt = true; for (int i = 2; i <= x / 2; i++) if (x % i == 0) kt = false; return kt; } - Sự kiện Click nút btnThoat: private void btnThoat_Click(object sender, EventArgs e) { Close(); } - Sự kiện Click nút btnKiemTra: private void btnKiemtra_Click(object sender, EventArgs e) { int gt = int.Parse(userControl11.Controls["txtNhapSo"].Text); if (kiemTraSoNguyenTo(gt) == true) userControl11.Controls["lblKetQua"].Text = " là số nguyên tố"; else userControl11.Controls["lblKetQua"].Text = gt.ToString() + " không là số nguyên tố"; userControl11.Controls["txtNhapSo"].Text = ""; } 9.4. Cách sử dụng những thƣ viện tạo sẵn để thiết kế giao diện Trong thực tế, có những thư viện tạo sẵn hỗ trợ lập trình viên xây dựng giao diện với mục đích tiết kiệm thời gian như: DotNetBar, SandDock, . Phần lớn các thư viện này đều xây dựng ở dạng tập tin .DLL, do đó lập trình viên có thể dễ dàng sử dụng bằng cách thêm điều khiển vào cửa sổ Toolbox, sau đó kéo thả điều khiển đó vào form. Xem cách sử dụng tại mục 9.2.3. 9.5. Bài tập cuối chƣơng Viết chương trình hỗ trợ người dùng học giải phương trình bậc hai có giao diện như hình 9.20. 274
  100. SplitContainer1 PanelChinh Hình 9.20: Giao diện chính hỗ trợ người dùn học giải phương trình bậc hai  Khi người dùng nhấn chuột chọn Button “Giải phương trình bậc hai” trên giao diện chính: - Chương trình sẽ hiển thị giao diện như hình 9.21. Giao diện “Giải phương trình bậc hai” hiển thị trong PanelChinh là UserControl “UC_Giaiphuongtrinh”. UC_Giaiphuongtrin h txtA txtB txtC cboSoNghie m Panel2 Hình 9.21: Giao diện hiển thị phương trình bậc hai - Các TextBox: txtA, txtB, txtC chứa các hệ số a, b, c của phương trình và được phát sinh ngẫu nhiên. - ComboBox “cboSoNghiem: Chứa 3 lựa chọn cho người dùng lựa chọn bao gồm 3 lựa chọn: “Phương trình vô nghiệm”, “Phương trình có một nghiệm”, “Phương trình có hai nghiệm”. 275
  101. - Vỡi mỗi sự lựa chọn ở cboSoNghiem thì sẽ hiển thị các UserControl: “UC_VoNghiem”, “UC_MotNghiem”, “UC_HaiNghiem” tương ứng như sau: o Nếu người dụng chọn mục “Phương trình vô nghiệm” thì Panel2 sẽ hiển thị UserControl “UC_VoNghiem bên trong như hình 9.22. userControl2 Hình 9.22: Giao diện hiển thị UC_VoNghiem khi phương trình vô nghiệm o Nếu người dụng chọn “Phương trình có một nghiệm” thì Panel2 sẽ hiển thị UseControl “UC_MotNghiem” bên trong như hình 9.23. Trong UseControl “UC_MotNghiem” có một điều khiển TextBox cho phép người dùng nhập nghiệm đúng của phương trình. Sau khi nhập xong người dùng nhấn Button “Hoàn tất” để kiểm tra kết quả. Nếu kết quả đúng sẽ hiển thị MessageBox với nội dung “Bạn đã giải đúng”, nếu nhập sai sẽ hiển thị MessageBox với nội dung “Bạn đã giải sai”. userControl3 Hình 9.23: Giao diện hiển thị userControl3 khi phương trình có một nghiệm o Nếu người dụng chọn “Phương trình có hai nghiệm” thì Panel2 sẽ hiển thị UseControl “UC_HaiNghiem” bên trong như hình 9.24. Trong UseControl “UC_HaiNghiem” có hai điều khiển TextBox cho phép người dùng nhập nghiệm đúng của phương trình. Sau khi nhập xong người dùng nhấn Button “Hoàn tất” để kiểm tra kết quả. Nếu kết quả đúng sẽ hiển thị MessageBox với nội dung “Bạn đã giải đúng”, nếu nhập sai sẽ hiển thị MessageBox với nội dung “Bạn đã giải sai”. 276
  102. userControl4 Hình 9.24: Giao diện hiển thị userControl3 khi phương trình có hai nghiệm - Nhấn Button “Xem hướng dẫn” thì sẽ hiển thị UserControl “UC_HuongDan” trên PanelChinh mô tả cách giải phương trình như hình 9.25. Hình 9.25: Giao diện UC_Huongdan trên PanelChinh Nhấn Button “Trở lại” sẽ quay về màn hình “Giải phương trình bậc hai” như hình 9.21.  Khi người dùng nhấn Button “Hướng dẫn” trên giao diện chính: thì sẽ hiển thị UserControl “UC_Huongdan” trên PanelChinh như hình 9.25. 277
  103. CHƯƠNG 10: LÀM VIỆC VỚI MÀN HÌNH VÀ HỆ THỐNG 10.1. Lớp SystemInformation Lớp SystemInformation là lớp cung cấp thông tin về môi trường hệ thống hiện tại, nằm trong không gian tên System.Windows.Forms. Các thuộc tính của lớp SystemInformation chứa thông tin về hệ thống như: tài khoản đăng nhập, tên máy tính, tình trạng kết nối mạng, tên miền,  Các thuộc tính thường dùng của lớp SystemInformation: Bảng 10.1: Bảng mô tả các thuộc tính của lớp SystemInformation Thuộc tính Mô tả UserName Trả về tài khoản người dùng sử dụng trong tiến trình hiện tại. UserDomainName Trả về tên miền mà người dùng đã đăng nhập với tài khoản hợp lệ. Network Mang hai giá trị True hoặc False. - Nếu là True: Máy đang trong tình trạng kết nối mạng. - Nếu là False: Máy trong tình trạng không kết nối mạng. ComputerName Trả về tên của máy tính đã đặt khi cài đặt hệ điều hành BootMode Trả về một trong ba giá trị: Normal, FailSafe (SafeMode), FailSafeWithNetwork (Safe Mode With Network). Các giá trị này là các chế độ khởi động của hệ điều hành Windows. PowerStatus Trả về giá trị cho biết tình trạng nguồn điện của máy tính trong tình trạng thế nào. - PowerStatus.BatteryChargeStatus: Cho biết tình trang nguồn điện của máy tính thế nào. Nếu là máy tính xách tay sẽ được kết quả: Trong tình trạng sạc pin, pin còn nhiều hay ít điện. - PowerStatus.BatteryFullLifetime: Trả về thời gian (tính bằng giây) của pin có thể sử dụng khi pin đầy. Nếu không xác định được sẽ trả về -1. - PowerStatus.BatteryLifePercent: Hiển thị % nguồn điện còn lại trong pin. - PowerStatus.BatteryLifeRemaining: Trả về thời gian sử dụng còn lại của pin (tính bằng giây). Trả về -1 nếu 278
  104. sử dụng nguồn điện trực tiếp. - PowerStatus.PowerLineStatus: Trả về giá trị Online nếu máy tính có cắm điện, ngược lại trả về Offline. WorkingArea Cho biết thông tin về kích cỡ (Width và Height) vùng làm việc trên màn hình. Ví dụ 10.1: Viết chương trình hiển thị thông tin máy tính có giao diện như hình 10.1. Hình 10.1: Giao diện chương trình hiển thị thông tin máy tính Hướng dẫn: Bước 1: Thiết kế giao diện form ban đầu như hình 10.2. Hình 10.2: Giao diện ban đầu form hiển thị thông tin máy tính Bước 2: Thiết lập giá trị thuộc tính cho điều khiển trong cửa sổ Properties. - Form1: Thuộc tính Text: “System Information” - label1: Thuộc tính Text: “System Information” Thuộc tính Font Size: 16 Thuộc tính Font Style: Bold - label2: 279
  105. Thuộc tính Text: “UserName:” - label3: Thuộc tính Name: username - label4: Thuộc tính Text: “UserDomainName:” - label5: Thuộc tính Name: userdomainname - label6: Thuộc tính Text: “NetWork:” - label7: Thuộc tính Name: network - label8: Thuộc tính Text: “ComputerName:” - label9: Thuộc tính Name: computername - label10: Thuộc tính Text: “BootMode:” - label11: Thuộc tính Name: bootmode - label12: Thuộc tính Text: “WorkingArea:” - label13: Thuộc tính Name: workingarea Bước 3: Viết mã lệnh cho các điều khiển. - Sự kiện Load của form: private void Form1_Load(object sender, EventArgs e) { username.Text = SystemInformation.UserName.ToString(); userdomainname.Text = SystemInformation.UserDomainName.ToString(); if (SystemInformation.Network == true) Network.Text = "Connected"; else Network.Text = "Disconnected"; computername.Text = SystemInformation.ComputerName.ToString(); bootmode.Text = SystemInformation.BootMode.ToString(); workingarea.Text = SystemInformation.WorkingArea.ToString(); } 280
  106. 10.2. Lớp Screen Lớp Screen nằm trong không gian tên System.Windows.Forms, lớp Screen cung cấp các thông tin về độ phân giải hiện hành của màn hình, tên thiết bị và số lượng Bit trên một Pixel.  Các thuộc tính thường dùng của lớp Screen: Thuộc tính thường được sử dụng của lớp Screen là PrimaryScreen. Thông qua PrimaryScreen, lập trình viên có thể lấy được kích thước vùng hiển thị (Bounds), kích thước vùng làm việc, số bít trên một pixel, tên thiết bị. Bảng 10.2: Bảng mô tả thuộc tính của lớp Screen Thuộc tính Mô tả PrimaryScreen.Bounds Lấy kích thước hiển thị trên màn hình PrimaryScreen.WorkingArea Lấy kích thước của màn hình làm việc PrimaryScreen.BitsPerPixel Lấy số lượng bit trên một Pixel  Các phương thức thường dùng của lớp Screen: Ngoài cách sử dụng thuộc tính PrimaryScreen để lấy kích thước màn hình làm việc, lập trình viên cũng có thể sử dụng phương thức GetWorkingArea. Bảng 10.3: Bảng mô tả phương thức của lớp Screen Thuộc tính Mô tả GetWorkingArea Cung cấp các thông tin về kích thước của màn hình làm việc Ví dụ 10.2: Viết chương trình hiển thị các thông tin độ phân giải màn hình, tên thiết bị, số bít trên một pixel như hình 10.3. Hình 10.3: Giao diện hiển thị thông tin của màn hình Hướng dẫn: 281
  107. Bước 1: Thiết kế giao diện ban đầu: Thêm các điều khiển Label từ cửa sổ Toolbox vào form như hình 10.4. Hình 10.4: Giao diện ban đầu form hiển thị thông tin màn hình Bước 2: Thiết lập giá trị thuộc tính cho điều khiển trong cửa sổ Properties. - Form1: Thuộc tính Text: “SCREEN” - label1: Thuộc tính Text: “System SCREEN” Thuộc tính Font Size: 16 Thuộc tính Font Style: Bold - label2: Thuộc tính Text: “WorkingArea:” - label3: Thuộc tính Name: workingarea - label4: Thuộc tính Text: “Bits/Pixel:” - label5: Thuộc tính Name: bits - label6: Thuộc tính Text: “Bounds:” - label7: Thuộc tính Name: bounds - label8: Thuộc tính Text: “DeviceName:” - label9: 282
  108. Thuộc tính Name: devicename Bước 3: Viết mã lệnh cho điều khiển Sự kiện Load của form: private void Form1_Load(object sender, EventArgs e) { Rectangle rec = Screen.GetWorkingArea(this); workingarea.Text = "Height = " + rec.Height + " Width = " + rec.Width; bits.Text = Screen.PrimaryScreen.BitsPerPixel.ToString(); bounds.Text = "Height = " + Screen.PrimaryScreen.Bounds.Height.ToString() + " Width = " + Screen.PrimaryScreen.Bounds.Width.ToString(); devicename.Text = Screen.PrimaryScreen.DeviceName.ToString(); } 10.3. Lớp SendKeys Lớp SendKeys nằm trong không gian tên System.Windows.Forms, lớp SendKeys cung cấp các phương thức cho phép làm việc với các phím trên bàn phím. Ba phương thức thường được sử dụng trong lớp SendKeys là phưng thức: Send, SendWait và Flush.  Các phương thức thường dùng của lớp SendKeys: Bảng 10.4: Bảng mô tả các phương thức của lớp SendKeys Phương thức Mô tả Send( ) Phương thức Send cho phép gửi phím đến ứng dụng hiện hành. Để gửi một phím nào đó đến ứng dụng lập trình viên chỉ việc gởi ký tự tương ứng trong phương thức Send. Ví dụ: Muốn gửi phím A đến ứng dụng, lập trình viên phải viết như sau: SendKeys.Send(“A”); Trường hợp muốn gửi tổ hợp phím đến ứng dụng, lập trình viên sẽ gửi một chuỗi ký tự tương ứng trong phương thức Send. Ví dụ: Muốn gửi tổi hợp phím A và B đến ứng dụng, lập trình viên phải viết như sau: SendKeys.Send(“AB”); Một số ký tự đặc biệt như +, %, ^, ~, (, ), [, ], {, } nếu 283