Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 120 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
120
Dung lượng
2,61 MB
Nội dung
LÊ NGỌC THẠNH lntmail@yahoo.com LẬP TRÌNH WINDOWS VỚI MFC Microsoft Visual C++ 6.0 NHÀ XUẤT BẢN THỐNG KÊ MỤC LỤC CHƯƠNG : MỘT SỐ KHÁI NIỆM LẬP TRÌNH TRONG MÔI TRƯỜNG WINDOWS 1.1 Chương trình ( Program ) 1.2 Ứng dụng ( Application ) 1.3 Tiến trình ( Process ) 1.4 Tiểu trình (Thread ) 1.5 Thông điệp ( Message ) 1.5.1 Nguồn gốc message 1.5.2 Các loại message 1.5.3 Số hiệu message (Message Indentifier – MessageID) 1.5.4 Đặc tả message 1.6 Cửa sổ giao diện (window) ứng dụng 1.7 Message queue 1.8 Kiến trúc xử lý ứng dụng Windows 1.9 Resource ứng dụng Trang 1 1 2 3 CHƯƠNG : THƯ VIỆN MFC CỦA MICROSOFT & ỨNG DỤNG CƠ BẢN TRONG WINDOWS 2.1 Thư viện MFC (Microsoft Foundation Class) 2.2 Tiếp an MFC 2.3 Tạo ứng dụng windows với MFC ? 2.4 Lớp quản lý tiểu trình CwinThread 2.5 Lớp quản lý tiểu trình giao diện CwinApp 2.6 Thực ứng dụng đơn giản 2.7 Thực ứng dụng giao tác đơn giản 2.8 Tạo Icon Resource cho ứng dụng 2.9 Lưu trữ chương trình nguồn 2.10 Lớp Cstring MFC 10 10 10 10 11 12 14 20 25 27 27 CHƯƠNG : CÁC LỚP GIAO DIỆN ĐỒ HỌA CỦA MFC 3.1 Các công cụ giao diện đồ họa 3.2 Device Context 3.3 Tọa độ giao diện đồ họa 3.4 Các lớp MFC hỗ trợ GDI 3.4.1 Các lớp đối tượng điểm, hình chữ nhật 29 29 29 29 30 30 3.4.2 Lớp Cpen 3.4.3 Lớp CBrush 3.4.4 Lớp CFont 3.4.5 Lớp CBitmap 3.4.6 Lớp CPalette 3.4.7 Lớp CRgn 3.5 Lớp CDC 3.6 Lớp CImageList 31 31 32 32 33 34 35 38 CHƯƠNG : CỬA SỔ GIAO DIỆN LỚP VÀ LỚP CWnd 4.1 Cửa sổ giao diện 4.2 Lớp CWnd 4.3 Sử dụng đối tượng CWnd 4.3.1 Sử dụng CWnd làm giao diện ứng dụng 4.3.2 Ứng dụng chạy (instance) thời điểm 40 40 40 49 49 50 CHƯƠNG : XỬ LÝ MESSAGES 5.1 Lớp xử lý message CCmdTarget: 5.2 Khai báo mục xử lý message MessageMap 5.3 Các lớp kế thừa CCmdTarget 5.4 MessageMap lớp kế thừa CWnd ứng dụng 5.4.1 Cửa sổ ứng dụng có chức hoạt động 5.4.2 WM_PAINT hành vi OnPaint CWnd 51 51 52 55 55 55 58 CHƯƠNG : ỨNG DỤNG CÔNG CỤ GDI 6.1 DC BITMAP 6.2 Ứng dụng với cửa sổ hiển thò ảnh 6.3 Sao chép ảnh từø DC đến DC, phóng to & thu nhỏ ảnh 6.4 DC nhớ ( DC ảo) – vùng vẽ đệm lý tưởng 6.5 Ảnh chuyển động vùng client 6.6 CImageList – công cụ quản lý ảnh cỡ 6.7 CRgn – Cửa sổ có hình dạng tùy ý 60 60 60 63 64 65 66 67 CHƯƠNG : MENU – PHÍM TẮT 7.1 Đònh nghóa 7.2 Menu resoure 69 69 69 7.3 7.4 7.5 7.6 7.7 Sử dụng menu resource Mục xử lý command message từ mục chọn menu Phím tắt (hot key ) cho mục chọn menu Lớp quản lý menu – CMenu Xử lý điều khiển mục chọn menu 71 72 73 75 77 CHƯƠNG : CÁC LỚP ĐỐI TƯNG NHẬP LIỆU ( WINDOWS CONTROLS ) 8.1 CStatic 8.2 CEdit 8.3 CButton 8.4 ClistBox 8.5 CComboBox 8.6 CSpinButtonCtrl 8.7 CProgressCtrl 8.8 CscrollBar 8.9 CSliderBar 78 78 80 84 85 88 91 93 94 96 CHƯƠNG : HỘP HỘI THOẠI 9.1 Hộp hội thoại (Dialog) 9.2 Lớp CDialog 9.3 Tạo sử dụng dialog chương trình 9.3.1 Tạo dialog resource 9.3.2 Khai báo lớp kế thừa CDialog sử dụng dialog resource 9.3.3 Sử dụng dialog chương trình 9.4 Liên kết dialog thành phần khác 9.5 Sử dụng dialog làm giao diện ứng dụng 9.5.1 Thực ứng dụng với giao diện dialog 9.5.2 Dùng MFC wizard tạo ứng dụng với giao diện dialog 9.6 Khai báo biến cho control dialog 9.7 Khai thác tiện ích hỗ trợ 97 97 97 99 99 103 104 104 106 106 107 109 112 CHƯƠNG 10 : KHUNG CỬA SỔ GIAO DIỆN CHÍNH 10.1 Khung cửa sổ giao diện (Frame Window) 10.2 Thanh trạng thái (statusbar) & lớp CStatusbar 10.3 Thanh công cụ (toolbar) & lớp CToolBar 117 117 117 119 10.3.1 Thiết kế ToolBar resource 10.3.2 Dùng toolbar resource cho CToolBar FrameWnd 10.4 Lớp CFrameWnd 10.5 Sử dụng frame window làm giao diện 10.5.1 Thực ứng dụng với giao diện frame window 10.5.2 String Table CFrameWnd 10.5.3 Dùng MFC wizard tạo ứng dụng giao diện framewindow 120 121 121 123 123 124 130 CHƯƠNG 11 : CÁC KIẾN TRÚC DOCUMENT – VIEW 11.1 CDocument 11.2 CView 11.3 CFrameWnd 11.4 CDoctemplate 11.5 Hỗ trợ từ phía đối tượng quản lý ứng dụng 11.6 Trình tự tạo lập đối tượng tham gia DVF 11.7 Text Document Appication 11.8 Rich Text Format (rtf) Document Appication 11.9 HTML Document View Appication 11.10 Một số lớp view đặc biệt 11.10.1 CListView 11.10.2 CTreeView 11.10.3 CSplitterWnd 11.10.4 Sử dụng splitterwnd frame window 11.10.5 Các ví dụ thực hành 134 134 135 136 136 137 138 139 143 146 149 149 150 152 154 155 CHƯƠNG 12 : MỘT SỐ VẤN ĐỀ TRONG WINDOWS 12.1 Tập tin INI 12.2 System Registry 12.3 Vùng Status Area Taskbar 12.4 Ứng dụng ScreenSaver 12.4.1 Đặc điểm 12.4.2 Tham số dòng lệnh 12.4.3 Đặc điểm giao tác với người dùng 12.4.4 Thực ứng dụng ScreenSaver đơn giản 12.5 Ứng dụng sử dụng nhiều tiểu trình 12.5.1 Tiểu trình xử lý nội 158 158 160 162 167 168 168 170 171 175 175 12.6 12.7 12.8 12.9 12.5.2 Tiểu trình giao diện 12.5.3 Các hàm hỗ trợ Lập trình Multimedia với MCI Ấn đònh số tính Windows Bẫy (hook) message (Windows Hook) 12.8.1 Các kiểu hook (Hook Type) 12.8.2 Danh sách hook (Hook Chain) 12.8.3 Thủ tục hook (Hook Procedure) 12.8.4 Các dòch vụ liên quan hook 12.8.5 Ứng dụng hook messages keyboard Cài đặt chế độ thực ứng dụng tự động 177 179 179 181 182 183 183 183 184 185 186 13.7.2 Thiết kế ứng dụng nhận mail 13.8 TCP với HTTP FTP 13.8.1 Lớp CInternetSession 13.8.2 Lớp CInternetFile 13.8.3 Lớp CFtpConnection 13.8.4 Lớp CFtpFindFile 13.8.5 Lớp CHttpConnection 13.8.6 Lớp CHttpFile 13.8.7 Thực ứng dụng FTP client đơn giản 13.8.8 Thực ứng dụng HTTP client đơn giản 220 223 223 224 225 227 228 229 231 232 Phụ lục A: CHƯƠNG 13 : MFC VỚI INTERNET 13.1 Giao thức truyền thông TCP/IP 13.1.1 Giới thiệu 13.1.2 Kiến trúc giao thức TCP/IP mô hình DARPA 13.1.3 Đòa IP 13.1.4 Subnet 13.1.5 Subnet Mask 13.1.6 Host domain name 13.1.7 IP Routing 13.2 Lập trình TCP/IP với Winsock 13.2.1 Port 13.2.2 Socket 13.2.3 Một số cấu trúc liệu Winsock API 13.2.4 Một số dòch vụ Winsock API 13.3 MFC với lập trình Winsock 13.3.1 Khởi động Winsock 13.3.2 Lớp CAsyncSocket 13.4 Lập trình Winsock cho giao thức UDP 13.5 Lập trình Winsock cho giao thức TCP 13.6 TCP với SMTP (Simple Mail Transfer Protocol) 13.6.1 Qui ước ứng dụng gửi mail nhận mail 13.6.2 Thiết kế ứng dụng gửi mail 13.7 TCP với Pop3 (Post Office Protocol – Version 3) 13.7.1 Qui ước ứng dụng mail client mail server 187 187 187 187 189 190 191 192 194 197 197 198 198 199 200 200 200 204 207 215 215 217 219 219 A.1 A.2 A.3 A.4 A.5 A.6 A.7 A.8 A.9 A.10 A.11 MỘT SỐ VẤN ĐỀ LẬP TRÌNH HƯỚNG ĐỐI TƯNG Lập trình hướng đối tượng (OOP) Các khái niệm A.2.1 Lớp (Class) A.2.2 Đối tượng (Object) A.2.3 Thuộc tính (Attribute) A.2.4 Hành vi (Method) A.2.5 Chương trình (Program) Đặc điểm lập trình hướng đối tượng Phân loại thuộc tính hành vi Các hành vi đặc biệt Khai báo lớp, đối tượng C++ A.6.1 Khai báo lớp A.6.2 Khai báo đối tượng A.6.3 Sử dụng đối tượng chương trình Kế thừa C++ A.7.1 Kế thừa hành vi tạo lập A.7.2 Kế thừa hành vi hủy bỏ A.7.3 Thực hành vi lớp sở Khai báo hành vi toán tử số học Con trỏ this Hành vi virtual Thuộc tính hành vi tónh 234 234 234 234 234 234 235 235 235 236 236 236 236 238 238 239 239 240 240 241 243 243 244 LỜI MỞ ĐẦU TÀI LIỆU THAM KHẢO Y^ ]Z Ngôn ngữ lập trình C++ biết đến ngôn ngữ lập trình mạnh nhờ khả việc triển khai phần mềm mức độ khác Từ mức hệ thống đến mức ứng dụng, từ lập trình cấu trúc đến lập trình hướng đối tượng, từ lập trình dựa thuật giải đến lập trình trí tuệ nhân tạo, từ lập trình sở liệu đến lập trình sở tri thức…, đâu, mà người lập trình muốn thể ý tưởng khoa học nghệ thuật máy tính C++ điều nghó đến trước tiên Nhưng dù ý tưởng có bay bổng bỏ qua vấn đề cài đặt mà môi trường cho ứng dụng điều phải quan tâm Với xu hướng sử dụng hệ điều hành Microsoft Windows nay, buộc phải nghó đến việc cài đặt ứng dụng môi trường khai thác cho ứng dụng hoạt động hiệu Microsoft Visual C++, sản phẩm Microsoft, với khả biên dòch ưu việt lối khai thác hệ thống rộng mở nhờ tập hợp lớp thư viện MFC cho C++ có đầy đủ tiện ích giúp vét ngõ ngách Windows hầu phục vụ cho ứng dụng Từ nhận đònh nói trên, sách thực để bạn bắt đầu làm quen lập trình Windows áp dụng kỹ thuật lập trình hướng đối tượng với C++, nhằm khai thác hiệu thư viện MFC bước du nhập vào giới tuyệt vời thông qua ứng dụng xếp theo cấp độ tiến triển phù hợp Trong lần xuất đầu tiên, sách không tránh khỏi thiếu sót Chúng mong tiếp thu ý kiến đóng góp trao đổi bạn đọc Cuối cùng, xin chân thành cảm ơn bạn bè, đồng nghiệp cung cấp nhận xét kiến thức q báu để thực sách Xin cảm ơn bạn học viên-sinh viên, người làm việc với qua nội dung có ý kiến khách quan giúp chỉnh sửa sách kòp thời Tác giả [1] Richard Simon, Windows 95 - Win32 Programming API-BIBLE, Waite Group Press 1996 [2] Jeff Prosise, Programming Windows 95 with MFC, Microsoft Press [3] M Tracy, Professional Visual C++ ISAPI Programming, Wrox Press [4] Dr GUI, Microsoft Developer Network - MSDN, Microsoft Corporation Software [5] Dino Esposito,Visual C++ Windows Shell Programming, Wrox Press YX WZ PHẦN MỀM CẦN CÀI ĐẶT: - Microsoft Visual C++ 6.0 Microsoft Visual C++ NET - MSDN ( Microsoft Developer Network ), tháng 10/2003 MÃ NGUỒN: Source Code ví dụ minh họa sách số chương trình trò chơi mà mong muốn chia xẻ bạn đọc lưu đóa mềm đính kèm, download từ đòa chỉ: http://thanh.andisw.com/?id=16&id2=85 WEB SITE: Source Code đặc sắc nhiều tác giả giới download: - http://msdn.microsoft.com - http://www.codeguru.com - http://www.codeproject.com - http://www.softechsoftware.it - http://www.flipcode.com - http://nps.vnet.ee LIÊN HỆ: - Tác giả: - Cơ quan: - Đòa e-mail: Lê Ngọc Thạnh Khoa Tin Học Quản Lý, Trường ĐHKT TP.HCM Đòa chỉ: 279 Nguyễn Tri Phương Q10, TP.HCM lntmail@yahoo.com emp@ueh.edu.vn CHƯƠNG 1: Một số khái niệm Lập trình Trong mơi trường Windows 1.1 CHƯƠNG TRÌNH (PROGRAM): Chương trình máy tính tập hợp thị điều khiển hoạt động máy, bố trí theo trình tự logic nhằm phối hợp thực cơng việc xác định Các thị thể dạng mã nguồn (source code) hay mã máy (machine code) Chương trình mã máy thực máy có lệnh tương thích, với chương trình mã nguồn phải sử dụng ứng dụng chun dụng để chuyển sang mã máy trước thực Việc chuyển thị dạng mã nguồn sang thị mã máy để thực tiến hành hai chế sau: Thơng dịch: Mỗi thị mã nguồn chuyển sang thị mã máy tương ứng thực ngay, sau tiếp tục với thị Biên dịch: Tất thị mã nguồn chuyển sang thị mã máy tướng ứng Tập hợp thị mã máy gọi chương trình mã máy Chương trình mã máy lưu lại tập tin chương trình sau ta thực chúng cách độc lập máy 1.2 ỨNG DỤNG (APPLICATION): Khi chương trình cài đặt máy tính để sử dụng, ta gọi ứng dụng, ví dụ ứng dụng NotePad, ứng dụng Microsoft Word, Trong mơi trường windows, ứng dụng thi hành nhiều lần thành nhiều khác Mỗi thực ứng dụng gọi thể (instance) ứng dụng 1.3 TIẾN TRÌNH (PROCESS): Tiến trình khái niệm instance hoạt động ứng dụng Khi ta double-click biểu tượng NotePad để chạy ứng dụng này, ta có tiến trình ứng dụng NotePad Tiểu trình giao diện (user-interface thread): Có nhiệm vụ xử lý u cầu người dùng q trình giao tác với họ Tiểu trình xử lý nội (worker thread): Có nhiệm vụ thực xử lý tính tốn bên trong, khơng trực tiếp nhận u cầu người dùng Thực ra, xem tiểu trình giao diện tiểu trình xử lý nội có tính giao tác với người sử dụng 1.5 THƠNG ÐIỆP (MESSAGE): Thơng điệp (message) giá trị phản ánh nội dung giao tiếp hay u cầu xử lý hệ thống (windows) ứng dụng, ứng dụng với thành phần ứng dụng 1.5.1 Nguồn gốc message: Cả windows ứng dụng phát sinh message Windows phát sinh message cần thơng tin cho ứng dụng hoạt động nhập-xuất (hoạt động gõ phím, di chuyển hay click chuột, người dùng), thay đổi hệ thống (font chữ, chế độ phân giải hình, màu sắc, ) biến đổi khác liên quan đến ứng dụng Ứng dụng phát sinh message xử lý điều khiển thành phần bên ứng dụng phối hợp thực chức giao tiếp với người dùng, ứng dụng thực giao tiếp với windows hay với ứng dụng khác thực hệ thống 1.5.2 Các loại message: Message định nghĩa hệ thống: Là message hệ điều hành windows tạo nhằm phục vụ hoạt động điều khiển tồn hệ thống, xử lý thơng tin vào-ra thơng tin khác cho ứng dụng Khi có nhu cầu, ứng dụng sử dụng message để phát động chức điều khiển windows Message định nghĩa người dùng: Là message người viết ứng dụng định nghĩa nhằm tạo kênh liên lạc đặc thù thành phần ứng dụng, ứng dụng với windows với ứng dụng khác thực hệ thống 1.4 TIỂU TRÌNH (THREAD): Tiểu trình nhánh xử lý độc lập tiến trình Khi ứng dụng thực ta có thêm tiến trình Do chất chương trình làm nên ứng dụng bao gồm chương trình (main hay WinMain) chương trình mà tiến trình ứng với tách thành nhánh xử lý: nhánh xử lý (primary thread), nhánh xử lý phụ (other threads) Các nhánh xử lý gọi tiểu trình Có hai loại tiểu trình: Một số khái niệm lập trình môi trường Windows Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com 1.5.3 Số hiệu message (Message Indentifier - MessageID): Có nhiều message khác sử dụng mơi trường windows Ứng với message xác định, windows sử dụng giá trị ngun khơng âm để đặc tả, giá trị gọi số hiệu message Các message windows định nghĩa có số hiệu khai báo sẵn với số xác định tên gọi gợi nhớ chúng có dạng WM_xxx Các messges người dùng định nghĩa phải đăng ký số hiệu Số hiệu đăng ký khơng trùng lặp có giá trị nhỏ WM_USER (một số windows định nghĩa) Số hiệu message sở để phân biệt message lẫn 1.5.4 Ðặc tả message: Ðể đối tượng nhận message có thêm thơng tin hồn cảnh phát sinh ý nghĩa cụ thể message, windows cho phép message nhận thơng qua cấu trúc chứa số hiệu message thơng số kèm theo Cấu trúc khai báo thành kiểu MSG với nội dung sau: typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG; // Giá trị có kích thước bytes (long) // Số hiệu message // Giá trị khơng âm có kích thước bytes // Giá trị khơng âm có kích thước bytes // Thời điểm sinh messsge // Tọa độ cursor message gửi Trường hwnd (window handle) cấu trúc chứa thẻ (handle) quản lý cửa sổ giao diện liên quan đến message wParam lParam hai tham số gửi kèm theo message làm nhiệm vụ chứa thơng tin bổ sung Hai tham số dùng message có nhiều ý nghĩa thực tế khác ) Windows sử dụng giá trị có kích thước bytes để quản lý đối tượng Giá trị gọi thẻ quản lý đối tượng (object handle) Ứng với loại đối tượng cụ thể, windows sử dụng kiểu handle riêng HWND kiểu handle dùng quản lý đối tượng cửa sổ giao diện windows 1.6 CỬA SỔ GIAO DIỆN (WINDOW) CỦA ỨNG DỤNG: Cửa sổ giao diện thành phần quan trọng việc tạo mơi trường giao diện đồ họa ứng dụng windows Cùng với phát triển hệ điều hành windows, hình ảnh cửa sổ giao diện thay đổi theo với chiều hướng sinh động hình thức phong phú chức Ðiều khơng góp phần tăng tính thẩm mỹ mà Một số khái niệm lập trình môi trường Windows tạo gần gũi giao diện ứng dụng windows với người dùng Dạng thơng thường cửa sổ giao diện windows: System Menu Box: Chứa biểu tượng ứng dụng, nút mở hộp menu hệ thống với mục di chuyển, thay đổi kích thước đóng cửa sổ Caption bar: Thanh tiêu đề ứng dụng Menu bar: Hệ thống menu với mục lựa chọn xử lý Minimize / Maximize Box : Nút điều khiển thu nhỏ / phóng to cửa sổ Restore Box : Nút khơi phục kích thước trước cửa số Border: Ðường viền bao quanh cửa sổ Client area: Vùng làm việc cửa sổ, dùng để hiển thị thơng tin Scroll bar: Thanh cuộn nội dung vùng làm việc cửa sổ Window Procedure: Ngồi giao diện đồ họa, cửa sổ windows có khả tiếp nhận xử lý message Khả thực thơng qua hàm xử lý message mà ta gắn cho cửa sổ Hàm xử lý có khai báo sau: LRESULT CALLBACK WindowProc ( HWND hwnd, // Tham số chứa Handle cửa sổ liên quan UINT uMsg, // Tham số chứa số hiệu message WPARAM wParam, // Tham số bổ sung thứ kiểu WORD LPARAM lParam // Tham số bổ sung thứ hai kiểu LONG ) ; Hàm trả giá trị có kích thước 32 bits Khi u cầu xử lý chuyển đến cửa sổ dạng message, hàm WindowProc gắn với cửa sổ số hiệu message (uMsg) để chọn xử lý phù hợp Theo ngun tắc, message xử lý hồn tất hàm trả giá trị 0, ngược lại (message khơng thuộc Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com khả xử lý cửa sổ) hàm phải chuyển message cho windows xử lý thơng qua lời gọi hàm xử lý message windows Hàm xử lý có tên gọi DefWindowProc với khai báo sau: LRESULT DefWindowProc( // Default Window Procedure HWND hWnd, // Với tham số có ý nghĩa UINT Msg, WPARAM wParam, LPARAM lParam ); Khi đó, kết trả DefWindowProc dùng làm kết hàm WindowProc Qui tắc nói cần phải đảm bảo, khơng, ứng dụng làm rối loạn hoạt động hệ điều hành windows 1.7 MESSAGE QUEUE: Message queue danh sách thứ tự message windows tạo dùng để chứa message chờ xử lý Message queue hoạt động theo ngun tắc FIFO (First-In, First-Out: vào trước, trước) Có hai loại message queue windows: Message queue hệ thống (system queue): Ðược windows dùng riêng cho việc lưu trữ messge đặc tả thơng tin nhập-xuất liên quan đến thiết bị phần cứng q trình hệ thống giao tác với người dùng Message queue ứng dụng (application queue): Ðược windows tạo cấp cho thể ứng dụng Windows tự động điều phối message từ system queue sang application queue cách phù hợp, nhờ ứng dụng tiếp nhận thực u cầu xử lý người dùng thơng qua hệ thống Cơ chế ngăn ứng dụng windows quyền truy cập trực tiếp thiết bị phần cứng máy tính Việc truy cập message queue ứng dụng thực với hỗ trợ hàm liên quan windows cung cấp sau: Chờ lấy message từ message queue ứng dụng: BOOL GetMessage ( LPMSG lpMsg, // Con trỏ đến biến MSG nhận thơng tin // Handle cửa sổ liên quan HWND hWnd, wMsgFilterMin, // Số hiệu message nhỏ nhận UINT UINT wMsgFilterMax // Số hiệu message lớn nhận ); Hàm tự động chờ đến phát có message cần xử lý message queue Khi đó, message vào trước lấy khỏi hàng chờ thơng tin điền vào biến kiểu MSG Một số khái niệm lập trình môi trường Windows trỏ tham số plMSG Khi lấy message, hàm kết thúc trả giá trị ngun Nếu message nhận message kết thúc ứng dụng (số hiệu WM_QUIT) hàm trả giá trị Ngược lại, hàm trả giá trị khác Kiểm tra lấy message message queue ứng dụng: BOOL PeekMessage( // Như GetMessage LPMSG lpMsg; HWND hWnd; wMsgFilterMin; UINT wMsgFilterMax; UINT UINT wRemoveMsg; // Có thực xóa message khơng ? // PM_NOREMOVE: khơng xóa ); Hàm trả giá trị message queue rỗng Ngược lại, hàm trả giá trị khác khơng thơng tin message điền vào biến kiểu MSG tham số kiểu trỏ lpMSG Diễn dịch message bàn phím sang mã phím ASCII: BOOL TranslateMessage( // trỏ đến biến chứa message CONST MSG *lpMsg; ); Tham số lpMsg trỏ đến biến kiểu MSG chứa nội dung đặc tả message lấy từ message queue cần diễn dịch Hàm trả giá trị khác message nhận tương ứng với thao tác bàn phím (nhấn phím: WM_KEYDOWN, WM_SYSKEYDOWN; thơi nhấn phím: WM_KEYUP, WM_SYSKEYUP) message có ý nghĩa tương đương mà việc diễn dịch sang mã phím ASCII thành cơng Khi hàm tự động tạo message WM_CHAR cho phím diễn dịch Trong trường hợp khác, hàm trả giá trị Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com Kiến trúc xử lý chung ứng dụng mơi trường windows Ðiều phối message đến cửa sổ giao diện chính: Cửa sổ giao diện ứng dụng tiếp nhận xử lý message thơng qua hàm WindowProc (1.6) Như vậy, ta điều phối message lấy từ message queue ứng dụng đến cho cửa sổ xử lý Việc điều phối thực thơng qua hàm sau: LRESULT DispatchMessage( // Con trỏ đến biến chứa message CONST MSG *lpmsg; ); Tham số lpMSG đến biến kiểu MSG chứa thơng tin đặc tả message điều phối Hàm điều phối chờ đến hàm xử lý message WindowProc cửa sổ xử lý xong messge, lấy giá trị kết thúc hàm làm giá trị trả ) Q trình tiếp nhận điều phối xử lý message từ message queue ứng dụng tiến hành liên tục nhận message kết thúc ứng dụng (WM_QUIT) Q trình có tên gọi vòng lặp nhận điều phối message (MessageLoop) Ðoạn chương trình nhận điều phối message ứng dụng cài đặt sau: MSG msg; // biến chứa nội dung đặc tả message nhận while( GetMessage( &msg, NULL, 0, ) != ) { // Nếu message nhận khơng phải WM_QUIT TranslateMessage(&msg); // Diễn dịch phím DispatchMessage(&msg); // Ðiều phối cho cửa sổ } 1.8 KIẾN TRÚC XỬ LÝ CỦA ỨNG DỤNG TRONG WINDOWS: Khi ứng dụng thực hiện, windows tạo thêm tiến trình cho thể ứng dụng, đồng thời xây dựng message queue dùng riêng cho thể Tiểu trình tiến trình tạo có nhiệm vụ thực MessageLoop message queue dành cho ứng dụng, đồng thời khởi tạo giao diện tiểu trình hỗ trợ (nếu cần) Các cách xử lý tiểu trình nắm quyền điều khiển ứng dụng: Khơng thực xử lý cả: Ứng dụng kết thúc Thực MessageLoop khơng tạo cửa sổ giao diện chính: Ứng dụng chờ nhận message người dùng khơng giao tác Khởi tạo cửa sổ với hàm xử lý message WindowProc chọn cửa sổ làm cửa sổ giao diện chính: Hàm WindowProc cửa sổ tiếp nhận xử lý message điều phối từ MessageLoop tiểu trình Người dùng giao tác kết thúc ứng dụng Như mục thứ ba, đồng thời tạo tiểu trình phục vụ: Ứng dụng có khả tiếp nhận thực đồng thời nhiều u cầu xử lý 1.9 RESOURCE CỦA ỨNG DỤNG: Ðối với chương trình windows, ngồi phần mã lệnh hàm xử lý, resource thành phần khơng phần quan trọng chứa nội dung hỗ trợ cho việc trang trí phục vụ cho mục đích đặc biệt ứng dụng Các nội dung phổ biến resource sau: Cursor: Ảnh nhỏ đặc tả vị trí làm việc thiết bị liên quan mouse, pen, trackball Khi người dùng tác động lên thiết bị windows sử dụng cursor để phản ánh tượng Bitmap: Tập ảnh điểm (pixels) ảnh Các ảnh điểm bố trí theo dòng phối hợp làm nên hình ảnh đối tượng Dialog: Thơng tin mơ tả khung giao diện với đối tượng nhập liệu bên trong, sở để tạo hộp hội thoại ứng dụng Icon : Ảnh nhỏ dùng để đặc tả chức đối tượng, ứng dụng hay nội dung liệu HTML (Hypertext Markup Language): Ngơn ngữ dùng tạo tài liệu dạng văn với ký pháp kỹ thuật định dạng mà trình duyệt tương ứng thể cách xúc tích Một số khái niệm lập trình môi trường Windows Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com Menu : Một danh sách lựa chọn xử lý mà người dùng chọn nhằm thực xử lý xác định String Table: Bảng chứa chuỗi đánh dấu phân biệt số hiệu sử dụng thơng báo chương trình Việc sử dụng String Table giúp ứng dụng dễ dàng thay đổi ngơn ngữ giao diện mà khơng cần phải có chỉnh sửa phần mã lệnh ToolbarBitmap: Tập ảnh xác định nút cài đặt cơng cụ cửa sổ hay hộp hội thoại ứng dụng Mỗi nút mục chọn (có thể thay mục chọn menu) giúp tạo message lệnh (WM_COMMAND) với số hiệu phân biệt để ấn định xử lý cần thiết Version: Phần khai báo thơng tin liên quan đến ứng dụng, tác giả Font: Chứa thơng tin font chữ lưu tập tin fnt Custom Resource: Bao gồm nội dung khơng thuộc loại nội dung resource chuẩn nói Người dùng tùy ý cài vào resource ứng dụng, đồng thời phải tự cài đặt xử lý thích hợp cho resource chương trình Một số khái niệm lập trình môi trường Windows chia hệ mạng thành 256 subnet dựa byte thứ ba, ta subnet 8-bit đòa lớp B: ) Các subnet tạo thành là: 139.12.1.0, 139.12.2.0 139.12.3.0 13.1.5 Subnet Mask: Subnet mask giá trò 32 bits giúp tách giá trò đòa mạng (hoặc đòa subnet) đòa host từ đòa IP (trong lớp đòa bất kỳ, cách phân chia subnet bất kỳ) Giá trò xây dựng sau: - Các giá trò bit tương ứng với đòa mạng có giá trò - Các giá trò bit tương ứng với đòa host có giá trò Giá trò subnet mask biểu diễn dạng num-dot Ta có subnet mask cho lớp đòa sau: Class Bits for Subnet Mask Subnet Mask Class A 11111111 00000000 00000000 00000000 255.0.0.0 Class B 11111111 11111111 00000000 00000000 255.255.0.0 Class C 11111111 11111111 11111111 00000000 255.255.255.0 Các giá trò subnet mask người dùng tạo tương ứng với lớp đòa khác biệt so với giá trò chúng chứa giá trò mask đòa subnet Ví dụ: 138.96.58.0 đòa subnet 8-bit lớp B bits đòa host hệ mạng ban đầu dùng làm giá trò đòa subnet Như subnet mask sử dụng tổng cộng 24 bits (255.255.255.0) để đònh nghóa đòa mạng subnet Đòa mạng subnet giá trò subnet mask tương ứng biểu diễn theo dạng num-dot sau: 138.96.58.0, 255.255.255.0 Hay: 138.96.58.0/24 (24-bit mask) MFC với Internet 191 Xác đònh đòa mạng: Để tách đòa mạng từ đòa IP thông qua giá trò subnet mask, ta sử sử dụng phép toán AND bits: Ví dụ: Giả sử IP = 129.56.189.41 vàsubnet mask = 255.255.240.0 Đòa mạng xác đònh sau: IP Address : 10000001 00111000 10111101 00101001 Subnet Mask : 11111111 11111111 11110000 00000000 Network ID : 10000001 00111000 10110000 00000000 Xác đònh giới hạn đòa IP: Giả sử đòa mạng 192.168.0.0 Với subnet 3-bit đòa lớp B hệ mạng nói trên, ta có trường hợp lựa chọn giá trò cho bits Tương ứng với trường hợp giới hạn đòa IP host subnet: Stt Đòa Subnet theo hệ nhò phân Giới hạn đòa IP 11000000.10101000.00000000.00000001192.168.0.1 11000000.10101000.00011111.11111110 192.168.31.254 11000000.10101000.00100000.00000001192.168.32.1 11000000.10101000.00111111.11111110 192.168.63.254 11000000.10101000.01000000.00000001192.168.64.1 11000000.10101000.01011111.11111110 192.168.95.254 11000000.10101000.01100000.00000001192.168.96.1 11000000.10101000.01111111.11111110 192.168.127.254 11000000.10101000.10000000.00000001192.168.128.1 11000000.10101000.10011111.11111110 192.168.159.254 11000000.10101000.10100000.00000001192.168.160.1 11000000.10101000.10111111.11111110 192.168.191.254 11000000.10101000.11000000.00000001192.168.192.1 11000000.10101000.11011111.11111110 192.168.223.254 11000000.10101000.11100000.00000001192.168.224.1 11000000.10101000.11111111.11111110 192.168.255.254 13.1.6 Host domain name: Tên (name) giải pháp hữu hiệu cho việc gợi nhớ đòa host thay dùng đòa IP với bytes giá trò khó nhớ nói Tên host (Host name) chuỗi ký tự có chiều dài tối đa 255, chứa mẫu tự, ký số, ký tự ‘-‘ ‘.’ có ý nghóa tương đương với đòa IP việc quản lý đòa host hệ thống mạng internet Có hai dạng phổ biến cho tên host nick name domain name: 192 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com - Nick name: Một nhãn dùng cho đòa IP - Domain name: Tên hình thành từ cấu trúc phân lớp Cấu trúc phân lớp qui đònh phổ biến thành luật gọi hệ thống tên miền (Domain Name System – DNS) sau: Trong đó: Tên Domain Ý nghóa sử dụng COM Các tổ chức thương mại EDU Các quan giáo dục, nghiên cứu GOV Tổ chức phủ MIL Cơ quan quân NET quan quản lý mạng ORG Các tổ chức khác INT Các tổ chức quốc tế Các nhánh cho quốc gia trừ Hoa Kỳ Một tên miền đầy đủ (Fully Qualified Domain Name – FQDN) chứa đường từ gốc đến đối tượng tham chiếu theo trình tự phân cấp nói Ví dụ: ftpsrv.wcoast.slate.com Việc chuyển đổi đòa IP Domain name thực dựa bảng chuyển đổi IP-DomainName DNS server, host chuyên dụng hệ thống mạng, quản lý Ứng dụng từ host truy vấn bảng thông tin thông qua dòch vụ cung cấp windows socket Windows socket truyền yêu cầu ứng dụng đến phận phân giải domain name giao thức truyền thông TCP/IP Bộ phận chuyển yêu cầu đến DNS server DNS server nhận yêu cầu thực hiện; MFC với Internet 193 thông tin yêu cầu không xác đònh chuyển đến DNS server cấp khác, kết thực không thực được trả theo lộ trình ngược lại 13.1.7 IP Routing: IP routing tiến trình xử lý gửi packet đến host nhận dựa đòa IP host Tiến trình xảy host gửi thông tin theo giao thức TCP/IP thiết bò đònh tuyến (router device) nhằm thực đònh lựa chọn vò trí mà packet chuyển đến Để thực đònh trên, tầng IP tham khảo bảng đònh tuyến lưu trữ nhớ Nội dung bảng đònh tuyến khởi tạo TCP/IP vừa khởi động Các mục bổ sung thực người quản trò hệ thống mạng (WinNT router table) thực cách tự động trình liên lạc với đònh tuyến Có hai dạng phổ biến gửi packet; gửi trực tiếp gửi gián tiếp Gửi trực tiếp (Direct delivery): Xảy host nhận host gửi kết nối trực tiếp Thông tin đóng gói host gửi theo cấu trúc qui đònh tầng giao tiếp mạng gửi Gửi gián tiếp (Indirect delivery): Xảy host nhận host gửi kết nối thông qua trung gian (bộ đònh tuyến) Khi có trình gửi gián tiếp từ host đến đònh tuyến, từ đònh tuyến trực tiếp đến host nhận (hoặc gián tiếp đến đònh tuyến khác) 194 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com - Interface: - Metric: Thiết bò giao tiếp mạng sử dụng Chi phí tuyến truyền, làm sở cho việc lựa chọn tuyến tối ưu Thông tin mục bảng đònh tuyến qui đònh đặc điểm tuyến: - Tuyến kết nối trực tiếp với hệ thống mạng: Giá trò Next Hop rỗng chứa đòa IP thiết bò giao tiếp mạng - Tuyến kết nối trung gian với hệ thống mạng: Giá trò Next Hop chứa đòa IP đònh tuyến trung gian host gửi host nhận - Tuyến kết nối trực tiếp với host cụ thể: Khi Network ID chứa đòa host giá trò subnet mask 255.255.255.255 - Tuyến mặc nhiên: Tuyến sử dụng có tác vụ đònh tuyến không thành công Giá trò network ID 0.0.0.0 subnet mask 0.0.0.0 A gửi trực tiếp đến B A gửi gián tiếp packet đến router1 , router gửi gián tiếp đến router 2, router gửi trực tiếp đến C Bảng đònh tuyến: Bảng đònh tuyến xác lập tất host (node, router) đặt giá trò trình khởi động giao thức TCP/IP Nội dung bảng chứa thông tin hệ thống đòa IP mạng, cách kết nối với đòa Mỗi gói thông tin gửi đi, bảng đònh tuyến sử dụng để xác đònh: - Đòa host nơi gửi đến: Nếu gửi trực tiếp đòa host nhận packet, ngược lại, đòa đònh tuyến - Giao diện sử dụng để gửi: Bao gồm thông tin cấu trúc vật lý logic thiết bò kết nối mạng nơi gửi nơi nhận Cấu trúc nội dung mục bảng đònh tuyến: [ Network ID, Subnet Mask, Next Hop, Interface, Metric ] Trong đó: - Network ID: Đòa mạng tương ứng với tuyến truyền tin - Subnet Mask: Giá trò dùng tách đòa mạng từ đòa IP - Next Hop: Đòa IP host trung gian MFC với Internet 195 Network Address 0.0.0.0 127.0.0.0 157.55.16.1 127.0.0.1 Address Interface 157.55.27.90 127.0.0.1 0.0.0.0 255.0.0.0 1 157.55.16.0 255.255.240.0 157.55.27.90 157.55.27.90 157.55.27.90 157.55.255.255 224.0.0.0 255.255.255.255 255.255.255.255 255.255.255.255 224.0.0.0 255.255.255.255 127.0.0.1 157.55.27.90 157.55.27.90 157.55.27.90 127.0.0.1 157.55.27.90 157.55.27.90 157.55.27.90 1 1 Netmask Gateway Metric Purpose Default Route Loopback Network DirectyAttached Network Local Host Network Broadcast Multicast Address Limited Broadcast ( Một bảng đònh tuyến Windows NT ) Xử lý đònh tuyến: Xử lý đònh tuyến xử lý thực lựa chọn mục đònh tuyến bảng đònh tuyến dùng cho việc gửi thông tin Việc lựa chọn thực thông qua bước sau: - Trên mục đònh tuyến, thực phép toán AND đòa host nhận giá trò subnet mask Kiểm tra kết với Network ID để đánh giá độ phù hợp (độ tương tự) - Chọn mục đònh tuyến có mức độ phù hợp cao Trong mục đònh tuyến này, chọn mục có chi phí tuyến truyền nhỏ Cuối cùng, từ mục đònh tuyến chọn được, mục đònh tuyến sử dụng mục rỗi ) Xử lý đònh tuyến khác loại host khác nhau: 196 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com Host gửi: Packet gửi từ giao thức tầng cấp cao IP (TCP, Socket điểm truyền thông đầu cuối cho phép ứng dụng gửi nhận packet qua đường truyền mạng Mỗi socket có kiểu xác đònh gắn liền với tiến trình xử lý truyền thông Có hai loại socket: Cơ chế truyền liệu theo dòng Stream Socket: Datagram Socket: Cơ chế truyền liệu theo packet ) Đòa socket giá trò bao gồm đòa host số hiệu port mà tiến trình xử lý truyền thông liên quan socket đăng ký sử dụng Host đònh tuyến: Vai trò IP sau: 13.2.3 Một số cấu trúc liệu Winsock API: Đòa num-dot host: Được biểu diễn giá trò chuỗi có nội dung bốn giá trò số có độ lớn byte ngăn cách dấu ‘.’ Ví dụ: "127.0.0.1" Cấu trúc khởi động winsock : UDP, ) Khi vai trò IP host gửi sau: - Đặt giá trò cho trường TTL (Times-To-Live) theo giá trò qui đònh ứng dụng tầng cấp cao lấy giá trò hệ thống - Xác đònh tuyến tối ưu cho packet truyền - Nếu không xác đònh tuyến truyền thông báo lỗi đến tầng truyền thông cấp cao Ngược lại, thực truyền theo tuyến - Kiểm tra checksum packet Nếu sai hủy packet - Kiểm tra đòa IP host nhận packet Nếu đòa đòa đònh tuyến nội dung packet (trừ phần nội dung IP header) chuyển cho giao thức tầng cấp cao tương ứng Ngược lại, giảm giá trò trường TTL 1; giá trò trường hủy bỏ packet gửi thông điệp "ICMP Time Expired-TTL Expired" cho host gửi, ngược lại xác đònh tuyến gửi gửi packet Host nhận: Vai trò IP sau: - Kiểm tra checksum packet Nếu sai hủy packet - Nếu đòa host nhận ghi packet đòa host xử lý hủy packet - Gửi nội dung packet (trừ IP header) lên giao thức tầng cao 13.2 LẬP TRÌNH TCP/IP VỚI WINSOCK: Winsock (Windows Socket) có xuất xứ từ BSD (Berkeley Software Distribution - UNIX), tương thích với windows qua phiên WinSock1.1 Winsock giao diện với dòch vụ xây dựng giao thức truyền thông TCP UDP Thông qua winsock, ứng dụng triển khai dễ dàng tác vụ truyền thông tầng truyền thông mô hình mạng 13.2.1 Port: Port khái niệm diễn tả giá trò số (số hiệu port) giúp phân biệt tiến trình host đồng sử dụng giao thức TCP/IP Các ứng dụng khác sử dụng TCP/IP thực lúc host với điều kiện chúng phải sử dụng số hiệu port khác 13.2.2 Socket: MFC với Internet 197 typedef struct WSAData { WORD wVersion; WORD wHighVersion; char szDescription[WSADESCRIPTION_LEN+1]; char szSystemStatus[WSASYS_STATUS_LEN+1]; unsigned short iMaxSockets; unsigned short iMaxUdpDg; char FAR * lpVendorInfo; } WSADATA, *LPWSADATA; szDescription: Thông tin phiên winsock sử dụng szSystemStatus: Thông tin phiên hệ điều hành windows Cấu trúc chứa thông tin host : struct hostent { char FAR * h_name; // Domain name char FAR * FAR * h_aliases; // Tên dùng thay domain name short h_addrtype; // Kiểu đòa chỉ, với TCP/IP AF_INET short h_length; // Kích thước đòa chỉ, bytes cho AF_INET char FAR * FAR * h_addr_list; // Danh sách đòa Phần tử // đầu danh sách h_addr_list[0] // (hay h_addr) đòa host } HOSTENT, *PHOSTENT; Đòa socket host: struct sockaddr { 198 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com unsigned short sa_family; // Họ đòa host char sa_data[14]; // Đòa (cho phép nhiều loại đòa chỉ) } SOCKADDR ; Cấu trúc tương thích SOCKADDR_IN MicroSoft: struct sockaddr_in { short sin_family; unsigned short sin_port; struct in_addr sin_addr; char sin_zero[8]; } SOCKADDR_IN ; // Có giá trò AF_INET // Số hiệu port // Đòa IP bytes host // Chỉ để tương thích với SOCKADDR 13.3 MFC VỚI LẬP TRÌNH WINSOCK: Thư viện sử dụng: AfxSock.h 13.3.1 Khởi động Winsock: BOOL AfxSocketInit ( WSADATA* lpwsaData = NULL ); ) AfxSocketInit đảm nhận việc thực WSAStartup bắt đầu ứng dụng WSACleanup ứng dụng kết thúc Lời gọi AfxSocketInit thực hành vi InitInstance đối tượng quản lý tiểu trình ứng dụng Tham số truyền cho hàm có ý nghóa với WSAStartup sin_addr : Đòa IP bytes host, có cách diễn tả sau: struct in_addr { union { struct { unsigned char s_b1, s_b2, s_b3, s_b4; } S_un_b; // Đòa IP bytes struct { unsigned short s_w1, s_w2; } S_un_w; // Đòa IP words unsigned long S_addr; // Đòa IP long } S_un; }; 13.2.4 Một số dòch vụ Winsock API: char FAR * inet_ntoa ( // Đòa IP bytes struct in_addr in ); Trả chuỗi đòa num-dot tương ứng unsigned long inet_addr ( // Đòa IP num-dot const char FAR *cp ); Hàm trả giá trò kiểu long đòa IP bytes tương ứng int WSAStartup ( // Hàm trả giá trò thành công WORD version, // Phiên winsock LPWSADATA pMyInfo // Con trỏ cấu trúc nhận thông tin ); Khởi động, chuẩn bò cho việc khai thác dòch vụ winsock version: Chứa số hiệu phiên winsock cần dùng - High-order byte = winsock minor version number MFC với Internet - Low-order byte = winsock major version number - Ví dụ: MAKEWORD (1, ) Ỉ Winsock version 1.1 int gethostname ( // Hàm trả SOCKET_ERROR có lỗi char FAR *name, // Vùng đệm chứa thông tin int namelen // Kích thước vùng đệm ); Lấy thông tin tên host PHOSTENT gethostbyname ( const char FAR *name // Tham số chứa tên host ); Hàm trả trỏ đến cấu trúc HOSTENT chứa thông tin host int WSACleanup( ); Chấm dứt sử dụng dòch vụ winsock 199 13.3.2 Lớp CAsyncSocket: CAsyncSocket lớp đối tượng quản lý socket Bằng bao hàm dòch vụ winsock API hành vi, lớp CAsyncSocket cho phép tạo đối tượng socket hỗ trợ ứng dụng cách hiệu việc triển khai hoạt động truyền thông tầng truyền tải giao thức TCP/IP Các hành vi đặc trưng lớp CAsyncSocket sau: CAsyncSocket( ); Khởi tạo đối tượng socket rỗng BOOL Create ( nSocketPort = 0, UINT nSocketType = SOCK_STREAM, int long lEvent = FD_READ | FD_WRITE | FD_OOB | FD_ACCEPT | FD_CONNECT | FD_CLOSE, LPCTSTR lpszSocketAddress = NULL ); Khởi tạo thông số đối tượng socket kết với host đối tác (nếu có) Trong đó: - nSocketPort : Số hiệu port socket Giá trò xác đònh người dùng (ví dụ 2050) đặt để winsock tìm giúp giá trò phù hợp 200 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com - Hộp nhập số hiệu mail nhận : Edit IDC_MAIL_NO : Edit IDC_MAIL - Hộp hiển thò nội dung mail - Nút lệnh lấy thông tin mail : Button IDOK - Nút lệnh thực nhận mail : Button IDC_READ_MAIL - Hành vi OnOK ứng với nút OK thực lấy thông tin hộp mail: void CPOP3Dlg::OnOK() { char s[1025]; UINT port; CSocket m_sock; GetDlgItemText (IDC_SERVER_IP, s, 1024); port = GetDlgItemInt(IDC_SERVER_PORT); m_sock.Create(); if (!m_sock.Connect(s, port)) return; if ( !m_sock.Receive(s, 1024) || !isOK(s) ) return; strcpy(s, "USER "); // Đăng nhập GetDlgItemText(IDC_USER_NAME, s + strlen(s), 1024); strcat(s, "\r\n"); m_sock.Send(&s, strlen(s)); if ( !m_sock.Receive(s, 1024) || !isOK(s) ) return; - Hành vi protected : isOK kiểm tra trả lời mail server liệu nhận sau tác vụ liên lạc: BOOL CPOP3Dlg::isOK(char *result) { return ( result[0] == '+' && result[1] == 'O' && result[2] == 'K' ); // +OK : Thành công } - Hành vi OnReadMail (nút chọn IDC_READ_MAIL) tải mail về: void CPOP3Dlg::OnReadMail() { char s[10241]; UINT port; CSocket m_sock; GetDlgItemText(IDC_SERVER_IP, s, 1024); port = GetDlgItemInt(IDC_SERVER_PORT); m_sock.Create(); if (!m_sock.Connect(s, port)) return; if ( !m_sock.Receive(s, 1024) || !isOK(s) ) return; strcpy(s, "USER "); // Đăng nhập GetDlgItemText(IDC_USER_NAME, s + strlen(s), 1024); strcat(s, "\r\n"); m_sock.Send(&s, strlen(s)); if ( !m_sock.Receive(s, 1024) || !isOK(s) ) return; strcpy(s, "PASS "); // Đăng ký password GetDlgItemText(IDC_USER_PASSWORD, s+strlen(s), 1024); strcat(s, "\r\n"); m_sock.Send(&s, strlen(s)); if ( !m_sock.Receive(s, 1024) || !isOK(s) ) return; strcpy(s, "PASS "); // Hợp lệ ? GetDlgItemText(IDC_USER_PASSWORD, s+strlen(s), 1024); strcat(s, "\r\n"); m_sock.Send(&s, strlen(s)); if ( !m_sock.Receive(s, 1024) || !isOK(s) ) return; strcpy(s, "LIST\r\n"); // Lấy thông tin hộp mail m_sock.Send(&s, strlen(s)); if ( (port = m_sock.Receive(s, 1024)) < || !isOK(s) ) return; s[port] = '\0'; SetDlgItemText(IDC_MAIL, s+4); // Bỏ qua +OK strcpy(s, "RETR "); // Tải mail GetDlgItemText (IDC_MAIL_NO, s + strlen(s), 1024); strcat(s, "\r\n"); m_sock.Send(&s, strlen(s)); if ( (port = m_sock.Receive(s, 10240)) == || !isOK(s) ) return; s[port] = '\0'; SetDlgItemText(IDC_MAIL, strstr(s, "From")); // Kết thúc strcpy(s, "QUIT\r\n"); m_sock.Send(&s, strlen(s)); m_sock.Close(); strcpy(s, "QUIT\r\n"); // Kết thúc m_sock.Send(&s, strlen(s)); m_sock.Close(); } } MFC với Internet 221 222 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com pstrProxyName : pstrProxyBypass : 13.8 TCP VỚI HTTP & FTP: HTTP FTP giao thức tầng ứng dụng xây dựng dựa giao thức TCP tầng truyền tải (mô hình DARPA) ¾ HTTP: Giao thức phục vụ mô hình ứng dụng Client/Server, dùng phổ biến việc truyền tải nội dung HTML (www) client server Trong ứng dụng client kết nối với ứng dụng server thông qua cổng TCP xác đònh, thông thường 80 ¾ FTP: Giao thức truyền tải tập tin Ứng dụng client kết nối với ứng dụng server thông qua hai cổng TCP; dùng điều khiển truyền, dùng truyền liệu; thông thường 20 21 ) MFC hỗ trợ mạnh cho việc khai thác giao thức nói thông qua lớp đối tượng thư viện AfxInet.h 13.8.1 CInternetSession: CInternetSession lớp đối tượng quản lý giao tác xác đònh với mạng internet, kể việc thực kết nối với proxy server Mỗi giao tác internet cho phép thực tác vụ liên quan đến tập tin internet server thông qua dòch vụ đặc biệt FTP, HTTP CInternetSession ( LPCTSTR pstrAgent = NULL, DWORD dwContext = 1, DWORD dwAccessType = INTERNET_OPEN_TYPE_PRECONFIG, LPCTSTR pstrProxyName = NULL, LPCTSTR pstrProxyBypass = NULL, DWORD dwFlags = ); Hành vi tạo lập khởi tạo thông số cho đối tượng giao tác internet pstrAgent : Tên ứng dụng Một số ứng dụng dùng tên làm giá trò nhận diện server dwContext : Số hiệu nhận diện diễn tiến tác vụ dwAccessType : Kiểu truy xuất INTERNET_OPEN_TYPE_PRECONFIG : Theo ấn đònh hệ thống INTERNET_OPEN_TYPE_DIRECT : Trực tiếp không thông qua proxy INTERNET_OPEN_TYPE_PROXY : Thông qua proxy 13.8.2 CInternetFile: CInternetFile lớp đối tượng quản lý tập tin mạng internet CInternetFile( ); Tạo lập đối tượng quản lý tập tin virtual LONG Seek ( // Cự ly dời tương đối LONG lOffset, // Vò trí làm mốc UINT nFrom ); Ấn đònh vò trí trỏ (đầu đọc/ghi liệu) tập tin Các giá trò dùng cho nFrom là: - CFile::current : Tính từ vò trí hành trỏ tập tin MFC với Internet 224 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com 223 Proxy Sử dụng cho truy xuất thông qua proxy Danh sách đòa server truy xuất trực tiếp (dùng cho ấn đònh truy xuất qua proxy) dwFlags : Thông số chế độ tối ưu truy xuất server INTERNET_FLAG_DONT_CACHE : Không sử dụng cache tất host liên quan đến tác vụ tập tin giao tác INTERNET_FLAG_OFFLINE : Sử dụng cache cho tác vụ tập tin CFtpConnection* GetFtpConnection ( LPCTSTR pstrServer, // Đòa FTP server // Tên đăng nhập LPCTSTR pstrUserName = NULL, LPCTSTR pstrPassword = NULL, // password hợp lệ /* số hiệu port kết nối */ INTERNET_PORT nPort = INTERNET_INVALID_PORT_NUMBER, // Cơ chế kết nối BOOL bPassive = FALSE ); Trả trỏ đối tượng quản lý liên kết với FTP server bPassive : Qui đònh chế chọn port cho kết nối - TRUE : Do người dùng chọn - FALSE: Do FTP Server chọn (là chế mặc nhiên) CHttpConnection* GetHttpConnection ( LPCTSTR pstrServer, // Đòa HTTP server INTERNET_PORT nPort = /* số hiệu port */ INTERNET_INVALID_PORT_NUMBER, LPCTSTR pstrUserName = NULL, // Tên đăng nhập // password hợp lệ LPCTSTR pstrPassword = NULL ); Trả trỏ đối tượng quản lý liên kết với HTTP server - CFile::begin : Tính từ đầu tập tin - CFile::end : Tính từ cuối tập tin virtual UINT Read ( // Đòa vùng đệm chứa liệu đọc void* lpBuf, UINT nCount // Kích thước liệu đọc vào ); Đọc liệu từ tập tin virtual void Write ( const void* lpBuf, // Đòa vùng đệm chứa liệu ghi UINT nCount // Kích thước liệu ghi ); Ghi liệu tập tin virtual BOOL ReadString ( CString& rString // Biến chứa chuỗi đọc vào ); Đọc chuỗi từ tập tin virtual void WriteString ( // Biến chứa chuỗi ghi LPCTSTR pstr ); Ghi chuỗi tập tin virtual void Close( ); Đóng tập tin, chấm dứt tác vụ liên quan 13.8.3 CFtpConnection: CFtpConnection lớp đối tượng quản lý liên kết với FTP server Đối tượng nhận từ đối tượng quản lý giao tác với mạng internet thông qua hành vi GetFtpConnection với thông số thích hợp (13.8.1) Các hành vi đặc trưng lớp đối tượng CFtpConnection sau: BOOL SetCurrentDirectory ( LPCTSTR pstrDirName // Đường dẫn thư mục ); Ấn đònh thư mục làm việc FTP server BOOL GetCurrentDirectory ( CString& strDirName // Biến chứa kết ); Lấy đường dẫn thư mục làm việc FTP server BOOL RemoveDirectory ( // Đường dẫn thư mục LPCTSTR pstrDirName ); Xóa thư mục FTP server BOOL CreateDirectory ( // Đường dẫn tên thư mục LPCTSTR pstrDirName ); Tạo thư mục FTP server BOOL Rename ( LPCTSTR pstrExisting, // Đường dẫn tên cũ thư mục MFC với Internet 225 LPCTSTR pstrNew // Tên thư mục ); Đổi tên thư mục FTP server BOOL Remove ( LPCTSTR pstrFileName // Đường dẫn tên tập tin ); Xóa tập tin FTP server CInternetFile* OpenFile ( LPCTSTR pstrFileName, // Đường dẫn tên tập tin mở DWORD dwAccess = GENERIC_READ, DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY, DWORD dwContext = ); Mở tập tin FTP server Trả trỏ đối tượng CInternetFile quản lý tập tin mở dwAccess : Chế độ mở tập tin, chọn chế độ mở sau: GENERIC_WRITE : Mở để ghi GENERIC_READ : Mở để đọc dwFlags : Kiểu nội dung tập tin FTP_TRANSFER_TYPE_ASCII : Mã ASCII FTP_TRANSFER_TYPE_BINARY : Mã nhò phân BOOL PutFile ( // Đường dẫn tên tập tin client LPCTSTR pstrLocalFile, LPCTSTR pstrRemoteFile, // Đường dẫn tên tập tin server /* Kiểu nội dung tập tin */ DWORD dwFlags = FTP_TRANSFER_TYPE_BINARY, DWORD dwContext = // Số hiệu nhận diện tác vụ ); Tải tập tin từ host làm việc lên FTP server (upload) BOOL GetFile ( LPCTSTR pstrRemoteFile, // Đường dẫn tên tập tin server // Đường dẫn tên tập tin client LPCTSTR pstrLocalFile, BOOL bFailIfExists = TRUE, // Chế độ xử lý trùng tên tập tin DWORD dwAttributes = FILE_ATTRIBUTE_NORMAL, DWORD dwFlags = /* Kiểu nội dung tập tin */ FTP_TRANSFER_TYPE_BINARY, DWORD dwContext = ); Tải tập tin từ FTP server host làm việc bFailIfExists : Qui đònh cách thực tên dùng cho tập tin ghi trùng với tên tập tin có host làm việc 226 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com TRUE Ỉ Thông báo lỗi FALSE Ỉ Tự động ghi chồng lên nội dung có dwAttributes : Thuộc tính tập tin Có thể kết hợp giá trò sau: FILE_ATTRIBUTE_ARCHIVE : Tập tin cập nhật FILE_ATTRIBUTE_DIRECTORY : Thư mục FILE_ATTRIBUTE_NORMAL : Tập tin bình thường FILE_ATTRIBUTE_HIDDEN : Tập tin ẩn mặt FILE_ATTRIBUTE_READONLY : Tập tin đọc FILE_ATTRIBUTE_SYSTEM : Tập tin hệ thống FILE_ATTRIBUTE_TEMPORARY : Tập tin sử dụng tạm thời virtual void Close( ); Kết thúc liên kết với FTP server BOOL TimThay = TimFile.FindFile(_T("*.TXT")); while (TimThay) { TimThay = TimFile.FindNextFile(); … // Xử lý tập tin tìm thấy } } catch (CInternetException* pEx) { … // Có lỗi } if (pConnect != NULL) pConnect->Close(); delete pConnect; 13.8.4 CFtpFindFile: CFtpFindFile lớp đối tượng quản lý công cụ tìm kiếm tập tin FTP server Các hành vi đặc trưng lớp sau: CFtpFileFind( CFtpConnection* pConnection ); Tạo lập khởi tạo thông số cho đối tượng tìm kiếm tập tin virtual BOOL FindFile ( LPCTSTR pstrName = NULL, // Dạng tên tập tin cần tìm DWORD dwFlags = INTERNET_FLAG_RELOAD ); Khởi động trình tìm kiếm tập tin Trả giá trò TRUE khởi điểm tìm kiếm thành công Có thể sử dụng ? , * để ấn đònh dạng tên tập tin cần tìm dwFlags = INTERNET_FLAG_DONT_CACHE không sử dụng cache virtual BOOL FindNextFile( ); Tìm tập tin thỏa điều kiện Trả giá trò TRUE tác vụ tìm kiếm thành công, ngược lại xem tìm hết tập tin thỏa điều kiện tìm kiếm CString GetFileURL( ); Trả chuỗi đường dẫn tập tin vừa tìm theo yêu cầu Đoạn chương trình sau thực tìm kiếm tập tin với tên có phần mở rộng ‘txt’ FTP server: CInternetSession sess(_T("FTP - Example")); // Quản lý giao tác CFtpConnection* pConnect = NULL; // Liên kết với server try { pConnect = sess.GetFtpConnection(“ftp.hcmueco.edu.vn”); CFtpFileFind TimFile ( pConnect ); // Đối tượng tìm kiếm MFC với Internet 227 13.8.5 CHttpConnection: CHttpConnection lớp đối tượng quản lý liên kết với HTTP server Đối tượng nhận từ đối tượng quản lý giao tác với mạng internet thông qua hành vi GetHttpConnection với thông số thích hợp (13.8.1) Lớp CHttpConnection có hành vi đặc trưng sau: CHttpFile* OpenRequest ( int nVerb, LPCTSTR pstrObjectName, LPCTSTR pstrReferer = NULL, DWORD dwContext = 1, LPCTSTR* pstrAcceptTypes = NULL, LPCTSTR pstrVersion = NULL, DWORD dwFlags = INTERNET_FLAG_EXISTING_CONNECT ); Trả trỏ đối tượng CHttpFile quản lý tập tin liệu cần truy xuất HTTP server nVerb: Ấn đònh loại tác vụ truy xuất tập tin liệu CHttpConnection::HTTP_VERB_POST : Ghi liệu CHttpConnection::HTTP_VERB_GET : Đọc liệu CHttpConnection::HTTP_VERB_DELETE : Xóa tập tin liệu pstrObjectName : Đường dẫn tên tập tin liệu HTTP server pstrReferer : Đòa (root) tập tin liệu dwContext : Số hiệu nhận diện tác vụ truy xuất pstrAcceptTypes : Chứa kiểu liệu mà client mong muốn khai thác nội dung tập tin liệu truy xuất Ví dụ: "text/*" = Chỉ lấy nội dung text, không nhận liệu hình ảnh, mã,… 228 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com pstrVersion: dwFlags : Giao thức sử dụng, "HTTP/1.0" Tối ưu truy xuất INTERNET_FLAG_RELOAD : Không đọc từ cache INTERNET_FLAG_DONT_CACHE : Không để lại cache HTTP_ADDREQ_FLAG_REPLACE : 13.8.6 CHttpFile: CHttpFile lớp đối tượng quản lý tập tin liệu độc lập truy xuất HTTP server BOOL QueryInfo ( // Thông số truy vấn DWORD dwInfoLevel, // Vùng đệm nhận kết LPVOID lpvBuffer, // Chiều dài vùng đệm LPDWORD lpdwBufferLength, LPDWORD lpdwIndex = NULL ); Truy vấn thông tin liên quan đến tập tin liệu Trả giá trò TRUE tác vụ truy vấn thành công Thông số truy vấn là: HTTP_QUERY_FLAG_REQUEST_HEADERS : Thông tin header HTTP_QUERY_LAST_MODIFIED : Ngày cập nhật cuối BOOL AddRequestHeaders ( CString& str, // Nội dung thông số yêu cầu DWORD dwFlags = HTTP_ADDREQ_FLAG_ADD_IF_NEW ); Cập nhật yêu cầu vào danh sách yêu cầu tập tin liệu Các yêu cầu gửi lên HTTP server thực Nội dung yêu cầu phải kết thúc Xem (RFC2616): - Accept : Đề nghò kiểu liệu truy xuất tập tin Cú pháp: "Accept: (media-range [ accept-params ][,])* " Ví dụ: "Accept: audio/*" , "Accept: text/plain" - User-Agent : Tên, dùng nhận diện ứng dụng yêu cầu Cú pháp : "User-Agent" ":" Name( product | comment )*" Ví dụ : "User-Agent: Mr.EMP" - Content-Type : Kiểu nội dung tập tin liệu Cú pháp : "Content-Type: media-type*" Ví dụ: "Content-Type: text/html; charset=ISO-8859-4" dwFlags : Thông số ấn đònh chế cập nhật: HTTP_ADDREQ_FLAG_COALESCE : Trộn nội dung loại yêu cầu: "Accept: text/*" "Accept: audio/*"Ỉ "Accept: text/*, audio/*" MFC với Internet 229 Thay nội dung trước nội dugn sau có loại yêu cầu "Accept: text/*" "Accept: audio/*"Ỉ "Accept: audio/*" HTTP_ADDREQ_FLAG_ADD : Như _REPLACE tự động bổ sung loại yêu cầu chưa có BOOL SendRequest ( CString& strHeaders, // Nội dung yêu cầu // Các diễn giải client (không LPVOID lpOptional = NULL, DWORD dwOptionalLen = // bắt buộc ) ); Gửi yêu cầu liên quan tập tin liệu lên HTTP server Nếu không nội dung yêu cầu dùng yêu cầu ấn đònh hành vi AddRequestHeaders BOOL SendRequestEx ( // Kích thước liệu LPINTERNET_BUFFERS lpBuffIn, LPINTERNET_BUFFERS lpBuffOut, // Vùng đệm chứa liệu DWORD dwFlags = HSR_INITIATE, DWORD dwContext = ); Ghi thông tin lên tập tin liệu HTTP server BOOL EndRequest ( DWORD dwFlags = 0, LPINTERNET_BUFFERS lpBuffIn = NULL, DWORD dwContext = ); Ngừng tác vụ ghi tập tin liệu HTTP server virtual CString GetFileURL( ); Trả đường dẫn tên tập tin liệu HTTP server virtual void Close( ); Kết thúc truy xuất tập tin liệu Ví dụ: Đoạn chương trình sau thực kết nối với HTTP server Đọc hiển thò nội dung tập tin /index.html server 230 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com CInternetSession session("HTTP - Example"); CHttpFile* file=NULL; CString strServer = "www.hcmueco.edu.vn"; CString strObject("/index.html"); INTERNET_PORT port = INTERNET_DEFAULT_HTTP_PORT; CString strHeaders ( "Accept: text/*\r\n” “User-Agent: Mr.Emp\r\n" "Content-Type: application/x-www-form-urlencoded\r\n"); CHttpConnection* server = NULL; try { server=session.GetHttpConnection(strServer, port); file=server->OpenRequest ( CHttpConnection::HTTP_VERB_POST,strObject ); } catch (CInternetException* pEx) { … // Có lỗi } if (server==NULL) return; if (file!=NULL) { file->AddRequestHeaders(strHeaders); file->SendRequest(); // Xác lập yêu cầu truy xuất CString line; // Sử dụng cho đọc chuỗi while (file->ReadString(line)) { … // Xử lý nội dung đọc } file->Close(); delete file; } server->Close(); delete server; 13.8.7 Thực ứng dụng FTP client đơn giản: Trình tự tiến hành xử lý ứng dụng sau: - Thiết lập giao tác internet, tạo liên kết FTP từ giao tác - Tạo đối tượng CFtpFileFind từ liên kết FTP, tìm tập tin ftp server - Tạo đối tượng CInternetFile từ tập tin tìm Thực tác vụ đọc ghi cách thích hợp - Đóng đối tượng MFC với Internet 231 Sau bước thực dự án ứng dụng nói trên: Dùng MFC Wizard, tạo dự án Ftp với giao diện dialog Bổ sung thò: #include cho tập tin stdafx.h dự án Thực cài đặt sau cho lớp dialog CFtpDlg dự án: - Mở dialog resource, cài đặt control sau: : Edit IDC_URL - Hộp nhập đòa FTP server - Hộp hiển thò danh sách tập tin : ListBox IDC_FILE_LIST - Nút lệnh thực tìm kiếm tập tin : Button IDOK - Tạo biến m_fileList cho control IDC_FILE_LIST - Hành vi OnOK ứng với nút chọn IDOK thực tìm tất tập tin thư mục gốc FTP server đưa vào danh sách: Cài đặt tương tự ví dụ mục (13.8.4) Phần cài đặt Xử lý tập tin tìm thấy sau: m_fileList.ResetContent(); while (TimThay) { bWorking = TimFile.FindNextFile(); m_fileList.AddString(TimFile.GetFileURL()); } Biên dòch chạy ứng dụng 13.8.8 Thực ứng dụng HTTP client đơn giản: Trình tự tiến hành xử lý ứng dụng sau: - Thiết lập giao tác internet, tạo liên kết HTTP từ giao tác - Tạo đối tượng CHttpFile cho tập tin quan tâm HTTP server - Sử dụng đối tượng CHttpFile để QueryInfo ấn đònh truy xuất với AddRequestHeaders SendRequest nội dung tập tin - Truy xuất liệu: Read, ReadString Write, WriteString Sau bước thực dự án ứng dụng nói trên: Dùng MFC Wizard, tạo dự án Http với giao diện dialog Bổ sung thò: #include cho tập tin stdafx.h dự án Thực cài đặt sau cho lớp dialog CHttpDlg dự án: - Mở dialog resource, cài đặt control sau: : Edit IDC_URL - Hộp nhập đòa HTTP server : Edit IDC_SOURCE - Hộp hiển thò nội dung tập tin : Button IDOK - Nút lệnh thực tải tập tin 232 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com - Hành vi OnOK ứng với nút chọn IDOK thực tải nội dung tập tin từ đòa nhập hộp nhập: Cài đặt tương tự ví dụ mục (13.8.6) Phần cài đặt Xử lý nội dung đọc sau: CString line, info; info.Empty(); while (file->ReadString(line)) { info = info + line; info = info + "\r\n"; } SetDlgItemText(IDC_SOURCE, info); Biên dòch chạy ứng dụng THỰC HÀNH: Xây dựng ứng dụng CHAT với giao thức TCP UDP Xây dựng ứng dụng FTP explorer (xem windows explorer) Xây dựng ứng dụng chơi tiến lên mạng (mô hình client/server) Xây dựng ứng dụng thi trắc nghiệm mạng - Ứng dụng giám thò trung tâm kết nối với ứng dụng kiểm tra chạy host làm Ứng dụng giám thò điều khiển đồng ứng dụng kiểm tra - Ứng dụng kiểm tra chờ thò từ ứng dụng giám thò, tạo giao diện làm với người dùng, thường xuyên thông báo tình trạng làm người dùng cho ứng dụng giám thò quản lý bảo lưu - Khi bắt đầu, ứng dụng gíam thò chủ động kết nối, ứng dụng làm chờ kết nối để lấy thông tin ứng dụng giám thò thông tin khác đề thi, thông tin bảo lưu trước có cố Quan sát ứng dụng Yahoo Messenger! Kết hợp hai kiểu ứng dụng rtf view (11.8) ứng dụng TCP (13.5) để thực ứng dụng tương tự Viết ứng dụng mail server mail client đơn giản Viết ứng dụng ftp server đơn giản Viết ứng dụng http server đơn giản (RFC1945) Viết ứng dụng voice chat đơn giản MFC với Internet 233 PHỤ LỤC A: Một số vấn đề lập trình hướng đối tượng A.1 LẬP TRÌNH HƯỚNG ĐỐI TƯNG (OOP): Lập trình hướng đối tượng (Object-Oriented Programming) phương pháp lập trình giải toán dựa phối hợp đối tượng khách quan không gian toán Các đối tượng hoạt động tương tác lẫn để đưa toán trạng thái mong muốn Phương pháp tiếp cận cho phép tách không gian toán thành tập hợp nhiều đối tượng, đối tượng có tính độc lập tương Do đó, từ công việc lớn phức tạp ta phân chia thành nhiều công việc nhỏ đơn giản dễ thực hơn, đồng thời việc điều chỉnh bổ sung tính cho đối tượng không ảnh hưởng đến hoạt động đối tượng khác Nhờ đó, có nhu cầu phát triển toán ta xây dựng lại từ đầu mà dựa nội dung có Đây ưu điểm lớn so với lập trình cấu trúc A.2 CÁC KHÁI NIỆM: A.2.1 Lớp (Class): Lớp tập hợp đối tượng có số tính chất khảo sát Các tính chất trạng thái (thuộc tính) hay hoạt động đối tượng Ví dụ: Lớp cá tập hợp bao gồm động vật có đặc điểm: vây, mang, máu lạnh có hành vi: sống nước, thở mang, đẻ trứng A.2.2 Đối tượng (Object): Đối tượng thể cụ thể lớp Một đối tượng thuộc lớp có thuộc tính, hành vi lớp Sự khác cách thể thuộc tính, hành vi đối tượng sở phân biệt đối tượng với đối tượng khác lớp A.2.3 Thuộc tính (Attribute): Thuộc tính giá trò phản ánh trạng thái đối tượng thời điểm xác đònh, giúp thể đối tượng Đối tượng có nhiều thuộc tính A.2.4 Hành vi (Method): 234 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com Hành vi khả ứng xử đối tượng với môi trường xung quanh, tác động thay đổi thuộc tính thân đối tượng đối tïng liên quan Hành vi thể mặt hoạt động đối tượng Ví dụ: Hoạt động sống người trình vận động thay đổi thân người tác động (cũng bò tác động) đến môi trường xung quanh Ta có mô hình đối tượng sau: Đối tượng = Thuộc tính + Hành vi A.2.5 Chương trình (Program): Dưới góc độ OOP, chương trình chuỗi thao tác phối hợp hay nhiều đối tượng nhằm đạt đến kết cục mong muốn Các thao tác đối tượng phải dàn dựng trước, ta gọi kòch Chương trình = Tập hợp đối tượng + Kòch A.3 ĐẶC ĐIỂM LẬP TRÌNH HƯỚNG ĐỐI TƯNG: - Tính khách quan (Objective): Một lớp đối tượng hình thành xuất phát từ chủ thể khách quan với thuộc tính hành vi thể chất chức Kòch chương trình vận dụng yêu tố khách quan cách hợp lý để đạt mục đích chương trình - Tính đóng gói (Encapsulation): Việc bao hàm thuộc tính hành vi đối tượng giúp đối tượng hoạt động phối hợp độc lập với lớp đối tượng khác - Tính kế thừa (Inheritance): Việc đònh nghóa lớp đối tượng dựa lớp đối tượng có gọi kế thừa Các lớp có gọi lớp sở (based class), lớp đònh nghóa gọi lớp kế thừa (derived class) Bên cạnh việc kế thừa, lớp kế thừa bổ sung hành vi thuộc tính cần thiết để phục vụ cho nhu cầu phát sinh Cơ chế tạo phát triển cho ứng dụng mà đối tượng tham gia - Tính đa hình (Polymorphism): Phụ lục A: Một số vấn đề lập trình hướng đối tượng 235 Cơ chế triển khai nhiều cách thể khác cho hành vi theo nguyên tắc xây dựng lớp sở chứa hành vi cần triển khai lớp kế thừa Mỗi lớp kế thừa phát triển hành vi theo cách khác Một đối tượng đại diện lớp sở kiến tạo từ lớp kế thừa phù hợp để có cách thể hành vi cần triển khai theo ý muốn Cơ chế tạo khả ứng xử phong phú đối tượng A.4 PHÂN LOẠI THUỘC TÍNH VÀ HÀNH VI: Các thuộc tính hành vi đối tượng chia thành ba loại: Các thuộc tính, hành vi đối tượng thể bên - Public: - Protected: Các thuộc tính, hành vi ẩn chứa bên đối tượng, hỗ trợ hoạt động đối tượng truyền lại cho lớp đối tượng kế thừa - Private: Các thuộc tính, hành vi ẩn chứa bên đối tượng, hỗ trợ hoạt động đối tượng truyền lại cho lớp đối tượng kế thừa A.5 CÁC HÀNH VI ĐẶC BIỆT: - Hành vi tạo tập: Hành vi thực đối tượng vừa hình thành Hành vi dùng để cài đặt xử lý khởi tạo giá trò thuộc tính đối tượng Một lớp đối tượng có nhiều hành vi tạo lập Tên hành vi tạo lập trùng với tên lớp Các hành vi tạo lập phân biệt lẫn cấu trúc tham số chúng - Hành vi hủy bỏ: Hành vi thực trước đối tượng chấm dứt tồn Một lớp đối tượng có hành vi hủy bỏ Tên hành vi hủy bỏ trùng với tên lớp bắt đầu dấu ‘~’ Hành vi hủy bỏ tham số Cả hành vi tạo lập hủy bỏ kiểu trả A.6 KHAI BÁO LỚP, ĐỐI TƯNG TRONG C++: A.6.1 Khai báo lớp: Lớp đối tượng khai báo C++ sau: // Phần khai báo lớp: 236 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com class Tên_lớp { public: [ Khai báo thuộc tính, hành vi kiểu public ] protected: [ Khai báo thuộc tính, hành vi kiểu private ] privated: [ Khai báo thuộc tính, hành vi kiểu private ] }; // Phần cài đặt lớp: kiểu Tên_lớp::Tên_hành_vi_1( [ Danh_sách_tham_số ] ) { … // Các xử lý hành vi } … kiểu Tên_lớp::Tên_hành_vi_n( [ Danh_sách_tham_số ] ) { … // Các xử lý hành vi } ) Nội dung phần khai báo cài đặt lớp đặt hai tập tin khai báo (.h) cài đặt (.cpp) Trong đó: - Tập tin H : Chứa toàn phần khai báo lớp thò đònh hướng biên dòch (nếu cần) - Tập tin CPP : Chứa toàn phần cài đặt lớp Ở đầu tập tin khai báo thò sử dụng tập tin H: #include "Tên_tập_tin_h_liên_quan" Thực hành 1: Xét toán quản lý chuỗi, không gian toán giá trò kiểu chuỗi C cần quản lý truy xuất ) Dưới góc độ OOP, lớp đối tượng chuỗi giúp biểu diễn chuỗi có thuộc tính hành vi sau: - Thuộc tính: char* info sử dụng để xin cấp phát vùng nhớ chứa nội dung chuỗi - Hành vi: - Hành vi tạo lập với tham số giá trò chuỗi làm nội dung khởi đầu cho đối tượng chuỗi - Hành vi hủy bỏ giải phóng vùng nhớ info - Hành vi lấy đòa vùng chứa nội dung chuỗi Lớp chuỗi khai báo C++ sau: Phụ lục A: Một số vấn đề lập trình hướng đối tượng 237 // Tập tin String1.h class CString1 { public: CString1 ( char* s ); // Hành vi tạo lập ~CString1 ( void ); // Hành vi hủy bỏ char* GetInfo( void ); protected: char* info; }; // Tập tin String1.cpp CString1::CString1( char* s ) { info = new char[ strlen( s ) + ]; strcpy( info, s ); } CString1::~CString1( ) { delete info; } char* CString1::GetInfo( void ) { return info; } A.6.2 Khai báo đối tượng: Đối tượng khai báo nhờ lớp tương ứng Lớp xem kiểu liệu đối tượng biến ứng với kiểu Cú pháp khai báo biến đối tượng C++ sau: Tên_lớp Tên_biến_đối_tượng( [Danh sách giá trò làm tham số ] ); A.6.3 Sử dụng đối tượng chương trình: Thực hành vi biến đối tượng (các hành vi public) sau: Tên_biến_đối_tượng.Tên_hành_vi( [Danh sách giá trò làm tham số ] ); // Chương trình Main.cpp sử dụng lớp CString1 khai báo #include "String1.h" void main( void ) { CString1 a( “Vo Van A” ); printf( "Gia tri chuoi luu la: %s ", a.GetInfo() ); } A.7 KẾ THỪA TRONG C++: 238 Lập trình Windows với MFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com C++ cho phép đònh nghóa lớp kế thừa từ nhiều lớp sở Cú pháp thực khai báo sau: class Tên_lớp_kế_thừa: [ public | private ] Tên_lớp_cơ_sở1 [, [public | private ] Tên_lớp_cơ_sở2 [ , … ] { … // Các khai báo bổ sung lớp kế thừa }; Đặc điểm kế thừa qui đònh mức độ kế thừa lớp kế thừa từ lớp sở Có hai kiểu khác đặc điểm kế thừa có ý nghóa sau: Thuộc tính lớp sở Thuộc tính nhận cho lớp kế thừa public public private protected protected private private Không truy xuất Không truy xuất Đặc điểm kế thừa public Private Ví dụ: Khai báo lớp CString1B kế thừa hoàn toàn từ lớp CString1 class CString1B : public CString1 { }; A.7.1 Kế thừa hành vi tạo lập: Mỗi hành vi tạo lập bổ sung lớp kế thừa phép sử dụng hành vi tạo lập từ lớp sở Khai báo có cú pháp sau: Hành_vi_tạo_lập_của_lớp_kế_thừa( [ Danh sách thamm số ] ) : Hành_vi_tạo_lập_của_lớp_sơ_sở_1( [ Các giá trò thamm số ] ) [ , Hành_vi_tạo_lập_của_lớp_sơ_sở_2( [ Các giá trò thamm số ] ) [,…]]{ … }; Khi đối tượng thuộc lớp kế thừa hình thành, xử lý hành vi tạo lập lớp kế thừa xử lý hành vi tạo lập lớp sở mà lớp đăng ký kế thừa thực theo thứ tự sau: Hành_vi_tạo_lập_của_lớp_sơ_sở_1 Phụ lục A: Một số vấn đề lập trình hướng đối tượng 239