Cuối cùng, tập III này cũng không trình bày môi trường triển khai Visual Studio .NET IDE mà bạn sẽ làm việc trong việc thiết kế giao diện người sử dụng.. Chương 1 Tạo giao diện người sử
Trang 2GIAO DIỆN NGƯỜI DÙNG
theo C#
Lập trình Visual C# thế nào?
Trang 5Mục Lục
Lời mở đầu ……… 17
Chương 1 Tạo giao diện người sử dụng có thể dùng lại được 1.1 Tại sao phải bận tâm về giao diện? 28
1.2 Một chút ít lịch sử về giao diện? 29
1.2.1 Lĩnh vực Command-Line 29
1.2.2 Mô hình Hỏi-Đáp 31
1.2.2.1 Hỏi những gì mà người sử dụng có thể trả lời 32
1.2.2.2 Giới hạn vào một công tác đơn độc 33
1.2.2.3 Nên để ý đến việc gò theo những sở thích của bạn 33
1.2.3 Mô hình vận hành theo trình đơn 33
1.2.4 Lĩnh vực GUI 34
1.3 Sáng tạo so với Qui ước 36
1.3.1 Tính nhất quán trên NET 36
1.3.2 Nguyên tắc “Hành động giống như Microsoft” 37
1.3.3 Các trình tiện ích hành chánh 37
1.3.4 Hiểu thấu loại ứng dụng của bạn 39
1.3.5 Hiểu thấu người sử dụng của bạn 40
1.4 Thụ lý sự phức tạp 41
1.4.1 Phân đoạn thông tin 41
1.4.2 Giao diện qui nạp 42
1.5 Các hạn chế hữu ích 42
1.5.1 Hạn chế khả năng người sử dụng phạm sai lầm 42
1.5.2 Hạn chế những lựa chọn của người sử dụng 43
1.5.3 Hạn chế trí tưởng tượng của người sử dụng 44
Chương 2 Thiết kế giao diện theo Lớp và Tầng nấc 2.1 Các lớp và đối tượng 47
2.1.1 Vai trò của lớp 47
2.1.2 Lớp và kiểu dữ liệu 48
2.1.2.1 Các cấu trúc (struct) 48
Trang 62.1.2.2 Các lớp 49
2.1.2.3 Delegates 50
2.1.2.4 Enumerations 50
2.1.2.5 Interfaces 51
2.2 Các lớp giao diện GUI trên NET 52
2.2.1 Các ô control là những lớp 52
2.2.2 Ô control chứa các ô control khác 53
2.2.3 Ô control được dẫn xuất từ các ô control khác 55
2.2.4 Tính kế thừa và lớp Form 57
2.2.5 Collection Controls 58
2.2.6 Kết sinh đoạn mã với Visual Studio NET 59
2.3 Tương tác với một ô control 61
2.3.1 View-Mediator Pattern 62
2.3.2 Các ô control thông minh 63
2.3.3 Các biểu mẫu thông minh 64
2.4 Tính gói ghém (encapsulation) 65
2.4.1 Sử dụng Enumeration và Resource Class 66
2.4.2 Sử dụng các collection 66
2.4.3 Hạn chế chia sẻ sử dụng những qui chiếu về ô control 67
2.4.4 Định nghĩa một kế hoạch chuyển dữ liệu 67
2.4.5 Sử dụng một tổng đài trung tâm 67
2.4.6 Tạo giao diện GUI vận hành theo dữ liệu (data-driven) 68
2.5 Triển khai thiết kế kiểu tam tầng 68
2.5.1 Các vấn đề gặp phải trong việc thiết kế kiểu tam tầng 70
2.5.1.1 Presentation tier 70
2.5.1.2 Business tier 70
2.5.1.3 Data tier 71
2.5.2 Tính nhất quán của thiết kế tam tầng 72
2.6 Sửa chữa thiết kế tam tầng 72
2.6.1 Sử dụng đến DataSet 74
2.6.2 Các đối tượng kiểm tra hợp lệ và đối tượng business 75
2.6.3 Các loại ứng dụng khác 75
Chương 3 Tìm hiểu đồ họa và GDI+ 3.1 Thử lướt xem các GDI+ Namespace 78
3.2 Cấu hình một GDI+ Project Workspace 78
Trang 73.3 Tổng quan về namespace System.Drawing 79
3.4 Thử xem những lớp tiện ích của System.Drawing 81
3.4.1 Kiểu dữ liệu Point(F) 82
3.4.2 Kiểu dữ liệu Rectangle(F) 83
3.4.3 Kiểu dữ liệu Size(F) 84
3.4.4 Lớp Region 84
3.5 Tìm hiểu các chầu tô vẽ với GDI+ 85
3.5.1 Truy cập đối tượng Graphics 86
3.5.2 Làm cho “dơ dáy” vùng client area 89
3.5.3 Tối ưu hóa GDI+ Painting 89
3.5.3.1 Tô vẽ và chỉnh lại kích thước (resizing) 90
3.5.3.2 Tô vẽ từng phần nhỏ của một cửa sổ 91
3.5.3.3 Chế độ tô vẽ và vẽ mượt mà (antialiasing) 94
3.5.3.4 Double Buffering 97
3.5.4 Cho tô vẽ các đối tượng GDI+ nằm ngoài các hàm thụ lý Paint 100
3.6 Tìm hiểu lớp Graphics 102
3.7 Hệ thống tọa độ mặc nhiên của GDI+ 106
3.7.1 Khai báo một đơn vị đo lường thay thế 107
3.7.2 Khai báo một điểm gốc thay thế 108
3.8 Thiết lập một Active Color 111
3.8.1 Thử khảo sát lớp ColorDialog 112
3.9 Thao tác phông chữ 114
3.9.1 Làm việc với Font Family 114
3.9.2 Tìm hiểu Font Metrics 116
3.9.3 Xây dựng một ứng dụng phông chữ 117
3.9.4 Liệt kê các phông chữ được cài đặt 119
3.9.5 Lớp FontDialog 122
3.10 Khảo sát System.Drawing.Drawing2D 124
3.10.1 Thiết lập chất lượng vẽ 125
3.10.2 Làm việc với Pen 126
3.10.3 Làm việc với Pen Caps 130
3.10.4 Làm việc với Solid Brush 131
3.10.5 Làm việc với Hatch Style Brush 133
3.10.6 Làm việc với Textured Brush 136
3.10.7 Làm việc với Gradient Brush 137
3.11 Vẽ hình ảnh 139
Trang 83.12 Dragging, Hit testing & PictureBox Control 141
3.12.1 Thêm chi tiết về Hit Testing 144
3.12.2 Hit Testing đối với các hình ảnh không phải là hình chữ nhật 146
3.13 Lớp ControlPaint 149
3.14 Tìm hiểu NET Resource Format 151
3.15 Namespace System.Resources 152
3.15.1 Tạo một tập tin *.resx theo lập trình 152
3.15.2 Đọc một tập tin *.resx theo lập trình 154
3.15.3 Xây dựng tập tin *.resources 155
3.15.4 Gắn kết tập tin *.resources vào assembly 156
3.16 Làm việc với ResourceWriters 156
3.17 Làm việc với ResourceManagers 158
3.18 Tự động cấu hình resource theo Visual Studio NET 159
Chương 4 Tìm hiểu về biểu mẫu và lớp Form
4.1 Tìm hiểu lớp Form 162
4.1.1 Kích thước và Vị trí của biểu mẫu 166
4.1.2 Các biểu mẫu diễu hành được 169
4.1.3 Cho hiển thị biểu mẫu 170
4.1.4 Khung đối thoại “cây nhà lá vườn” (custom dialog) 172
4.1.5 Tương tác với biểu mẫu 174
4.2 Các khung đối thoại tạo sẵn 179
4.3 Các biểu mẫu thay đổi được kích thước 183
4.3.1 Vấn đề kích thước 183
4.3.2 Kích thước tối thiểu và tối đa 184
4.3.3 Neo đậu (anchoring) 184
4.3.3.1 Chỉnh kích thuớc các ô control dùng kỹ thuật neo đậu 185
4.3.3.2 Các ô control container với vấn đề neo đậu 186
4.3.4 Cập bến (docking) 187
4.4 Cửa sổ chẻ nhỏ 188
4.4.1 Cập bến sử dụng đến ô control Panel 190
4.4.2 Các cửa sổ chẻ khác 192
Trang 94.5 Biểu mẫu với hình dáng bất thường 195
4.5.2 Di chuyển các shaped form 204
4.6 Visual Inheritance 210
4.6.1 Tạo sẵn một ancestor control 212
4.6.2 Thêm một thuộc tính tiền bối 212
4.6.3 Phủ quyết một hàm thụ lý tình huống 213
Chương 5 Cơ bản về lớp Control 5.1 Windows Forms Package 218
5.1.1 Giải pháp NET 219
5.2 Lớp Control 220
5.3 Vị trí và Kích thước 224
5.4 Màu sắc trên ô control 226
5.5 Font và Text đối với ô control 228
5.5.1 Access Keys 232
5.6 Các mối liên hệ trên các ô Control 232
5.7 Focus và Tab Sequence trên ô control 233
5.8 Phản ứng của ô control trước click chuột và phím gõ 236
5.8.1 Một thí dụ Mouse/Keyboard 238
5.8.2 Con nháy chuột (mouse cursors) 240
5.9 Đồ họa và việc tô vẽ 241
5.10 Các thành viên cấp thấp 243
Chương 6 Tìm hiểu về Windows Form Control 6.1 Tìm hiểu Windows Forms Control Hierarchy 244
6.2 Các loại ô control 245
Trang 106.2.1 Các ô control vô hình 246
6.2.2 Các ô control provider 247
6.2.3 ActiveX Control 248
6.2.3.1 Bạn có nên nhập ActiveX control hay không? 251
6.3 Thêm các ô control lên biểu mẫu 252
6.3.1 Thêm bằng tay 252
6.3.1.1 Lớp Control$ControlCollection 253
6.3.2 Thêm các ô control lên biểu mẫu theo VS NET IDE 255
6.4 Gallery các ô control cổ điển 257
6.4.1 Label Control 257
6.4.2 LinkLabel Control 258
6.4.3 TextBox Control 260
6.4.3.1 Một thí dụ ứng dụng TextBox Control 262
6.4.4 Button Control và lớp cơ bản ButtonBase 265
6.4.4.1 Cấu hình vị trí nội dung 267
6.4.4.2 Một thí dụ sử dụng Button 267
6.4.5 CheckBox control 270
6.4.6 RadioButton & GroupBox control 271
6.4.6.1 Một thí dụ sử dụng RadioButton, CheckBox & GroupBox 272
6.4.7 List Controls 276
6.4.7.1 List control với các đối tượng 278
6.4.8 CheckedListBox Control 279
6.4.9 ListBox & ComboBox 282
6.4.9.1 Thí dụ CarConfg nới rộng với ComboBox 284
6.4.10 Cấu hình Tab Order 286
6.4.10.1 Tab Order Wizard 287
6.4.11 PictureBox Control 288
6.4.12 Domain Controls 289
6.4.12.1 TrackBar Control 289
6.4.12.2 ProgressBar Control 294
6.4.12.3 Spin Control: DomainUpDown và NumericUpDown 296
6.4.13 Các ô control container 299
6.4.13.1 Panel Control 299
6.4.14 Các ô control hiển thị dữ liệu ngày tháng năm 300
6.4.14.1 DateTimePicker Control 301
6.4.14.2 MonthCalendar Control 304
6.5 Lớp DateTime 308
6.6 Gán ToolTip lên ô Control 309
6.6.1 Thêm ToolTip vào lúc thiết kế 310
6.7 Kiểm tra hợp lệ đối với dữ liệu nhập vào 310
Trang 116.7.1 Một thí dụ kiểm tra hợp lệ 312
6.7.2 Kiểm tra hợp lệ sử dụng ErrorProvider 313
6.7.2 Kiểm tra hợp lệ sử dụng Regular Expressions 315
6.8 Cấu hình một hành xử neo đậu của một ô control 317
6.9 Cấu hình hành xử cập bến của một ô control 318
6.10 Tạo một Custom Dialog Box 319
6.10.1 Một thí dụ ứng dụng khung đối thoại 320
6.10.2 Trích dẫn dữ liệu từ một khung đối thoại 324
6.11 Form Inheritance 326
Chương 7 Các ô control tiên tiến 7.1 ImageList Control 330
7.1.1 Làm việc với ImageList thông qua chương trình 332
7.1.2 Một thí dụ về ImageList 335
7.2 ListView Control 337
7.2.1 Hiển thị icon trên ô control ListView 338
7.2.2 Thêm item lên ô control ListView 339
7.2.3 Thêm tiêu đề cột vào ListView 342
7.2.4 Thêm các subitem vào ListView 343
7.2.5 Các thủ thuật cao cấp dùng trên ListView 344
7.2.6 Hiệu đính Label 349
7.3 TreeView Control 351
7.3.1 Thêm và gỡ bỏ node trên TreeView Control 351
7.3.2 Cấu trúc TreeView 353
7.3.3 Lèo lái trên TreeView 354
7.3.4 Thao tác trên các node 359
7.3.5 Chọn ra các nodes 361
7.3.6 Các thủ thuật cao cấp của TreeView 363
7.3.7 Thêm icon vào TreeView control 364
7.3.8 Bung ra hoặc teo lại các cấp bậc 365
7.3.9 Lôi thả trên ô control TreeView 366
7.3.10 Chế ngự TreeView Control 371
7.3.10.1 Một dự án Tree Control 371
7.3.10.2 Một TreeView “ăn ý” với dữ liệu 373
7.3.10.3 Những TreeView bất thường 374
Trang 127.3.10.4 Hỗ trợ Custom TreeView vào lúc thiết kế 375
7.4 TabControl 375
7.4.1 Thêm một ô control lên TabControl 378
7.4.2 Thêm và gỡ bỏ TabPage trên TabControl 379
7.4.3 Thay đổi dáng dấp xuất hiện của TabControl 379
7.5 NotifyIcon Control 381
Chương 8 Tìm hiểu về Custom Control 8.1 Các loại custom control 384
8.2 Các dự án tạo ô custom control 385
8.2.1 Class Library Project 385
8.2.2 Qui chiếu về một Custom Control 387
8.2.3 Global Assembly Cache (GAC) 389
8.2.3.1 Tạo một key cho custom control 390
8.2.3.2 Áp dụng một key cho một control 390
8.2.3.3 Cài đặt một control lên GAC 391
8.2.4 Tạo những User Control 392
8.2.5 Thí dụ 1: Progress User Control 393
8.2.6 Thí dụ 2: Bitmap Thumbnail Viewer 398
8.2.6.1 Trắc nghiệm BitmapViewer user control 402
8.2.6.2 Các tình huống trên BitmapViewer user control 404
8.2.6.3 Tăng cường BitmapViewer và thêm mạch trình 406
8.3 Các ô control kế thừa 408
8.3.1 Inherited control và User control, nên chọn loại nào? 409
8.3.2 Một thí dụ: DirectoryTree Control 410
8.3.2.1 Trắc nghiệm DirectoryTree control 412
8.3.3 Một thí dụ khác: Masked TextBox 413
8.3.4 Một Custom Extender Provider 415
8.3.4.1 Một Menu Text Provider 415
8.3.4.2 Một Help Icon Provider 419
Chương 9 Hỗ trợ Custom Control vào lúc thiết kế
9.1 Cơ bản về Control Designer 424
Trang 139.1.1 Design-time Attributes 424
9.1.2 Căn bản về Serialization 427
9.1.3 Toolbox Bitmap 428
9.1.4 Các tập tin nguồn lực 429
9.2 Trắc nghiệm các ô control custom 432
9.2.1 Hỗ trợ gỡ rối vào lúc thiết kế 432
9.2.2 Trắc nghiệm đối với chế độ thiết kế 433
9.2.3 Ô control PropertyGrid 435
9.3 Custom Designers 439
9.3.1 Sàng lọc các thuộc tính và tình huống 440
9.3.2 Designer Verbs 442
9.3.3 Control Designer Notifications 446
9.4 Data Types và UITypeEditors 447
9.4.1 Sử dụng UITypeEditors bẩm sinh 448
9.4.2 Custom UITypeEditors 450
9.5 Cấp bản quyền cho custom control 452
9.5.1 Tập tin bản quyền LIC đơn giản 452
9.5.2 Custom LIC File Licensing 453
9.5.3 Advanced License Providers 454
Chương 10 MDI Interfaces và Workspace
10.1 Câu chuyện MDI 457
10.1.1 Các loại ứng dụng MDI 458
10.2 Các điều cần biết về MDI 458
10.2.1 Tìm ra “bà con thân thích” 460
10.2.2 Đồng bộ hóa các biểu mẫu MDI con-cái 461
10.2.3 Cách bố trí các cửa sổ MDI 462
10.2.4 Trộn lại các trình đơn 468
10.2.5 Quản lý trạng thái giao diện 469
10.2.6 Kiến trúc Document-View 471
10.2.6.1 Một chương trình hóa đơn được thiết kế theo document-view 472 10.3 Các cửa sổ trôi nổi và cập bến 486
10.3.1 Các thanh công cụ trôi nổi 487
10.3.1.1 Các ô control bất thường 490
10.3.2 Các cửa sổ cập bến được 490
Trang 1410.3.2.1 Các cửa sổ dockable với các ô control owner-drawn 491
10.3.2.2 Các cửa sổ dockable với timers 491
Chương 11 Dynamic User Interface
11.1 Trường hợp đối với Dynamic User Interface 499
11.2 Tạo những ô control vào lúc chạy 501
11.2.1 Chương trình ButtonMaker 501
11.2.2 Một ứng dụng System Tray 504
11.2.3 Sử dụng các ô control trong một chương trình vẽ 510
11.3 Nội dung động 518
11.3.1 Bản địa hóa (localization) 518
11.3.2 Một thí dụ Dynamic Menu 521
11.4 Lập trình vận hành theo dữ liệu 524
11.4.1 Một ứng dụng tính giá data-driven 525
11.5 “Cỗ máy” bố trí các ô control 526
11.5.1 SingleLineFlow Layout Manager 527
11.5.2 “Cỗ máy” bố trí ô control hoạt động như là Extender Providers 530
Chương 12 Tìm hiểu về Data Controls 12.1 Nhập môn về gắn kết với dữ liệu 532
12.2 Cơ bản về Data Binding 533
12.2.1 Gắn kết một bảng liệt kê đơn giản 534
12.2.2 Gắn kết ô list control vớinhững đối tượng phức tạp 536
12.2.3 Gắn kết với trị đơn độc 539
12.3 ADO NET Data Binding 541
12.3.1 Multiple Control Binding 544
12.3.2 Nhật tu với Data Binding 546
12.3.3 Định dạng dữ liệu trước khi gắn kết 547
12.3.4 Chuyển đổi cao cấp 550
12.3.5 Kiểm tra hợp lệ và Thay đổi thô 552
12.4 Thử trình bày Data Binding 554
12.4.1 Lèo lái với Data Binding 555
12.4.2 Phản ứng trước Record Navigation 556
12.4.3 Tạo các biểu mẫu kiểu Master-Detail 557
Trang 1512.4.4 Tạo một Binding Context mới 559
12.5 DataGrid Control 560
12.5.1 Các mối liên hệ trên DataGrid 560
12.5.2 Ánh xạ cột dữ liệu trên DataGrid 561
12.5.3 Tạo Custom DataGrid Column Styles 562
12.6 Thực hiện sự gói ghém đối với Data Controls 566
12.6.1 Kiểm tra hợp lệ đối với dữ liệu bị gắn kết 567
12.7 Các ô control “ăn ý” với data 572
12.7.1 Một TreeView “ly thân” với các mắt gút đúng lúc 576
12.7.2 Có thể nào là một DataBound ListView Control? 578
Chương 13 Các ô GDI+ Controls 13.1 Các ô control GDI+ đơn giản 580
13.1.1 Một GradientLabel Control 581
13.1.2 Cải tiến hỗ trợ GradientLabel Control vào lúc thiết kế 583
13.1.3 Một Marquee Label Control 590
13.2 Tạo những Button Control 598
13.2.1 Một Hot Tracking Button 598
13.3 Thử xét lại chương trình vẽ vec tơ 602
13.3.1 Giải quyết vấn đề ranh giới 603
13.4 Một ô control vẽ biểu đồ đơn giản 611
Chương 14 Help và Hỗ trợ được đặt lọt thỏm trên các ứng dụng 14.1 Trường hợp yêu cầu Help 619
14.2 Các loại Help 620
14.2.1 WinHelp 620
14.2.2 WinHelp 95 620
14.2.3 HTML Help 621
14.2.4 MS Help 2 623
14.2.4.1 Một vài công cụ viết ra Help 624
Trang 1614.3 Help cổ điển tồi tệ 624
14.4 Help cơ bản dùng đến HelpProvider 625
14.4.1 Hiển thị một popup Help 628
14.4.2 Control-Based và Form-Based Help 629
14.4.2.1 Thí dụ HelpTest 630
14.5 Triệu gọi Help theo lập trình 634
14.5.1 Help không có HelpProvider 635
14.5.2 Dùng đến Help dựa vào căn cứ dữ liệu 635
14.5.3 Dùng đến Help dựa vào công tác 636
14.5.4 Tạo riêng Help cho bạn 638
14.6 Hỗ trợ ứng dụng được đặt lọt thỏm 639
14.6.1 Affordances 640
14.6.1.1 Hội nhập Help và GUI 640
14.6.2 Agents 641
Chỉ Mục 653
Trang 17Lời mở đầu
Vào tháng 7/1998 người viết cho phát hành tập I bộ sách “Lập trình Windows sử dụng Visual C++ 6.0 và MFC” Toàn bộ gồm 8 tập, 6 nói về lý thuyết và 2 về thực hành Các tập đi sau được phát hành lai rai mãi đến 10/2000 mới xong Bộ sách được bạn đọc đón chào nồng nhiệt (mặc dầu chất lượng giấy và kiểu quay ronéo không được mỹ thuật cho lắm, nhưng giá rẻ vừa túi tiền bạn đọc) và được phát hành đi phát hành lại trên 10 ngàn bộ và không biết bao nhiêu đã bị photocopy và “bị luộc” Và vào thời điểm hoàn thành bộ sách lập trình Windows kể trên (tháng 10/2000) người viết cũng đã qua 67 tuổi, quá mệt mỏi, và cũng vào lúc vừa giải thể văn phòng SAMIS không kèn không trống, thế
là người viết quyết định “rửa tay gác kiếm” luôn, mặc dầu trước đó vài ba tháng đã biết Microsoft manh nha cho ra đời một ngôn ngữ lập trình mới là C# trên một sàn diễn mang tên NET ám chỉ ngôn ngữ thời đại mạng Internet Tuy nhiên, như đã định soạn giả vẫn ngưng viết, xem như nghỉ hưu luôn, quay về chăm sóc vườn phong lan bị bỏ bê từ lúc bắt đầu viết bộ sách lập trình Windows kể trên
Nghỉ hưu thiếu vài tháng thì đúng 3 năm, vào tháng 5/2003, anh Nguyễn Hữu Thiện, người sáng lập ra tờ báo eChip, mời tham gia viết sách thành lập tủ sách tin học cho tờ báo Thế là “a lê hấp” người viết đồng ý ngay, cho đặt mua một lô sách về C#, VB.NET
và NET Framework để nghiên cứu Càng đọc tài liệu càng thấy cái ngôn ngữ mới này nó khác với C++ đi trước khá nhiều, rõ ràng mạch lạc không rối rắm như trước và rất dễ học một cách rất ư tự nhiên Thế là một mạch từ tháng 5/2003 đến nay, người viết đã hoàn chỉnh xong 5 trên tổng số 8 tập Mỗi tập dài vào khoảng từ 600 đến 750 trang
Bạn cứ thử hình dung là trong ngành điện toán, cứ vào khoảng một thập niên thì có một cuộc cách mạng nho nhỏ trong cách tiếp cận về lập trình Vào thập niên 1960 là sự xuất hiện ngôn ngữ Cobol và Fortran (cũng như ngôn ngữ RPG của IBM) thay thế cho hợp ngữ, giữa thập niên 70 là sự xuất hiện máy vi tính với ngôn ngữ Basic, vào đầu thập niên 80 những công nghệ mới là Unix có thể chạy trên máy để bàn với ngôn ngữ cực mạnh mới là C, phát triển bởi ATT Qua đầu thập niên 90 là sự xuất hiện của Windows và C++ (được gọi là C với lớp), đi theo sau là khái niệm về lập trình thiên đối tượng trong bước khai mào Mỗi bước tiến triển như thế tượng trưng cho một đợt sóng thay đổi cách lập trình của bạn: từ lập trình vô tổ chức qua lập trình theo cấu trúc (structure programming hoặc procedure programming), bây giờ qua lập trình thiên đối tượng Lập trình thiên đối tượng trên C++ vẫn còn “khó nuốt” đối với những ai đã quen cái nếp nghĩ theo kiểu lập trình thiên cấu trúc Vả lại, lập trình thiên đối tượng vào cuối thập niên qua vẫn còn nhiều bất cập, không tự nhiên nên viết không thoải mái
Bây giờ, với sự xuất hiện của NET với các ngôn ngữ C#, VB.NET, J# xem ra cách suy nghĩ về việc viết chương trình của bạn sẽ thay đổi, theo chiều hướng tích cực Nói
Trang 18một cách ngắn gọn, sàn diễn NET sẽ làm cho bạn triển khai phần mềm dễ dàng hơn trên
Internet cũng như trên Windows mang tính chuyên nghiệp và thật sự thiên đối tượng Nói
một cách ngắn gọn, sàn diễn NET được thiết kế giúp bạn triển khai dễ dàng những ứng
dụng thiên đối tượng chạy trên Internet trong một môi trường phát tán (distributed) Ngôn
ngữ lập trình thiên Internet được ưa thích nhất sẽ là C#, được xây dựng từ những bài học
kinh nghiệm rút ra từ C (năng xuất cao), C++ (cấu trúc thiên đối tượng), Java (an toàn) và
Visual Basic (triển khai nhanh, gọi là RAD - Rapid Application Development) Đây là
một ngôn ngữ lý tưởng cho phép bạn triển khai những ứng dụng web phát tán được kết
cấu theo kiểu ráp nối các cấu kiện (component) theo nhiều tầng nấc (n-tier)
Tập III được tổ chức thế nào?
Tập III này có tham vọng là một tập hướng dẫn thiết kế giao diện người sử dụng dùng
.NET và Visual C# Mục tiêu của tập sách này là dành cho những ai đã kinh qua hai tập
đầu của bộ sách này Vì trong tập III này chúng tôi sẽ không mô tả những khái niệm cốt
lõi của NET như namespace, assembly, thụ lý biệt lệ và kiểu dữ liệu, là những điều cơ
bản đối với thiết kế NET Ngoài ra, tập này cũng không đá động gì đến lập trình thiên đối
tượng Bạn không thể đi xa nếu bạn không biết chi về lớp, interface và các kiểu dữ liệu
.NET, mà trong tập này thì các thí dụ lại dựa trên những cơ bản này sử dụng các đối
tượng để gói ghém, tổ chức và chuyển giao thông tin Cuối cùng, tập III này cũng không
trình bày môi trường triển khai Visual Studio NET IDE mà bạn sẽ làm việc trong việc
thiết kế giao diện người sử dụng Tất cả các điều này đã chứa trong hai tập I và II của bộ
sách này Do đó, nếu bạn chưa biết chi về Visual C# cũng như NET Framework thông
qua hai tập I và II thì bạn chớ bắt đầu đọc tập III này
Chương 1 Tạo giao diện người sử dụng có thể dùng lại được
Thiết kế giao diện người sử dụng không chỉ thuần túy là làm thế nào lập trình phần tử
giao diện tối tân nhất, mà là những gì liên quan đến các qui ước, tính nhất quán và những
thể thức tốt nhất hướng dẫn người sử dụng trên một “trận địa” chưa hề quen biết Trong
chương này bạn sẽ học những cơ bản về lý thuyết thiết kế giao diện và những nguyên tắc
hỗ trợ mọi thiết kế tốt
Chương 2 Thiết kế giao diện theo lớp và theo tầng nấc
Trong nhiều năm qua, các sách lập trình cũng như các bài báo tin học đều cổ vũ việc
thiết kế ứng dụng theo kiểu tam tầng (three tier) Cách tiếp cận này phân cách rõ ràng
giao diện người sử dụng khỏi đoạn mã ứng dụng Mặc dù sự nhấn mạnh này, các ứng
Trang 19dụng trong thế giới thực ít khi theo đuổi các hướng dẫn tốt lành này Trong chương này bạn sẽ tìm thấy là với NET các thiết kế theo tầng nấc sau này được dễ dàng thực hiện hơn
Chương 3 Tìm hiểu đồ hoạ và GDI+
GDI+ là framework đồ họa thế hệ kế tiếp Trong chương này bạn sẽ khảo sát GDI+ từ dưới lên bạn sẽ học cách làm thế nào có thể vẽ ngoài và trong hàm thụ lý tình huống vẽ, làm thế nào thụ lý việc thay đổi kích thước biểu mẫu, cũng như làm thế nào sử dụng các công cụ cơ bản như pen và brush chẳng hạn Ngoài ra, bạn sẽ làm quen với những đề mục cao cấp chẳng hạn double buffering để loại bỏ hiện tượng nhấp nháy, hoặc hit testing khi
sử dụng các hình chữ nhật hoặc path, và tập vẽ những phần tử GUI chuẩn chẳng hạn focus clues và disabled images
Chương 4 Tìm hiểu về biểu mẫu và lớp Form
Lớp Form là cơ bản đối với mọi cửa sổ ứng dụng trong một chương trình NET Muốn sử dụng hữu hiệu các biểu mẫu, bạn cần am hiểu làm thế nào các biểu mẫu tương tác, diễu hành, và làm chủ lẫn nhay Chương này cố gắng giải thích những điều cơ bản, và
đi sâu vào những kỹ thuật hấp dẫn mới chẳng hạn visual inheritance, Windows XP style
và các biểu mẫu hình dáng ký quái Ngoài ra, bạn sẽ biết cách tạo những cửa sổ nhiều khung chạy được
Chương 5 Cơ bản về lớp Control
Chương này sẽ đào sâu vào chi tiết của một trong những lớp phong phú nhất của NET, đó là lớp Control Trong chương này, bạn sẽ học cách lớp Control định nghĩa những tính năng cơ bản đáp ứng những tình huống như phím bị ấn xuống, hoặc những chuyển động của con chuột, cũng như việc định nghĩa những mối liên hệ giữa các ô control cũng như việc thụ lý các thông điệp Windows Ngoài ra, bạn sẽ học qua những điều cơ bản của namespace System.Drawing liên quan đến các point, rectangle, color, và font
Chương 6 Tìm hiểu về Windows Forms Controls
Chương này sẽ đi sâu vào những ô control cổ điển (có từ thời lập trình Windows bit) mà NET Framework cung cấp trong việc nhập liệu, chọn lựa và hiển thị dữ liệu Trong chương này, bạn sẽ khám phá những chi tiết nằm đằng sau các ô control kiểm tra hợp lệ ngoài những kiểu dữ liệu TextBox, Button, và ListBox Bạn sẽ kết thúc chương này bằng cách làm thế nào xây dựng những khung đối thoại custom và hiểu thế nào là
16-“form inheritance” một kỹ thuật mới
Trang 20Chương 7 Các ô control tiên tiến
Chương này sẽ mổ xẻ những ô control Windows rất được ưa thích, bao gồm
TreeView, ListView, TabControl và NotifyIcon Khi làm quen với những ô control này,
bạn sẽ thấy một vài sáng tạo trong việc nới rộng các ô control này vào những lớp custom
cho phép tạo ra những tính năng cao cấp hoặc đáp ứng với những loại dữ liệu đặc trưng
Chương 8 Các ô custom control
Việc triển khai những ô custom control là một trong những đề mục chủ yếu của tập
sách này, và là một tính năng khá lý thú của sàn diễn NET Chương này sẽ xét đến những
loại ô control cơ bản mà bạn có thể tạo ra, và dẫn nhập vào những thí dụ như bitmap
thumbnail viewer, progress user control, và directory tree Ngoài ra, bạn sẽ làm quen với
những đề mục cao cấp như lập trình asynchronous control, custom exyender provider,
v.v mà bạn có thể triển khai lên bất cứ ô NET control nào
Chương 9 Hỗ trợ Custom Control vào lúc thiết kế
Tạo một custom control xem ra dễ dàng, nhưng làm cho nó hành xử tốt vào lúc thiết
kế thường phải mất công sức Trong chương này, bạn sẽ thấy các custom control
designer, UITypeEditors, và context-menu verbs có thể trang bị thế nào các ô custom
control của bạn đối với Visual Studio NET Ngoài ra, bạn sẽ làm quen với những mô
hình khác nhau về custom control dùng trong việc xử lý các bản quyền
Chương 10 MDI Interfaces và Workspace
MDI Interface được xem như là tiêu chuẩn thiết kế trong các ứng dụng tiên tiến,
.NET làm cho MDI dễ dàng như chỉ là một vài đặt để các thuộc tính đơn giản của Form
Chương này sẽ khảo sát một vài kỹ thuật thiết kế tốt nhất trong việc triển khai MDI, bao
gồm đồng bộ hoá và kiến trúc Document-View Ngoài ra, bạn sẽ làm quen với việc tạo
những thanh công cụ trôi nổi và thiết kế những cửa sổ có thể cập bến được
Chương 11 Dynamic User Interfaces
Dynamic User Interface – tạo những ô control vào lúc chạy thay vì vào lúc thiết kế -
không phải là một triết lý giúp bạn phá vỡ một vài hạn chế quan trọng nhất của Visual
Studio NET Trong chương này, bạn sẽ học qua cách thi công nội dung sống động, làm
quen với một thí dụ tạo một dynamic control thông qua một framework vẽ dựa trên
vector, và xét đến việc tạo một custom layout engine
Chương 12 Tìm hiểu về Data Controls
Trang 21Trong một lúc nào đó, phần lớn các ứng dụng đều cần đến dữ liệu lấy từ các căn cứ
dữ liệu Chương này sẽ xét đến việc làm thế nào bạn có thể hội nhập dữ liệu vào giao diện người sử dụng mà không phải tạo một giao diện quá gắn bó chặt chẽ với một chiến lược truy cập dữ liệu hoặc vào một dữ liệu nguồn Nói cách khác, bạn sẽ học cách làm thế nào
có thể tạo một giao diện không qui chiếu trực tiếp tên các vùng mục tin hoặc giả định là
dữ liệu sẽ được tìm đọc thấy tất cả trong một lúc Các giải pháp sẽ dẫn dắt bạn đến việc khảo sát việc gắn kết dữ liệu NET, cũng như cách nới rộng gắn kết dữ liệu này và làm thế nào có thể tạo những custom control “ăn ý” với dữ liệu
Chương 13 GDI+ Controls
Chương này sẽ đưa GDI+ platform làm việc với những thí dụ cho thấy một gradient label, marquee text và button control được hình thành từ số không Bạn sẽ triển khai một bar-graphing control và có những cái nhìn khác đi đối với thí dụ vẽ dựa trên vec tơ từ chương 11 với những ô control owner-drawn
Chương 14 Help và Hỗ trợ được đặt lọt thỏm trên ứng dụng
Chương cuối cùng này chỉ cho bạn cách đưa phần Help vào giao diện người sử dụng bạn sẽ làm quen với những kỹ thuật cơ bản đối với Help cảnh ứng, các kỹ thuật cung cấp Help dựa trên công tác, cũng như những mẹo vặt cho phép bạn hội nhập những cửa sổ help vào ứng dụng của bạn Ngoài ra, bạn cũng sẽ làm quen với Microsoft Agent Control chuyên cung cấp một nhân vật sống động có thể hướng dẫn người sử dụng
Bộ sách NET Toàn tập gồm những tập nào?
Như đã nói, bộ sách NET toàn tập này gồm 8 tập, 6 nói về lý thuyết và 2 về thí dụ thực hành
Tập I: Lập trình Visual C# thế nào?
Chương 1 Visual C# và NET Framework
Chương 2 Bắt đầu từ đây ta tiến lên!
Chương 3 Sử dụng Debugger thế nào?
Chương 4 Căn bản Ngôn ngữ C#
Chương 5 Lớp và Đối tượng
Chương 6 Kế thừa và Đa hình
Chương 7 Nạp chồng tác tử
Chương 8 Cấu trúc Struct
Chương 9 Giao diện
Trang 22Chương 10 Bản dãy, Indexers và Collections
Chương 11 Chuỗi chữ và biểu thức regular
Chương 12 Thụ lý các biệt lệ
Chương 13 Ủy thác và tình huống
Chương 14 Lập trình trên môi trường NET
Tập II: Visual C# và Sàn diễn NET
Chương 1 Input/Output và Object serialization
Chương 2 Xây dựng một ứng dụng Windows
Chương 3 Tìm hiểu về Assembly và cơ chế Version
Chương 4 Tìm hiểu về Attribute và Reflection
Chương 5 Marshalling và Remoting
Chương 6 Mạch trình và Đồng bộ hoá
Chương 7 Tương tác với unmanaged code
Chương 8 Lập trình ứng dụng Web
Chương 9 Lập trình Web Service
Tập III: Giao diện người sử dụng viết theo Visual C#
Chương 1 Tạo giao diện người sử dụng dùng lại được
Chương 2 Thiết kế giao diện theo lớp và theo tầng nấc
Chương 3 Tìm hiểu đồ hoạ và GDI+
Chương 4 Tìm hiểu về biểu mẫu và lớp Form
Chương 5 Cơ bản về lớp Control
Chương 6 Tìm hiểu về Windows Forms Controls
Chương 7 Các ô control tiên tiến
Chương 8 Các ô custom control
Chương 9 Hỗ trợ Custom Control vào lúc thiết kế
Chương 10 MDI Interfaces và Workspace
Chương 11 Dynamic User Interfaces
Chương 12 Tìm hiểu về Data Controls
Chương 13 GDI+ Controls
Chương 14 Help và Hỗ trợ được đặt lọt thỏm trên ứng dụng
Tập IV: Lập trình Căn Cứ Dữ Liệu
với Visual C# & ADO.NET
Chương 1 Sử dụng Căn cứ dữ liệu
Trang 23Chương 2 Tổng quan về ADO NET
Chương 3 Data Component trong Visual Studio NET
Chương 4 Các lớp ADO.NET tách rời
Chương 5 ADO.NET Data Providers
Chương 6 Trình bày IDE theo quan điểm Database
Chương 7 Làm việc với XML
Chương 8 Triển khai ứng dụng Web sử dụng ADO.NET
Chương 9 Sử dụng các dịch vụ Web với ADO.NET
Chương 10 Thụ lý các tình huống trên ADO.NET
Chương 11 Stored procedure và View
Chương 12 Làm việc với Active Directory
Chương 13 Làm việc với ODBC.NET data provider
Tập V: Lập trình ASP.NET & Web
Chương 1 ASP.NET và NET Framework
Chương 2 Tìm hiểu các tình huống
Chương 3 Tìm hiểu các ô Web Control
Chương 4 Chi tiết về các ASP Control
Chương 5 Lập trình Web Form
Chương 6 Kiểm tra hợp lệ
Chương 7 Gắn kết dữ liệu
Chương 8 List-Bound Control - Phần 1
Chương 9 Truy cập căn cứ dữ liệu với ADO.NET
Chương 10 ADO.NET Data Update
Chương 11 List-Bound Control - Phần II
Chương 12 User Control và Custom Control
Chương 13 Web Services
Chương 14 Caching và Năng suất
Chương 15 An toàn
Chương 16 Triển khai ứng dụng
Tập VI: Lập trình các báo cáo dùng
Crystal Reports NET
Chương 01 Tổng quan về Crystal Reports Net
Chương 02 Hãy thử bắt đầu với Crystal Reports NET
Chương 03 Tìm hiểu Crystal Reports Object Model
Chương 04 Sắp xếp & Gộp nhóm
Chương 05 Sử dụng các thông số
Chương 06 Uốn nắn các báo cáo
Chương 07 Tìm hiểu về Công thức & Lô gic chương trình
Trang 24Chương 08 Vẽ biểu đồ thế nào?
Chương 09 Tạo báo cáo Cross-Tab
Chương 10 Thêm Subreports vào báo cáo chính
Chương 11 Hội nhập báo cáo vào ứng dụng Windows
Chương 12 Hội nhập báo cáo vào ứng dụng Web
Chương 13 Tạo XML Report Web Services
Chương 14 Làm việc với các dữ liệu nguồn
Chương 15 Xuất khẩu và triển khai hoạt động các báo cáo
Tập VII: Sổ tay kỹ thuật C# - phần A
Chưa định hình các chương
Tập VIII: Sổ tay kỹ thuật C# - phần B
Chưa định hình các chương
Bộ sách này dành cho ai?
Bộ sách này được viết dành cho những ai muốn triển khai những ứng dụng chạy trên
Windows hoặc trên Web dựa trên nền NET Chắc chắn là có nhiều bạn đã quen viết C++,
Java hoặc Visual Basic, hoặc Pascal Cũng có thể bạn đọc khác lại quen với một ngôn
ngữ khác hoặc chưa có kinh nghiệm gì về lập trình ngoài lập trình cơ bản Bộ sách này
dành cho tất cả mọi người Vì đây là một bộ sách tự học không cần thầy, chỉ cần có một
máy tính được cài đặt NET Đối với ai chưa hề có kinh nghiệm lập trình thì hơi khó một
chút nhưng “cày đi cày lại” thì cũng vượt qua nhanh những khó khăn này Còn đối với
những ai đã có kinh nghiệm lập trình thì sẽ mê ngay ngôn ngữ này và chỉ trong một thời
gian rất ngắn, 6 tháng là tối đa là có thể nắm vững những ngóc ngách của ngôn ngữ mới
này, và có thể biết đâu chừng trong một thời gian rất ngắn bạn sẽ trở thành một “guru”
ngôn ngữ C# Người viết cũng xin lưu ý bạn đọc là bộ sách này là sách tự học (tutorial)
chứ không phải một bộ sách tham chiếu (reference) về ngôn ngữ, nên chỉ mở đường phát
quang hướng dẫn bạn đi khỏi bị lạc, và đem lại 60% kiến thức về ngôn ngữ Và khi học
tới đâu, tới một chặng đường nào đó bạn có thể lên MSDN phăng lần đào sâu từng đề
mục con mà bạn đang còn mơ hồ để có thể phăng lần 40% còn lại kiến thức để nắm vững
vấn đề Lấy một thí dụ Trong bộ sách này, chúng tôi thường đề cập đến các lớp Chúng
tôi giải thích tổng quát cho biết lớp sẽ được dùng vào việc gì và sử dụng một số hàm hành
sự (method) hoặc thuộc tính (property) tiêu biểu của lớp này trong những thí dụ cụ thể
Thế nhưng mỗi lớp có vô số hàm hành sự và thuộc tính cũng như tình huống Thì lúc này
bạn nên vào MSDN tham khảo từng hàm hành sự hoặc thuộc tính một của lớp này để bạn
Trang 25có một ý niệm sơ sơ về những công năng và đặc tính của lớp Có một số chức năng/đặc tính bạn sẽ chả bao giờ sử dụng đến, còn một số thi thoảng bạn mới cần đến Cho nên về sau, khi bạn muốn thực hiện một chức năng gì đó, thì bạn có thể vào lại MSDN xem lớp
có một hàm hoặc thuộc tính đáp ứng đúng (hoặc gần đúng) nhu cầu của bạn hay không và nếu có thì lúc này bạn mới xem kỹ cách sử dụng Kinh nghiệm cho thấy, là trong suốt cuộc đời hành nghề lập trình viên, bạn sẽ “xào đi xào lại” cũng chừng nấy lệnh, hoặc một
số hàm nào đó theo một mẫu dáng (pattern) nào đó, nên một khi bạn đã khám phá ra những lệnh hoặc hàm này, và áp dụng thành công thì bạn sẽ thường xuyên dùng đến một cách máy móc không cần suy nghĩ gì thêm
Theo tập quán phát hành sách hiện thời trên thế giới, thì sách sẽ kèm theo một đĩa mềm hoặc đĩa CD chứa các bài tập thí dụ Ở đây rất tiếc, chúng tôi không làm thế vì nhiều lý do Thứ nhất giá thành sẽ đội lên, mà chúng tôi thì lại muốn có những tập sách giá bán đến tay bạn đọc rẻ bằng 50% giá hiện hành của các sách khác cùng dung lượng (nhưng khác chất lượng nội dung) Thứ hai, các bạn chịu khó khỏ lệnh vào máy, khỏ tới đâu bạn đọc hiểu tới đấy Đôi khi khỏ lệnh sai, máy bắt lỗi bạn sẽ biết những thông điệp cảnh báo lỗi nói gì để về sau mà cảnh giác Còn nếu tải chương trình xuống từ đĩa vào máy, cho thử chạy tốt rồi bạn bằng lòng rốt cuộc bạn chả hiểu và học gì thêm Khi khỏ một câu lệnh như thế bạn phải biết bạn đang làm gì, thực hiện một tác vụ gì, còn như nhắm mắt tải lệnh xuống thì cũng chẳng qua là học vẹt mà thôi không động não gì cả Chúng tôi hy vọng bộ sách sẽ giúp bạn có một nền tảng vững chắc trong việc lập trình trên NET
Ngoài ra, trong tương lai, nếu sức khoẻ cho phép (vì dù gì thì tuổi soạn giả cũng gần 72) chúng tôi dự kiến ra bộ sách về phân tích thiết kế các ứng dụng điện toán sử dụng UML và Pattern Trong những buổi gặp gỡ giữa bạn bè và một đôi lần trên báo chí khi họ than phiền là kỹ sư tin học bây giờ ra trường không sử dụng được, chúng tôi thường hay phát biểu là không ngạc nhiên cho lắm khi ta chỉ cho ra toàn là “thợ lập trình” giống như bên xây dựng là thợ hồ, thợ nề thợ điện thợ mộc v v chứ đâu có đào tạo những kiến trúc
sư (architect) biết thiết kế những bản vẽ hệ thống Do đó, chúng tôi dự kiến (hy vọng là như vậy) là sẽ hoàn thành một bộ sách đề cập đến vấn đề phân tích thiết kế những hệ thống sử dụng những thành tựu mới nhất trên thế giới là UML và Pattern với những phần mềm thích ứng là IBM Rational Rose XDE và Microsoft Visio for Enterprise Architect Ngoài ra, những gì học ở trường là thuần túy về kỹ thuật lập trình, về mô phỏng, trí tuệ nhân tạo, lý thuyết rời rạc v.v (mà những mớ lý thuyết này không có đất dụng võ) nhưng khi ra trường vào các xí nghiệp thì mù tịt về quản lý nhân sự, về kế toán về tồn kho vật
tư, về tiêu thụ v v mà 80% ứng dụng tin học lại là vào các lãnh vực này Do đó, trong
bộ sách mà chúng tôi dự kiến sẽ soạn những tập đi sâu vào xây dựng những hệ thống quản lý trong các cơ quan xí nghiệp hành chánh cũng như thương mại
Trang 26Đôi lời cuối cùng
Kể từ năm 1989, năm thành lập văn phòng dịch vụ điện toán SAMIS, cho đền nay
gần trên 15 năm chúng tôi cùng anh chị em trong nhóm SAMIS đã biên soạn trên 55 đầu
sách, và cũng đã phát hành gần 400.000 bản, trong ấy 60% là phần của soạn giả Từ
những tiền lời kiếm được do tự phát hành lấy cộng thêm tiền hưu tiết kiệm của bà vợ
người Thụy sĩ, hằng năm chúng tôi đã dành toàn bộ số tiền này để xây các trường cho
những vùng sâu vùng xa trên 15 tỉnh thành đất nước (Sơn La, Nghệ An, Quảng Ngãi,
Quảng Nam, Quảng Trị, Bình Định, Ban Mê Thuột, Pleiku, Daklak, Bà Rịa Vũng Tàu,
Đồng Nai, Bình Dương, TP Hồ Chí Minh, Cần Thơ, và Cà Mau), cấp học bổng cho các
sinh viên nghèo tại các đại học Huế, Đà Nẵng, An Giang và TP Hồ Chí Minh, hỗ trợ vốn
cho giáo viên ở An Lão (Bình Định), xây nhà cho giáo viên ở vùng sâu vùng xa (Bình
Định, Quảng Trị), và tài trợ mổ mắt cho người nghèo ở An Giang (4 năm liền) Các hoạt
động xã hội này đều thông qua sự hỗ trợ của hai tờ báo Tuổi Trẻ và Sài Gòn Giải Phóng
Không ngờ những việc làm rất cá nhân này lại được Nhà Nước “theo dõi” đến nỗi không
biết vị nào đã “xúi” Chủ tịch nước Trần Đức Lương ký quyết định tặng người viết Huân
chương Lao động Hạng 3, ngày 29/8/2000 Nói ra điều này, chúng tôi muốn bạn đọc hiểu
cho là tự nội lực của ta, ta cũng có thể giúp đỡ giáo dục mà khỏi nhờ viện trợ của các
nước Nhật, Hàn Quốc Nếu các bạn ý thức rằng mỗi tập sách bạn mua của chúng tôi thay
vì mua sách “luộc” hoặc photocopy là bạn đã gián tiếp tham gia vào chương trình xây
trường lớp cho vùng sâu vùng xa cũng như hỗ trợ học bổng cho sinh viên nghèo của
chúng tôi
Cuối cùng, chúng tôi xin cảm ơn sự hỗ trợ của các anh chị Hoàng Ngọc Giao, Võ
Văn Thành và Trần Thị Thanh Loan trong việc hoàn thành bộ sách này
TP Hồ Chí Minh ngày 22/04/2005
Dương Quang Thiện
Trang 27sử dụng các ô control thông dụng mang tính ẩn dụ?
Thật thế, việc thiết kế giao diện người sử dụng thật sự là một tập hợp nhiều công tác khác nhau:
User interface modeling: Mô hình hoá giao diện người sử dụng Đây là tiến trình
theo đấy bạn xem xét các công việc mà chương trình cần hoàn thành, và đi đến quyết định làm thế nào chặt nhỏ các công việc này thành những cửa sổ và các ô control
User interface architecture: Kiến trúc giao diện người sử dụng Đây là lô gic
thiết kế mà bạn dùng để chia nhỏ chức năng trong ứng dụng thành những đối tượng riêng rẽ Bằng cách tạo ra một thiết kế nhất quán, và đặt kế hoạch đàng hoàng sẽ làm cho dễ dàng trong việc nới rộng giao diện, thay đổi và tái sử dụng những phần nhỏ của khung làm việc (framework) GUI
User interface coding: Lập trình giao diện người sử dụng Đây là tiến trình theo
đấy bạn thảo ra các đoạn mã dùng quản lý GUI với những lớp và đối tượng thích ứng
Lý tưởng mà nói, bạn tuân theo hai bước đầu tiên để bố trí một mô hình GUI cụ thể nào đó cũng như kiến trúc của nó trước khi tiến hành giai đoạn thứ ba này
Tập sách này tập trung nói đến giai đoạn cuối, và đây là bước tốn hao khá nhiều thời giờ, theo đấy việc thiết kế GUI sẽ được chuyển dịch thành đoạn mã sử dụng các công cụ và
kỹ thuật NET Tuy nhiên, khó lòng phân định rạch ròi lập trình tốt khỏi thiết kế đoạn mã tốt, và việc bàn cãi liên quan đến kiến trúc của GUI sẽ trở đi trở lại xuyên suốt tập sách này (và trọng tâm là trong chương 2, “Thiết kế giao diện theo Lớp và Tam nguyên” kế tiếp)
Trang 28Tuy nhiên, chương này tập trung xem xét công việc đầu tiên: thiết kế GUI Ở đây bạn
sẽ xem xét những hướng dẫn thiết yếu mà không lập trình viên nào có thể cho phép phớt
lờ Bạn sẽ học những mánh (tip) cơ bản giúp bạn tổ chức thông tin, thụ lý sự phức tạp và
thử đóng vai trò của “quan toà” cuối cùng mà ai cũng phải sợ: đó là người sử dụng cuối
cùng (end user)
Bạn cũng có thể bỏ qua chương này, nhảy thẳng vào việc lập trình NET Tuy nhiên,
khung làm việc lập trình lớn nhất cũng không giải quyết những sai lầm thông dụng gay
cấn về GUI Việc học làm thế nào thiết kế một GUI cũng không kém phần quan trọng
như học cách lập trình GUI
1.1 Tại sao phải bận tâm về giao diện?
Giao diện người sử dụng là lớp vỏ mỏng bao trọn phần lô gic của chương trình và
cung cấp cho người sử dụng bình thường một cách thức tương tác với chương trình
Thông thường, GUI có 3 trách nhiệm:
Suy diễn xem người sử dụng muốn gì rồi dịch ý muốn này ra thành những tác vụ
(operation) tương ứng
Đi tìm lại thông tin và cho hiển thị thông tin này theo nhiều cách khác nhau
Dẫn dắt người sử dụng xuyên qua một công tác (và lôi người sử dụng ra khỏi
những sai lầm thông dụng)
GUI thường vác trên vai sức nặng của một chương trình, vì đây là nơi duy nhất mà
người sử dụng tương tác với chương trình Bất chấp chương trình có thể làm gì nếu nó
bị gài nằm sau một giao diện mang nhiều hạn chế và gây vỡ mộng Giống như mọi việc
trong đời thường, thiên hạ đánh giá và nhận diện một chương trình dựa trên việc họ
thấy gì ở vẻ bề ngoài của giao diện Một giao diện dáng vẻ thân thiện hấp dẫn thì có thể
gây ấn tượng đối với người sử dụng, còn ngược lại một giao diện xấu xí thô kệnh gây
lúng túng sẽ là một mối đau đầu đối với người sử dụng cũng như đối với lập trình viên
triển khai
Trong giới lập trình viên, giao diện người sử dụng thường là đề tài gây tranh cãi sôi
nổi Một số lập trình viên cho rằng quá là cường điệu khi đặt trọng tâm chú ý vào giao
diện người sử dụng và họ nghĩ rằng như thế đi quá xa khỏi lập trình “thực thụ” Họ khiếp
sợ trước những đòi hỏi được định nghĩa một cách mơ hồ, trước những người sử dụng khó
tính cũng như trước sự cảm nhận là phải đơn giản hoá sản phẩm Còn một loại người
khác gồm các lập trình viên say mê thử nghiệm giao diện GUI với những ô control tối tân
xuất hiện chót nhất, không cần biết là có chuẩn hay không
Trang 29Nói cho cùng, cả hai cách tiếp cận kể trên đều không tốt đối với người sử dụng cuối cùng, khi người sử dụng chỉ đòi hỏi một giao diện đơn giản, không gây khó chịu gò bó hoạt động đúng như ý họ muốn Muốn tạo một giao diện GUI ngon lành, có khả năng làm vừa lòng người sử dụng trung bình, bạn cần hiểu thấu những qui tắc “bất thành văn” về thiết kế giao diện
1.2 Một chút ít lịch sử về giao diện?
Bạn có thể xem việc thiết kế giao diện GUI như là một lịch sử đổi mới liên tục Thật thế, thiết kế GUI hiện được đánh dấu bởi một loạt lĩnh vực riêng biệt Điển hình là trong mỗi lĩnh vực thì sẽ triển khai một cách tiếp cận vượt trội Rồi sau đó, vào một lúc bất kỳ, một lập trình viên cô độc hoặc một nhóm lập trình viên đầy sáng tạo cho ra một mô hình GUI thật sự mới làm thế giới ngạc nhiên Và những tháng sau đó, hằng trăm lập trình viên
đổ xô tạo ra những phiên bản tương tự nhưng lại không tương thích Tiến trình bắt chước
“trật chìa” tiếp diễn cho tới khi một cuộc cách mạng kế tiếp xảy ra
1.2.1 Lĩnh vực Command-Line
Với bất cứ ai đã có kinh nghiệm với máy tính đều biết qua command-line nổi tiếng là
gì Ngày này, những ai tập tễnh vào nghề tin học đều nghĩ rằng command-line chẳng qua
là một “cửa hậu” cho phép truy cập vào những chức năng cấm kỵ và bị cất giấu khỏi các
“phó thường dân”
Một giao diện command-line là giấc mơ của người sử dụng có năng lực Lẽ dĩ nhiên,
kể cả người sử dụng có năng lục cũng phải học hỏi đâu đó, và phần lớn quên rằng command-line không phải là một công cụ dễ nắm bắt chế ngự
Trong chừng mực nào đó, command-line là cách thức nguyên thủy thực hiện những điều cần làm, và được cho rằng đây không phải là một cách thiết kế giao diện vì nó không
có giao diện như theo cách nhìn của người ngày nay Command line bắt đầu như là cơ bản đối với những hệ điều hành chẳng hạn DOS và UNIX (hình 1-1) theo đấy là cơ bản đối với những ứng dụng thuở ban đầu chẳng hạn dBASE, và tiếp tục sinh sôi nảy nở ở những nơi bất thường
Thí dụ, giao diện Visual Studio NET cung cấp một Command Window cho phép bạn tương tác với IDE hoặc cho thi hành những dòng lệnh đơn giản cùng lúc ứng dụng hiện đang chạy Ngoài một vài cải tiến hơi thô sơ (chẳng hạn autocomplete) nhưng vẫn là một giao diện Command Line cơ bản (hình 1-2)
Trang 30Giao diện Command-Line mang những đặc tính sau đây:
Ultimate control. Nắm quyền điều khiển cuối cùng Người sử dụng có thể làm
bất cứ điều gì theo bất cứ trật tự nào, miễn là nhớ thuộc lòng các “mã bí mật”
Ultimate lack of structure. Cuối cùng là thiếu sót một cấu trúc Các người sử
dụng không những phải nhớ là biết làm gì nhưng phải biết làm theo thứ tự nào
Trên DOS, việc chỉ di chuyển một tập tin lên một thư mục mới có thể là một
công tác gồm nhiều giai đoạn đau đầu Theo mặc nhiên, giao diện
Command-Line giả định mỗi tác vụ là atomic (nghĩa là bất khả phân), và không có việc gắn
liền một công tác này với một công tác khác
Trang 31 A “hand off” treatment of user. Một cách đối đãi không chỉ giáo đối với
người sử dụng Với một vài biệt lệ nho nhỏ, sẽ không có hỗ trợ người sử dụng
thông qua những nhắc nhở (prompt), mánh (tip) hoặc hướng dẫn
No metaphors Không có ẩn dụ Điều này làm cho người sử dụng nắm vững
tiến trình cơ bản (khỏ vào các từ, rồi ấn Enter) không bao giờ thay đổi Tuy nhiên, khó lòng đoán được làm thế nào thực hiện một công việc có liên hệ dựa trên một công việc đi trước Thí dụ, nếu bạn biết cách chép một tập tin trên UNIX, bạn vẫn không biết làm thế nào gỡ bỏ tập tin đi
Ngày nay, mô hình command-line vẫn có thể xuất hiện trong giao diện của bạn, nhưng không chắc chắn lắm
Bạn không nắm quyền điều khiển: Đây có thể là một điều phúc lành mà cũng có thể là một khổ ải Nếu chương trình có một ý niệm rõ ràng nhu cầu của bạn, bạn sẽ ở vào một kịch bản “một nhà độc tài tốt bụng”, làm cho cuộc đời của bạn ít phức tạp Nhưng nếu chương trình giả định sai, thì bạn không tài nào đấu lại nó
Bạn có hướng dẫn cuối cùng. Một loại chỉ thị sẽ được cung cấp tại mỗi bước
đi trong tiến trình
Bạn vẫn không có những ẩn dụ (metaphor): Thật ra không đúng như thế - thỉnh thoảng một ẩn dụ sơ sài được dùng theo đấy chương trình mời bạn tưởng tượng một hướng dẫn viên thân thiện hỏi bạn loạt câu hỏi và cố làm những gì bạn muốn
Mô hình lập trình hỏi-đáp có một chỗ đứng đáng giá trong thế giới ngày nay, và ta có
thể thấy phổ biến trên các chương trình Windows được mang tên là wizard Wizard dẫn
dắt bạn qua một lô câu hỏi, và sau đó thực hiện một công tác phức tạp giùm bạn
Trang 32Như bạn có thể khám phá ra, có những wizard hữu ích (giống như wizard giúp bạn
setup phần cứng trên máy tính) Nhưng cũng có những wizard không hữu ích cho mấy,
phức tạp hơn, đòi hỏi và hạn chế hơn bản thân chương trình (giống như wizard tạo các tài
liệu giùm bạn trong vài chương trình đồ họa phổ biến) Hình 1-3 cho thấy wizard
Windows dùng bổ sung phần cứng
TIP: Một tập quán tốt là cho thi công một wizard trong ứng dụng của bạn chỉ sau khi bạn
đã tạo ra một giao diện Windows chuẩn Điều này bảo đảm là bạn không rơi vô ý thức
vào việc lập trình chức năng ứng dụng trong lòng bản thân wizard, và việc này sẽ đem lại
cho người sử dụng uyển chuyển tối đa Một vài lập trình viên khuyên nên bỏ ra ngoài
wizard khỏi phiên bản đầu tiên của ứng dụng
Các chương trình hỏi-đáp là con dao hai lưỡi có thể làm cho ngán ngẩm cũng như gây
ấn tượng Phần kế tiếp sẽ phác họa những nguyên tắc chủ chốt giúp bạn làm việc mô hình
này
1.2.2.1 Hỏi những gì mà người sử dụng có thể trả lời
Xem ra là có ý nghĩa khi hỏi người sử dụng cho bạn biết công ty nào sản xuất máy in
bạn đang dùng Tuy nhiên, không gì vô duyên bằng khi hỏi người sử dụng có chuyển đổi
tab thành khoảng trắng đối với những tác vụ in trên DOS hay không Thay vào đó, ta chỉ
Trang 33cần chọn một trị mặc nhiên thích ứng Bạn nên nhớ là không ai muốn bị hỏi mà không thể trả lời được Đối với người sử dụng mới tập tễnh làm quen máy tính, họ có thể bỏ ngang hoặc ngưng không đọc những câu nhắc nhở
1.2.2.2 Giới hạn vào một công tác đơn độc
Một wizard sẽ hoạt động tốt đối với một công tác đơn độc, và công tác này chỉ có thể được thực hiện theo một thể thức nào đó (chẳng hạn việc thêm một driver máy in) Ngay khi bạn bắt đầu thêm một phần tử vào những công tác khác nhau hoặc sáng tạo thì wizard
sẽ không theo nổi Bạn không nên nghĩ rằng bạn sẽ hãnh diện về một wizard phức tạp đi
rẽ có điều kiện (conditional branch) để sử dụng những cửa sổ khác nhau tùy thuộc vào những lựa chọn trước đó của người sử dụng Công việc đơn thuần của bạn là tạo ra một chương trình DOS cổ điển chỉ gồm một màn hình duy nhất, theo đấy các công tác phải được hoàn thành trong những cửa sổ riêng rẽ và theo một loạt trật tự
1.2.2.3 Nên để ý đến việc gò theo những sở thích của bạn
Mỗi wizard sẽ có riêng cho mình những mẫu dáng viết đoạn mã gắn chặt (hard-coded pattern) Người sử dụng sẽ không có lựa chọn về thứ tự nào phải trả lời những câu hỏi hoặc cung cấp thông tin, và việc mất quyền điều khiển có thể làm thất vọng bất cứ ai muốn tiếp cận khác đi một công tác nào đó Báo trước cho bạn biết là đặc biệt khi bạn đang sử dụng một wizard đối với một công việc phức tạp: bạn đang gò theo một thể thức duy nhất làm việc dựa theo những giả định cũng như thành kiến của bạn Nếu nó không khớp với thể thức mà phần lớn người sử dụng muốn làm thì nó chỉ tổ làm cho họ khổ sở
mà thôi
1.2.3 Mô hình vận hành theo trình đơn
Mô hình được vận hành theo trình đơn (menu-driven) là mô hình GUI được nhận diện dễ dàng nhất Nó khá phổ biến trong các chương trình dựa theo tài liệu giống như các trình soạn thảo văn bản DOS, và sau đó chiếm lĩnh hầu hết mọi ứng dụng trên hệ điều hành Windows Lý do rất dễ hiểu: các trình đơn tượng trưng cho một thỏa hiệp hấp dẫn, cho phép bạn nhắc nhở người sử dụng mà vẫn không hạn chế cách thức người sử dụng làm việc
Các lệnh có thể được thực hiện theo bất cứ trật tự nào: bạn có hoàn toàn
tự do như với giao diện command-line
1 Chúng tôi dịch “menu” là trình đơn Có người dịch là thực đơn Ở đây chả có ăn uống gì mà phải gọi thực đơn Đây chẳng qua là liệt kê những chương trình giống như trên hoá đơn người ta liệt kê các mặt hàng
Trang 34 Thông tin nằm trên màn hình sẽ nhắc nhở bạn: không bao giờ bạn được để
yên xoay xở một mình, và việc gộp chung với nhau những phần tử có thể giúp
bạn nhớ lại những gì bạn phải làm Thí dụ, nếu bạn muốn thay đổi khoảng cách
hàng trong Microsoft Word, có thể bạn không biết nó liên hệ với paragraph,
nhưng bạn có khả năng quyết định là trình đơn Format có thể là nơi tốt nhất để
bắt đầu việc khảo sát của bạn
Các trình đơn là một trong những phần tử chủ yếu trong lập trình Windows, và chúng
tuyệt đối không chừa chỗ cho những thí nghiệm hoặc cải tiến bốc đồng Muốn tạo một
trình đơn, bạn cho sao chép y chang Microsoft Office kể cả việc thêm trình đơn File cho
dù bạn không làm gì cả với các tập tin hoặc tài liệu Cũng tương tự như thế, tốt nhất là
bạn mô phỏng các mục chọn cơ bản như Edit, View, Window, và kể cả Tools trước khi
bạn bắt đầu thêm những trình đơn được tổ chức xung quanh những khái niệm đặc thù của
chương trình Về sau trong chương này bạn sẽ học nhiều hơn về vai trò của Microsoft
trong việc thiết kế giao diện người sử dụng
1.2.4 Lĩnh vực GUI
Sau một thời gian ngắn, khi sự sôi nổi do trình đơn đem lại đã lắng dịu, thì mọi người
đâm ra khoái chí với các hình ảnh, nút (button) và thế giới Macintosh và Microsoft
Windows Lĩnh vực GUI cho nhập vào vô số khái niệm và các phần tử giao diện thường
được gọi dưới cái tên lóng WIMP (windows, icon, mouse, và pointer) Một cải tiến chủ
chốt trong lĩnh vực GUI là việc đưa con chuột vào hoạt động cho phép đem lại nhiều
điểm đột nhập (point of entry) để tương tác với một ứng dụng Một thay đổi khác xảy ra
là việc chuyển dịch về cách biểu diễn thực tế - thí dụ, các chương trình soạn thảo văn bản
cho thấy tài liệu sẽ được in ra giống như thế nào Ý niệm chính trong lĩnh vực GUI là cho
giao diện người sử dụng dựa trên các ẩn dụ (metaphor) thuộc thế giới thực Thí dụ, nếu
bạn muốn gỡ bỏ một tập tin, bạn cho lôi tập tin thả lên một icon giống như một thùng rác
vì trong thực tế đây là điều bạn thường làm khi tống đi những đồ không còn ích lợi gì nữa
vào xọt rác
Lẽ dĩ nhiên, một vài việc khó lòng truyền đạt thành hình ảnh so với một số khác (thí
du, không ứng dụng nào có thể cung cấp một icon gợi ý “đồng bộ hoá email của tôi”)
Vào lúc mà lĩnh vực GUI xuất hiện, thì việc thiết kế giao diện người sử dụng bắt đầu
được xem như là một khoa học thực thụ
Ta có thể kể ra một vài dấu hiệu chứng thực lĩnh vực GUI:
Visual clues: Manh mối nhìn thấy được Một nút với đường viền màu xám như
muốn nhảy khỏi cửa sổ - nó giống như có thể ấn xuống được
Trang 35 Real-world analogies: Những tương đồng trong thế giới bên ngoài Một khung
đối thoại với những thẻ (tab) giống như những trang thẻ trong một tập hồ sơ Sticky notes trên Microsoft Outlook giống như những sticky-note (những miếng giấy ghi chú được đính trên bảng đen) Xem hình 1-4 Phần lớn các phần mềm quản lý giao tiếp (contact management) cố gắng bắt chước y chang một tờ lịch treo tường và một cuốn sổ địa chỉ Ý kiến cho rằng người sử dụng đã biết dùng thế nào những đồ vật này trong thế giới thực
Việc học hỏi có thể truyền đạt: Thí dụ, nếu bạn học cách làm thế nào gỡ bỏ một tập tin, chương trình có thể cung cấp một thùng rác (trash can) cho phép bạn
gỡ bỏ một mẫu tin sản phẩm, và bạn có khả năng biết cách sử dụng nó theo bản năng dựa trên sự giống nhau
Tất cả các điểm kể trên thực chất nhằm cố gắng làm cho chương trình lô gic đến nổi hầu như là hành động theo bản năng hoặc theo trực giác Mục đích là đối với một người
sử dụng sẽ không đòi hỏi một sự huấn luyện, mà chỉ cần có khả năng áp dụng những giả định thu lượm được từ những chương trình khác và thế giới bên ngoài khi học sử dụng một ứng dụng mới Lẽ dĩ nhiên, vì ta nhắm vào người sử dụng, nên bạn cần biết rành một
Trang 36người sử dụng trung bình sẽ nghĩ gì trước khi khi bạn có thể tạo giao diện Ngày nay, triết
lý trên vẫn còn công dụng
Mô hình GUI cung cấp cho lập trình viên khá nhiều tự do (có người bảo là quá nhiều
tự do) Trong thế giới Windows, thiết kế một giao diện người sử dụng loại 1 không dính
dáng chi với việc sáng chế những ẩn dụ mà là tuân thủ những qui ước đã được thiết lập
1.3 Sáng tạo so với Qui ước
Nhiều dự án giao diện người sử dụng đã đi trệch hướng khi các dự án này đem so với
nhu cầu sáng tạo của các nhà triển khai phần mềm Rất tiếc là giao diện GUI của một ứng
dụng không chỉ ấn định dáng vẻ bề ngoài của một chương trình mà còn ấn định cách
chương trình hành động thế nào (hoặc theo quan điểm người sử dụng, cách chương trình
hoạt động thế nào)
Bạn nên tự đặt câu hỏi như sau: các nhà sản xuất xe hơi có thể nào cho phép cùng
một mức độ tự do về sáng tạo mà vài vị triển khai phần mềm đã thực hiện trong việc thiết
kế ứng dụng? Thiên hạ ai cũng tin tưởng vào sự an toàn của xe hơi (và tính nghiêm trọng
nếu xảy ra sai lầm) nên khó tưởng tượng là nhà sản xuất xe hơi cho phép một loại tự do
như thế Mỗi năm, các kiểu xe mới ra đời dưới sự “vặn vẹo” của đám kỹ sư thiết kế với
sự hứa hẹn táo bạo cho rằng các xe này hoàn toàn mới và hiện đại Chả cần xem xét kỹ
cũng biết là máy điều hoà không khí hoặc radio bao giờ cũng hoạt động giống như trước;
tay lái trông giống và hoạt động đúng như thuở nào; ghế ngồi thường thì không thay đổi;
và việc điều khiển khởi động xe, dừng xe cũng như chạy chậm chậm khó lòng phân biệt
Người lái xe bình thường có thể nhắm mắt lại và có thể nhận biết đâu là ổ khoá đề xe
Kể cả những ứng dụng tốt nhất của ngày hôm nay, rất hiếm có tính nhất quán vừa kể
trên Nếu bạn cho cài đặt một chương trình mới trên máy tính của bạn, bạn có chắc chắn
là tổ hợp phím <Ctrl+S> sẽ cho cất trữ tập tin của bạn hay không? Lệnh trình đơn File |
Print có chắc chuyển tài liệu của bạn ra máy in ngay liền hay là bạn phải thực hiện vài
cuộc vặn vẹo nào đó trước khi in Và đâu là nơi bạn sẽ tìm thấy lệnh trình đơn đối với cửa
sổ quan trọng Preferences hoặc Options … ở Tools, Edit, hoặc File?
Nói một cách ngắn gọn, qui ước là cách người sử dụng học làm việc với vô số phần
mềm khác nhau Vi phạm qui ước bằng cách này hoặc cách khác xem ra thấp so với
những chờ đợi của bạn tất phải thất bại Nó chỉ nhân gấp bội số lượng thông tin mà một
người sử dụng cần biết để sử dụng phần mềm máy tính
1.3.1 Tính nhất quán trên NET
Microsoft không giấu giếm một trong những mục tiêu của sàn diễn NET là làm cho
mô hình lập trình nhất quán hơn đối với những lập trình viên khác nhau Bạn có thể thấy
Trang 37điều này trong những ngôn ngữ NET khác nhau; các ngôn ngữ này chia sẻ sử dụng một tập hợp các kiểu dữ liệu và chức năng lấy từ một thư viện lớp được chia sẻ sử dụng Bạn
có thể thấy điều này trong việc sử dụng rộng rãi interface và inheritance, theo đấy làm thế nào các lớp chuyên biệt hoạt động làm cho chúng giông giống các lớp tương tự Bạn có thể thấy thể thức mà Visual Studio NET cho phép bạn sử dụng những công cụ gỡ rối cực mạnh không cần biết bạn đang làm việc với đoạn mã trên một dự án Windows, hoặc trên trang ASP.NET hoặc kể cả trên một thủ tục căn cứ dữ liệu làm sẵn được cất trữ (database stored procedure)
1.3.2 Nguyên tắc “Hành động giống như
Microsoft”
Bí quyết tạo một chương trình mà người sử dụng bình thường có thể hiểu được, kể cả thích thú, là thường chỉ cần sao chép Microsoft càng y chang càng tốt Đây không có nghĩa là Microsoft đã chọn lựa đúng đắn nhất trong các ứng dụng của họ - nhưng đối với phần lớn thì điều này không quan trọng Nếu người sử dụng dùng ứng dụng của bạn, thì chắc chắn là ho đã sử dụng Microsoft Windows, Microsoft Office hoặc Internet Explorer Thật thế, nếu người sử dụng của bạn là những người dùng đều đặn máy tính, thì có thể phần lớn thời gian ngồi trên máy, họ đang sử dụng Word và Excel
Rất hiếm có lý do chính đáng để xa rời khỏi những chuẩn Microsoft đề ra Nếu người
sử dụng trung bình đã học được cái gì đó, thì đấy là những phím gõ thông dụng và tổ chức trình đơn trong một ứng dụng Microsoft Office
Nếu bạn chưa hề tạo một ứng dụng dùng trong văn phòng hoặc dựa trên tài liệu, bạn nên cẩn thận để tâm đến cách thiết kế của Microsoft Hầu hết trên mọi lĩnh vực, Microsoft đều có những thí dụ “dày dạn kinh nghiệm” Trong vài trường hợp, có thể bạn nên tham khảo một ứng dụng khác (chẳng hạn Adobe Photoshop trong lĩnh vực đồ họa) nhưng thường thì chuẩn nằm ở Microsoft
1.3.3 Các trình tiện ích hành chánh
Một thí dụ tốt của một Windows qui ước mà ta có thể tìm thấy là trong thiết kế của Microsoft liên quan đến các trình tiện ích hệ thống và quản lý hành chính Các trình tiện
ích này hầu như bao giờ cũng dùng cặp ô control ListView và TreeView, gần giống như
Windows Explorer Trong Windows 2000 và các hệ điều hành sau này, Microsoft sử dụng cách thiết kế này mọi nơi khi có thể, kể cả trong việc cấu hình hoá phần cứng máy tính cũng như quản lý người sử dụng (hình 1-5):
Trang 38Loại thiết kế này có những đóng góp đáng kể Trước tiên, có thể thấy dễ dàng cách
các item liên hệ thế nào TreeView cho gợi ý các cấp bậc cơ bản về gộp theo nhóm
(grouping) cũng như gộp theo nhóm phụ (subgrouping) Thường bạn có thể thêm nhiều
cấp bậc TreeView để phối hợp các tính năng (feature) có thể nằm rải rác trên nhiều cửa
sổ khác nhau Bạn cũng có thể thu thập một số lớn thông tin mà khỏi rời xa cửa sổ
Khung cửa ListView có thể được thích nghi cho thấy nhiều kiểu dữ liệu khác nhau mà
không làm tối tăm các ô control lèo lái (navigational control), cho phép người sử dụng
hoạt động thoải mái Cuối cùng nó không ép phải tuân thủ bất cứ trật tự nào để thực hiện
các công tác Ngoài ra, nó cũng sử dụng những icon đồ họa giúp phá vỡ sự đơn điệu buồn
tẻ của việc số lớn thông tin được hiển thị cùng một lúc
Kiểu thiết kế này cũng có một vài đặc thù (idiosyncrasy) Thí dụ, qui ước trình đơn
thích một trình đơn Action thay vì các trình đơn File và Tools Thỉnh thoảng, các mẫu
tin2 được hiệu đính trên một cửa sổ đặc biệt xuất hiện thay vì ListView, trong khi trong
các trường hợp khác thì một cửa sổ riêng rẽ sẽ bật tung lên (popup) cho phép tiến hành
những thay đổi Nó cũng có quá nhiều tham vọng, và có thể làm lúng túng đối với những
người sử dụng cơ bản không hiểu mối liên hệ giữa ListView và TreeView Do đó, việc
dùng một phong cách giao diện tùy thuộc vào loại người sử dụng bạn nhắm tới
2 Mẫu tin dịch từ chữ records Mẫu ở đây là làm mẫu chứ không phải mẩu bánh
Trang 39Trong một cố gắng chuẩn hóa, thiết kế ListView/TreeView này được tìm thấy trong hầu hết các chương trình hiện hành của Microsoft, từ SQL Server đến Visual Studio NET Có một thí dụ ít được biết đến nhưng lại là một chuẩn quan trọng của Microsoft, đó
là framework MMC (Microsoft Management Console) Hiện thời, bạn không thể tạo các ứng dụng MMC trên NET, nhưng bạn có thể theo cách tổ chức và qui ước đối với những trình tiện ích thông dụng cũng như các công tác quản lý chẳng hạn cấu hình hoá người sử dụng hoặc rảo duyệt xem (browse) một căn cứ dữ liệu3 Các chương sau trong tập sách này, bạn sẽ thấy những thí dụ về phong cách đó
Cuối cùng, bạn cần hiểu cả loại ứng dụng lẫn khách hàng sử dụng ứng dụng của bạn Thí dụ, trong khi thiết kế MMC là lý tưởng đối với những công tác cấp cao, Microsoft Office cung cấp những qui tắc kinh điển đối với những ứng dụng dựa trên tài liệu dành cho những người sử dụng ít kinh nghiệm
1.3.4 Hiểu thấu loại ứng dụng của bạn
Nếu bạn không thể nhận diện loại ứng dụng bạn đang tạo ra, bạn sẽ gặp khó khăn dài dài về sau Sau đây là một vài loại ứng dụng phổ biến thông dụng (mà chúng tôi sẽ xem xét đến trong tập sách này):
Trình tiện ích cấu hình hoá (configuration utility): Đây có thể dựa trên một control panel duy nhất hoặc được tổ chức thành một wizard tinh vi hơn
Workspace Đây là một dáng mẫu (pattern) được dùng đến đối với những ứng dụng tinh vi hơn, đặc biệt đối với phần mềm đặc hữu (proprietary software) theo đấy có thể ứng dụng duy nhất được sử dụng trên vài workstation Workspace là một “ứng dụng để bàn - desktop application” cho phối hợp một tập hợp tính năng vào trong một môi trường thông dụng có thể thêm vài loại hiển thị trạng thái (status display)
Trình hiệu đính tài liệu (Document editor): Đây là loại ứng dụng Windows phổ biến nhất
Monitor Thông thường đây là một chương trình khay hệ thống (system tray
program) lui vào hậu trường, tự động thi hành vài công tác khi được hướng dẫn bởi người sử dụng hoặc khi nhận được thông tri từ hệ điều hành Thí dụ, nó có thể nằm chờ thi hành trên một tập tin và tự động sao hoặc du nhập Nếu bạn
3 Chúng tôi dịch từ database là “căn cứ dữ liệu” chứ không dùng từ “cơ sở dữ liệu” vì từ này dịch sai nhưng lại được dùng khá phổ biến Từ “base” trong database, phải hiểu theo ý nghĩa một “căn cứ không quân” (air base) hoặc căn cứ hải quân, trong khi “cơ sở” lại hiểu theo từ “base” trong toán học, giống như “cơ số 2 – base 2” Bạn cứ thử so sánh hai từ cách mạng: căn cứ địa cách mạng và cơ sở cách mạng nằm vùng thì hiểu ngay ra vấn đề
Trang 40muốn tương tác với chương trình thì phải thông qua một trình đơn cảnh ứng đối
với system tray icon
Bộ rảo xem dữ liệu (data browser4) Loại này thường được tổ chức như là một
ứng dụng kiểu Windows Explorer liệt kê các mẫu tin cho phép bạn nhìn xem và
nhật tu các mẫu tin
1.3.5 Hiểu thấu người sử dụng của bạn
Nhóm người sử dụng khác nhau đòi hỏi mức độ hỗ trợ khác nhau Người sử dụng rảo
xem nhanh và không nhọc nhằn xuyên mọi ngóc ngách của Windows Registry khi sử
dụng trình tiện ích regedit.exe, thật ra không phải cùng nhóm người dùng phần mềm
Microsoft Agent để giúp tạo một biểu đồ Nếu bạn đự định thiết kế một ứng dụng chuyên
nghiệp cho một loại người sử dụng nào đó, thì bạn nên bắt đầu tạo ra một “cung cách
người sử dụng” (user profile) nhận diện rõ ràng những khả năng, những chờ đợi và mức
độ thoải mái trên máy tính của người sử dụng đầu cuối
Tuy nhiên, nguyên tắc “biết người biết ta” thường xuyên được dùng như là một cái
chống đở bào chữa cho những giao diện phức tạp dựa trên những đòi hỏi tưởng tượng của
những người sử dụng chuyên nghiệp Như là một qui tắc, ta có khả năng thiết kế một giao
diện phối hợp những bước đi tắt của người sử dụng tiềm năng và việc hướng dẫn đối với
người sử dụng lần đầu làm quen Những người sử dụng ứng dụng của bạn sẽ có những
nhu cầu khác nhau khi lần đầu tiên họ sử dụng phần mềm (hoặc đánh giá cho một mua
sắm tiềm năng) so với lúc họ đã nắm vững việc sử dụng phần mềm như là thành phần
công việc thường nhật của họ Một giao diện tốt thường nhận ra những thách thức này, và
giúp hướng dẫn người sử dụng càng nhiều càng tốt nhưng vẫn không che khuất chức
năng phần mềm Thí dụ, thử xem Microsoft Word, theo đấy những người sử dụng tập
tễnh sẽ tìm lối đi sử dụng các trình đơn như là đầu mối, còn những người sử dụng bậc
trung thì tiết kiệm những cú click bằng cách dùng icon trên thanh công cụ (toolbar icon),
còn người sử dụng dày kinh nghiệm thì lại muốn chạy nhanh bằng cách sử dụng shortcut
key và kỹ thuật lôi thả Không những giao diện phải thụ lý nhiều cấp người sử dụng khác
nhau, mà nó phải giúp người sử dụng nâng hiểu biết từ cấp dưới lên cấp trên, vì nút thanh
công cụ khớp với các lệnh trình đơn, và tựa đề trình đơn bao gồm các shortcut key
Nghệ thuật lớn nhất trong việc thiết kế giao diện người sử dụng là tạo những ứng
dụng có thể được dùng hữu hiệu bởi những người sử dụng trình độ khác nhau Muốn nắm
bắt nghệ thuật này, bạn cần hiểu đâu thì phải hạn chế, và làm thế nào thụ lý sự phức tạp
4 Browser thường được dịch là trình duyệt Thật sự từ browse có nghĩa là cho rảo qua (chẳng hạn lật các trang
sách) để xem, chứ chả có chi là duyệt với không duyệt Do đó, chúng tôi dịch browser là “bộ rảo xem”