Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 133 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
133
Dung lượng
2,23 MB
Nội dung
lntmail@yahoo.com : 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 Chương trình ( Program ) Ứng dụng ( Application ) Tiến trình ( Process ) Tiểu trình (Thread ) 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 Cửa sổ giao diện (window) ứng dụng Message queue Kiến trúc xử lý ứng dụng Windows Resource ứng dụng : Trang 1 1 2 3 2.1 Thư viện MFC (Microsoft Foundation Class) 2.2 Tiếp an MFC 2.3 Tạo ứng dụng windowsvớiMFC ? 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 : Các công cụ giao diện đồ họa Device Context Tọa độ giao diện đồ họa 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.1 3.2 3.3 3.4 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 : 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 5.1 5.2 5.3 5.4 6.1 6.2 6.3 6.4 6.5 6.6 6.7 : Lớp xử lý message CCmdTarget: Khai báo mục xử lý message MessageMap Các lớp kế thừa CCmdTarget 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 : DC BITMAP Ứng dụng với cửa sổ hiển thò ảnh Sao chép ảnh từø DC đến DC, phóng to & thu nhỏ ảnh DC nhớ ( DC ảo) – vùng vẽ đệm lý tưởng Ảnh chuyển động vùng client CImageList – công cụ quản lý ảnh cỡ CRgn – Cửa sổ có hình dạng tùy ý 60 60 60 63 64 65 66 67 : 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 : 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9 9.1 9.2 9.3 9.4 9.5 9.6 9.7 CStatic CEdit CButton ClistBox CComboBox CSpinButtonCtrl CProgressCtrl CscrollBar CSliderBar 78 78 80 84 85 88 91 93 94 96 : Hộp hội thoại (Dialog) Lớp CDialog 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 Liên kết dialog thành phần khác 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 Khai báo biến cho control dialog Khai thác tiện ích hỗ trợ 97 97 97 99 99 103 104 104 106 106 107 109 112 : 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 11.1 11.2 11.3 11.4 11.5 11.6 11.7 11.8 11.9 11.10 : CDocument CView CFrameWnd CDoctemplate Hỗ trợ từ phía đối tượng quản lý ứng dụng Trình tự tạo lập đối tượng tham gia DVF Text Document Appication Rich Text Format (rtf) Document Appication HTML Document View Appication 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 : Tập tin INI System Registry Vùng Status Area Taskbar Ứ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 12.1 12.2 12.3 12.4 120 121 121 123 123 124 130 134 134 135 136 136 137 138 139 143 146 149 149 150 152 154 155 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ậptrì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 : : 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ậptrì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 MFCvớilậptrình Winsock 13.3.1 Khởi động Winsock 13.3.2 Lớp CAsyncSocket 13.4 Lậptrình Winsock cho giao thức UDP 13.5 Lậptrì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 Lậptrình hướng đối tượng (OOP) A.2 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) A.3 Đặc điểm lậptrình hướng đối tượng A.4 Phân loại thuộc tính hành vi A.5 Các hành vi đặc biệt A.6 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 A.7 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ở A.8 Khai báo hành vi toán tử số học A.9 Con trỏ this A.10 Hành vi virtual A.11 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 Ngôn ngữ lậptrình C++ biết đến ngôn ngữ lậptrì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ậptrình cấu trúc đến lậptrình hướng đối tượng, từ lậptrình dựa thuật giải đến lậptrình trí tuệ nhân tạo, từ lậptrình sở liệu đến lậptrình sở tri thức…, đâu, mà người lậptrì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ậptrìnhWindows áp dụng kỹ thuật lậptrì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 Thành phố Hồ Chí Minh, ngày 19.11.2002 Tác giả [1] [2] [3] [4] [5] , Windows 95 - Win32 Programming API-BIBLE, Waite Group Press 1996 , Programming Windows 95 with MFC, Microsoft Press , Professional Visual C++ ISAPI Programming, Wrox Press , Microsoft Developer Network - MSDN, Microsoft Corporation Software ,Visual C++ Windows Shell Programming, Wrox Press : - Microsoft Visual C++ 6.0 Microsoft Visual C++ NET - MSDN ( Microsoft Developer Network ), tháng 10/2003 : 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 : 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 : - 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 : Ti u trình giao di n (user-interface thread): Có nhi m v x lý u c u c a 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 hi n x lý tính tốn bên trong, khơng tr c ti p nh n u c u c a ng i dùng Th c ra, có th xem ti u trình giao di n nh m t ti u trình x lý n i nh ng có tính n ng giao tác v i ng i s d ng M : 1.1 Ch ng trình máy tính t p h p ch th ụi u n ho t ụ ng c a máy, ụ c b trí theo m t trình t logic nh m ph i h p th c hi n m t cơng vi c xác ụ nh Các ch th ụ c th hi n d i d ng mã ngu n (source code) hay mã máy (machine code) Ch ng trình mã máy có th th c hi n ụ c máy có b l nh t ng thích, v i ch ng trình mã ngu n ph i s d ng m t ng d ng chun d ng ụ chuy n sang mã máy tr c th c hi n Vi c chuy n ch th d ng mã ngu n sang ch th mã máy ụ th c hi n ụ c ti n hành b ng m t hai c ch sau: Thơng d ch: M i ch th mã ngu n ụ c chuy n sang ch th mã máy t ng ng ụ c th c hi n ngay, sau ụó ti p t c v i ch th k ti p Biên d ch: T t c ch th mã ngu n ụ c chuy n sang ch th mã máy t ng ng T p h p ch th mã máy g i ch ng trình mã máy Ch ng trình mã máy ụ c l u l i t p tin ch ng trình v sau ta có th th c hi n chúng m t cách ụ c l p máy : 1.2 Khi m t ch ng trình ụ c cài ụ t máy tính ụ s d ng, ta g i ụó ng d ng, ví d nh ng d ng NotePad, ng d ng Microsoft Word, Trong mơi tr ng windows, m i ng d ng có th ụ c thi hành nhi u l n thành nhi u b n khác M i b n ụang th c hi n c a m t ng d ng g i th hi n (instance) c a ng d ng ụó : 1.3 Ti n trình khái ni m ch m t instance ụang ho t ụ ng c a ng d ng Khi ta double-click bi u t ng NotePad ụ ch y ng d ng này, ta có m t ti n trình c a ng d ng NotePad : 1.5 Thơng ụi p (message) giá tr ph n ánh m t n i dung giao ti p hay u c u x lý gi a h th ng (windows) ng d ng, gi a ng d ng v i ho c gi a thành ph n m t ng d ng : 1.5.1 C windows ng d ng ụ u có th 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, c a ng i dùng), thay ụ i c a h th ng (font ch , ch ụ phân gi i hình, màu s c, ) ho c nh ng bi n ụ i khác liên quan ụ n ng d ng ng d ng phát sinh message x lý ụi u n thành ph n bên ng d ng ph i h p th c hi n ch c n ng giao ti p v i ng i dùng, ho c ng d ng th c hi n giao ti p v i windows hay v i ng d ng khác ụang th c hi n h th ng 1.5.2 : Message ụ c ụ nh ngh a b i h th ng: Là message h ụi u hành windows t o nh m ph c v ho t ụ ng ụi u n tồn b h th ng, x lý thơng tin vào-ra ho c thơng tin khác cho ng d ng Khi có nhu c u, ng d ng có th s d ng nh ng message ụ phát ụ ng m t ch c n ng ụi u n ụó c a windows Message ụ c ụ nh ngh a b i 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ù gi a thành ph n ng d ng, gi a ng d ng v i windows ho c v i ng d ng khác ụang th c hi n h th ng : 1.4 Ti u trình m t nhánh x lý ụ c l p ti n trình Khi m t ng d ng ụ c th c hi n ta có thêm m t ti n trình Do b n ch t ch ng trình làm nên ng d ng ụó bao g m ch ng trình ( hay ) ch ng trình mà ti n trình ng v i có th tách thành nhánh x lý: m t 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ậptrình môi trường WindowsLậptrìnhWindowsvớiMFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com 1.5.3 S : Có r t nhi u message khác ụ c s d ng mơi tr ng windows ng v i m i message xác ụ nh, windows s d ng m t 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 ụ c khai báo s n nh t v i h ng s xác ụ nh tên g i g i nh c a chúng có d ng WM_xxx Các messges ng i dùng ụ nh ngh a c ng ph i ụ ng ký s hi u S hi u ụ ng ký khơng ụ c trùng l p có giá tr nh nh t b ng WM_USER (m t h ng s windows ụ nh ngh a) S hi u message c s ụ phân bi t message l n : 1.5.4 Ð Ð ụ i t ng nh n message có thêm thơng tin v hồn c nh phát sinh ý ngh a c th c a message, windows cho phép message ụ c nh n thơng qua m t c u trúc ch a s hi u message thơng s kèm theo C u trúc ụ c khai báo thành ki u MSG v i n i dung nh sau: typedef struct HWND UINT WPARAM LPARAM DWORD POINT } ; t o s g n g i h n gi a giao di n c a ng d ng windows v i ng i dùng D ng thơng th ng c a m t c a s giao di n windows: System Menu Box: Ch a bi u t ng c a 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 ho c ụóng c as Caption bar: Thanh tiêu ụ c a 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 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 c a s Border: Ð ng vi n bao quanh c a s Client area: Vùng làm vi c c a 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 c a s Window Procedure: Ngồi giao di n ụ h a, c a s c a windows có kh n ng ti p nh n x lý message Kh n ng ụ c th c hi n thơng qua hàm x lý message mà ta ụã g n cho c a s Hàm x lý có khai báo nh sau: LRESULT CALLBACK ( HWND hwnd, // Tham s ch a Handle c a c a s liên quan UINT uMsg, // Tham s ch a s hi u message WPARAM wParam, // Tham s b sung th nh t ki u WORD LPARAM lParam // Tham s b sung th hai ki u LONG ) ; Hàm tr v m t giá tr có kích th c 32 bits Khi m t u c u x lý ụ c chuy n ụ n c a s d i d ng message, hàm WindowProc g n v i c a s s c n c s hi u message (uMsg) ụ ch n x lý phù h p Theo ngun t c, n u message ụ c x lý hồn t t hàm tr v giá tr 0, ng c l i (message khơng thu c { hwnd; message; wParam; lParam; time; pt; // Giá tr có kích th c bytes (long) // S hi u c a 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 ụ c g i Tr ng hwnd (window handle) c a 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 ụ c 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 c a Giá tr g i th qu n lý ụ i t ng (object handle) ng v i m i lo i ụ i t ng c th , windows s d ng m t 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 : 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 c a ng d ng windows Cùng v i s phát tri n c a h ụi u hành windows, hình nh c a s giao di n c ng thay ụ i theo v i chi u h ng sinh ụ ng h n v hình th c phong phú h n v ch c n ng Ði u ụó khơng ch góp ph n t ng tính th m m mà Một số khái niệm lậptrình môi trường WindowsLậptrìnhWindowsvớiMFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com tr tham s plMSG Khi ụã l y ụ c m t message, hàm k t thúc tr v m t giá tr ngun N u message nh n ụ c message k t thúc ng d ng (s hi u WM_QUIT) hàm tr v giá tr Ng c l i, hàm tr v giá tr khác Ki m tra l y m t message message queue c a ng d ng: ( BOOL // Nh LPMSG lpMsg; HWND hWnd; wMsgFilterMin; UINT UINT wMsgFilterMax; wRemoveMsg; // Có th c hi n xóa message khơng ? UINT // PM_NOREMOVE: khơng xóa ); Hàm tr v giá tr n u message queue r ng Ng c l i, hàm tr v m t giá tr khác khơng thơng tin v message ụ c ụi n vào bi n ki u MSG ụ c ch b i tham s ki u tr lpMSG Di n d ch message c a bàn phím sang mã phím ASCII: BOOL ( // tr ụ n bi n ch a message CONST MSG *lpMsg; ); Tham s lpMsg tr ch ụ n bi n ki u MSG ch a n i dung ụ c t message ụ c l y t message queue c n di n d ch kh n ng x lý c a 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 m c nhiên c a windows Hàm x lý có tên g i DefWindowProc v i khai báo nh sau: ( // Default Window Procedure LRESULT HWND hWnd, // V i tham s có ý ngh a nh UINT Msg, WPARAM wParam, LPARAM lParam ); Khi ụó, k t qu tr v c a DefWindowProc ụ c dùng làm k t qu c a hàm WindowProc Qui t c nói c n ph i ụ c ụ m b o, n u khơng, ng d ng có th làm r i lo n ho t ụ ng c a h ụi u hành windows 1.7 : Message queue danh sách th t message windows t o ụ c dùng ụ ch a message ụang ch ụ c 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 c a 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 c a ng d ng (application queue): Ð c windows t o c p cho th hi n c a ng d ng Windows t ụ ng ụi u ph i message t system queue sang application queue m t cách phù h p, nh ụó m i ng d ng có th ti p nh n th c hi n u c u x lý c a 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 c a máy tính Vi c truy c p message queue c a ng d ng ụ c th c hi n v i s h tr c a hàm liên quan windows cung c p nh sau: Ch l y m t message t message queue c a ng d ng: ( BOOL LPMSG lpMsg, // Con tr ụ n bi n MSG nh n thơng tin // Handle c a c a s liên quan HWND hWnd, wMsgFilterMin, // S hi u message nh nh t nh n ụ c UINT UINT wMsgFilterMax // S hi u message l n nh t nh n ụ c ); Hàm t ụ ng ch ụ n phát hi n có message c n x lý message queue Khi ụó, message vào tr c nh t s ụ c l y kh i hàng ch thơng tin c a ụ c ụi n vào bi n ki u MSG ch b i Một số khái niệm lậptrình môi trường Windows Hàm tr v giá tr khác n u message nh n ụ c t ng ng v i m t 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) ho c m t 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 ụ c Trong tr ng h p khác, hàm tr v giá tr LậptrìnhWindowsvớiMFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com Ði u ph i message ụ n c a s giao di n chính: C a s giao di n c a ng d ng có th ti p nh n x lý c a (1.6) Nh v y, ta có message thơng qua hàm th ụi u ph i message l y t message queue c a ng d ng ụ n cho c a s x lý Vi c ụi u ph i ụ c th c hi n thơng qua hàm sau: LRESULT ( // Con tr ụ n bi n ch a message CONST MSG *lpmsg; ); Tham s lpMSG ch ụ n bi n ki u MSG ch a thơng tin ụ c t message ụ c ụi u ph i Hàm ụi u ph i s ch ụ n hàm x lý message WindowProc c a c a s x lý xong messge, l y giá tr k t thúc c a hàm làm giá tr tr v c a Q trình ti p nh n ụi u ph i x lý message t message queue c a ng d ng ụ c ti n hành liên t c cho ụ n nh n ụ c 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 cài ụ t nh sau: MSG ; // bi n ch a n i dung ụ c t message nh n ụ c while( GetMessage( &msg, NULL, 0, ) != ) { // N u message nh n ụ c khơng ph i WM_QUIT TranslateMessage(&msg); // Di n d ch n u phím DispatchMessage(&msg); // Ði u ph i cho c a s } 1.8 : Khi ng d ng ụ c th c hi n, windows t o thêm m t ti n trình cho th hi n m i c a ng d ng, ụ ng th i xây d ng m t message queue dùng riêng cho th hi n Ti u trình c a ti n trình ụ c t o có nhi m v th c hi n 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ý c a ti u trình n m quy n ụi u n ng d ng: Khơng th c hi n x lý c : ng d ng k t thúc Th c hi n MessageLoop nh ng khơng t o c a s giao di n chính: ng d ng ch nh n message nh ng ng i dùng khơng giao tác ụ c Kh i t o m t 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 c a s s ti p nh n x lý message ụ c ụi u ph i t MessageLoop c a ti u trình Ng i dùng có th giao tác k t thúc ng d ng ụ c Nh m c th ba, ụ ng th i t o ti u trình ph c v : ng d ng có kh n ng ti p nh n th c hi n ụ ng th i nhi u u c u x lý 1.9 Ð i v i m t ch ng trình windows, ngồi ph n mã l nh c a hàm x lý, resource m t thành ph n khơng ph n quan tr ng ch a n i dung h tr cho vi c trang trí ho c ph c v cho m t m c ụích ụ c bi t c a ng d ng Các n i dung ph bi n resource nh sau: nh nh ụ c t v trí làm vi c c a thi t b liên quan nh mouse, pen, trackball Khi ng i dùng tác ụ ng lên nh ng thi t b windows s d ng cursor ụ ph n ánh hi n t ng ụó : T p nh ụi m (pixels) c a m t nh Các nh ụi m b trí theo dòng ph i h p làm nên hình nh c a ụ i t ng : Thơng tin mơ t khung giao di n v i ụ i t ng nh p li u bên trong, c s ụ t o h p h i tho i ng d ng : nh nh ụ c dùng ụ ụ c t ch c n ng c a m t ụ i t ng, ng d ng hay m t n i dung d li u (Hypertext Markup Language): Ngơn ng dùng t o nh ng tài li u d ng v n b n v i nh ng ký pháp k thu t ụ nh d ng mà trình t t ng ng có th th hi n m t cách xúc tích Một số khái niệm lậptrình môi trường WindowsLậptrìnhWindowsvớiMFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com : M t danh sách l a ch n x lý mà ng i dùng có th ch n nh m th c hi n m t x lý xác ụ nh : B ng ch a chu i ụ c ụánh d u phân bi t b i s hi u ụ c s d ng nh 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 c a mà khơng c n ph i có s ch nh s a ph n mã l nh : T p nh xác ụ nh nút ụ c cài ụ t cơng c c a c a s hay h p h i tho i ng d ng M i nút m t m c ch n (có th thay th m c ch n c a menu) giúp t o message l nh (WM_COMMAND) v i s hi u phân bi t ụ có th n ụ nh x lý c n thi t : Ph n khai báo thơng tin liên quan ụ n ng d ng, tác gi : Ch a thơng tin v b font ch ụ c l u t p tin : Bao g m n i dung khơng thu c lo i n i dung resource chu n nói Ng i dùng có th tùy ý cài vào resource c a 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ậptrình môi trường Windows Trong phần này, ta xây dựng ứng dụng sử dụng giao thức TCP để kết nối gửi mail lên mail server Nội dung mail ấn đònh liên quan thể dialog giao diện ứng dụng Dùng MFC Wizard tạo dự án với cửa sổ giao diện dialog, có sử dụng winsock (xem mục 13.4) Đặt tên cho dự án Thực cài đặt sau cho dialog giao diện (CSMTPDlg): - Mở dialog resource, cài đặt control sau: - Hộp nhập đòa mail server : Edit IDC_SERVER_IP - Hộp nhập số hiệu port : Edit IDC_SERVER_PORT : Edit IDC_MAIL_TO - Hộp nhập đòa người nhận - Hộp nhập tiêu đề mail : Edit IDC_MAIL_SUBJECT : Edit IDC_MAIL - Hộp soạn thảo nội dung mail : Button IDOK - Nút lệnh thực gửi mail - Hành vi OnInitDialog thực khởi tạo cần thiết: BOOL CSMTPDlg::OnInitDialog() { CDialog::OnInitDialog(); SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); SetDlgItemText(IDC_SERVER_IP, "omail.hcmueco.edu.vn"); SetDlgItemText(IDC_SERVER_PORT, "25"); SetDlgItemText(IDC_MAIL_TO, "emp@hcmueco.edu.vn"); SetDlgItemText(IDC_MAIL_SUBJECT, "A Lesson of Mr.Emp"); SetDlgItemText(IDC_MAIL, "Hello Mr.Emp!\r\n\r\n" "It's nice to meet You.\r\n\r\n" "Thanks for your lessons."); return TRUE; } - Hành vi kiểm tra lỗi giá trò nhận từ ứng dụng nhận mail: Cài đặt hành vi protected: GetErrorCode cho lớp CSMTPDlg: UINT CSMTPDlg::GetErrorCode(char *sReply) { UINT rs = 0; sscanf(sReply, "%d", &rs); return rs; // Trả số hiệu lỗi ghi liệu nhận } // Đòa người nhận strcpy(s, "RCPT TO:"); GetDlgItemText(IDC_MAIL_TO, s + strlen(s), 1024); strcpy(s + strlen(s), "\r\n"); m_sock.Send(&s, strlen(s)); if (!m_sock.Receive(s, 1024) || GetErrorCode(s) == 550) return; // Chuẩn bò truyền nội dung mail strcpy(s, "DATA\r\n"); m_sock.Send(&s, strlen(s)); if (!m_sock.Receive(s, 1024) || GetErrorCode(s) != 354) return; // Chủ đề mail strcpy(s, "Subject:"); GetDlgItemText(IDC_MAIL_SUBJECT, s + strlen(s), 1024); strcpy(s + strlen(s), "\r\n"); m_sock.Send(&s, strlen(s)); // Nội dung mail - Hành vi OnOK ứng với nút chọn IDOK thực gửi mail: MFCvới Internet void CSMTPDlg::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) || GetErrorCode(s) != 220) return; strcpy(s, "HELO Mr.Emp\r\n"); m_sock.Send(&s, strlen(s)); if (!m_sock.Receive(s, 1024) || GetErrorCode(s) != 250) return; // Đòa người gửi strcpy(s, "MAIL FROM:Mr.Emp\r\n"); m_sock.Send(&s, strlen(s)); if (!m_sock.Receive(s, 1024) || GetErrorCode(s) != 250) return; 217 218 LậptrìnhWindowsvớiMFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com -ERR error_message GetDlgItemText(IDC_MAIL, s, 1024); sprintf(s, "%s%s", s, "\r\n"); m_sock.Send(&s, strlen(s)); Sau đăng nhập thành công, tùy ý thực công việc sau: // Kết thúc strcpy(s, "\r\n.\r\n"); m_sock.Send(&s, strlen(s)); strcpy(s, "QUIT\r\n"); m_sock.Send(&s, strlen(s)); m_sock.Close(); MessageBox("The Mail was sent OK !", "Send mail"); } 13.7 : POP3 giao thức cho phép mail client host kết nối với mail server host để lấy thông tin hộp mail người dùng mail server Hoạt động truy xuất nhằm tải mail người dùng client host xóa mail khỏi hộp mail họ mail server Tương tự SMTP, trình tải mail từ server POP3 thực sở thiết lập kênh liên lạc hai chiều client server Client gửi gửi thò kết nối nhận liệu Mail server tiếp nhận yêu cầu client trả lời gửi liệu 13.7.1 : Thiết lập liên kết: Đầu tiên, ứng dụng mail client sử dụng giao thức TCP kết nối với ứng dụng mail server thông qua đòa IP mail server host số hiệu port ứng dụng mail server Gửi: Mở socket liên lạc với ứng dụng mail server (port=110) Nhận: +OK ok_message -ERR error_message Sau nhận tín hiệu trả lời ‘OK’ từ ứng dụng mail server, ứng dụng mail client tiếp tục thực tác vụ sau theo thứ tự Đăng ký tài khoản truy cập mail server: Khai báo user name: Gửi: USER Nhận: +OK ok_message -ERR error_message kết thúc Khai báo password: Gửi: PASS Nhận: +OK ok_message MFCvới Internet kết thúc 219 Lấy thông tin hộp mail: Gửi: STAT Nhận: +OK -ERR error_message Lấy thông tin chi tiết mail hộp mail: Gửi: LIST Nhận: +OK Mailbox scan listing follows -ERR error_message Đọc mail: Gửi: RETR Nhận: +OK kích_thước_message octets … message mail server gửi về, kết thúc dấu ‘.’ -ERR error_message Xóa mail: Gửi: DELE Nhận: +OK message deleted -ERR error_message Chấm dứt liên kết với mail server: Gửi: QUIT Nhận: + OK goodbye_message - ERR error_message : 13.7.2 Trong phần này, ta xây dựng ứng dụng sử dụng giao thức TCP để kết nối lấy mail từ POP mail server Thông số liên quan mail server thông tin nhận thể dialog giao diện ứng dụng Dùng MFC Wizard tạo dự án với cửa sổ giao diện dialog, có sử dụng winsock (xem mục 13.4) Đặt tên cho dự án Thực cài đặt sau cho dialog giao diện (CPOP3Dlg): - Mở dialog resource, cài đặt control sau: IDC_SERVER_IP - Hộp nhập đòa mail server : Edit : Edit IDC_SERVER_PORT - Hộp nhập số hiệu port - Hộp nhập tên người truy cập : Edit IDC_USER_NAME - Hộp nhập password truy cập : Edit IDC_USER_PASSWORD 220 LậptrìnhWindowsvớiMFC - 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 thực lấy thông tin hộp mail: - Hành vi OnOK ứng với nút 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(); } } MFCvới Internet 221 222 LậptrìnhWindowsvớiMFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com pstrProxyName : pstrProxyBypass : 13.8 : 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 : 13.8.1 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 ( 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 lớp đối tượng quản lý tập tin mạng internet ( ); Tạo lập đối tượng quản lý tập tin virtual LONG ( // 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:: : Tính từ vò trí hành trỏ tập tin MFCvới Internet 224 LậptrìnhWindowsvớiMFC - 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* ( LPCTSTR pstrServer, // Đòa FTP server // Tên đăng nhập LPCTSTR pstrUserName = NULL, // password hợp lệ LPCTSTR pstrPassword = NULL, /* 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* ( // Đòa HTTP server LPCTSTR pstrServer, INTERNET_PORT nPort = /* số hiệu port */ INTERNET_INVALID_PORT_NUMBER, // Tên đăng nhập LPCTSTR pstrUserName = NULL, LPCTSTR pstrPassword = NULL // password hợp lệ ); Trả trỏ đối tượng quản lý liên kết với HTTP server - CFile:: : Tính từ đầu tập tin : Tính từ cuối tập tin - CFile:: virtual UINT ( // Đò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 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 ( CString& rString // Biến chứa chuỗi đọc vào ); Đọc chuỗi từ tập tin ( virtual void // Biến chứa chuỗi ghi LPCTSTR pstr ); Ghi chuỗi tập tin virtual void ( ); Đóng tập tin, chấm dứt tác vụ liên quan 13.8.3 : 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 LPCTSTR pstrDirName // Đường dẫn thư mục ); Ấn đònh thư mục làm việc FTP server BOOL ( CString& strDirName // Biến chứa kết ); Lấy đường dẫn thư mục làm việc FTP server ( BOOL // Đường dẫn thư mục LPCTSTR pstrDirName ); Xóa thư mục FTP server ( BOOL // Đường dẫn tên thư mục LPCTSTR pstrDirName ); Tạo thư mục FTP server BOOL ( LPCTSTR pstrExisting, // Đường dẫn tên cũ thư mục MFCvới Internet 225 LPCTSTR pstrNew // Tên thư mục ); Đổi tên thư mục FTP server ( BOOL LPCTSTR pstrFileName // Đường dẫn tên tập tin ); Xóa tập tin FTP server CInternetFile* ( 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 ( // Đường dẫn tên tập tin client LPCTSTR pstrLocalFile, LPCTSTR pstrRemoteFile, // Đường dẫn tên tập tin server DWORD dwFlags = /* Kiểu nội dung tập tin */ FTP_TRANSFER_TYPE_BINARY, // Số hiệu nhận diện tác vụ DWORD dwContext = ); Tải tập tin từ host làm việc lên FTP server (upload) BOOL ( LPCTSTR pstrRemoteFile, // Đường dẫn tên tập tin server LPCTSTR pstrLocalFile, // Đường dẫn tên tập tin client 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ậptrìnhWindowsvớiMFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com TRUE FALSE Thông báo lỗi 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 ( ); Kết thúc liên kết với FTP server virtual void BOOL TimThay = TimFile.FindFile(_T("*.TXT")); while (TimThay) { TimThay = TimFile.FindNextFile(); … // } } catch (CInternetException* pEx) { … // Có lỗi } if (pConnect != NULL) pConnect->Close(); delete pConnect; : 13.8.4 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: ( 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 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 ( ); Tìm tập tin thỏa điều kiện Trả virtual BOOL 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 ( ); 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 MFCvới Internet 227 : 13.8.5 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* ( 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ậptrìnhWindowsvớiMFC - 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 lớp đối tượng quản lý tập tin liệu độc lập truy xuất HTTP server BOOL ( // Thông số truy vấn DWORD dwInfoLevel, LPVOID lpvBuffer, // Vùng đệm nhận kết // 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 ( 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): : Đề 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" : 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" : 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/*" MFCvới Internet 229 "Accept: text/*" "Accept: audio/*" HTTP_ADDREQ_FLAG_ADD : Thay nội dung trước nội dugn sau có loại yêu cầu "Accept: audio/*" Như _REPLACE tự động bổ sung loại yêu cầu chưa có ( BOOL 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 // 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 DWORD dwFlags = 0, LPINTERNET_BUFFERS lpBuffIn = NULL, DWORD dwContext = ); Ngừng tác vụ ghi tập tin liệu HTTP server virtual CString ( ); Trả đường dẫn tên tập tin liệu HTTP server ( ); Kết thúc truy xuất tập tin liệu virtual void 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ậptrìnhWindowsvớiMFC - 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)) { … // } file->Close(); delete file; } server->Close(); delete server; : 13.8.7 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 MFCvới Internet 231 Sau bước thực dự án ứng dụng nói trên: với giao diện dialog Dùng MFC Wizard, tạo dự án Bổ sung thò: 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 : ListBox IDC_FILE_LIST - Hộp hiển thò danh sách tập tin - Nút lệnh thực tìm kiếm tập tin : Button IDOK - Tạo biến 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 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 : 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: với giao diện dialog Dùng MFC Wizard, tạo dự án Bổ sung thò: 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: - Hộp nhập đòa HTTP server : Edit IDC_URL Hộ p hiể n thò nộ i dung tậ p tin : Edit IDC_SOURCE : Button IDOK - Nút lệnh thực tải tập tin 232 LậptrìnhWindowsvớiMFC - 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 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 : 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 MFCvới Internet 233 : A.1 : Lậptrình hướng đối tượng (Object-Oriented Programming) phương pháp lậptrì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ớilậptrình cấu trúc : A.2 : A.2.1 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 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 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 : 234 LậptrìnhWindowsvớiMFC - 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: g : A.2.5 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 g p p A.3 - g : : 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 : 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ậpvới lớp đối tượng khác : 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 : - Phụ lục A: Một số vấn đề lậptrình hướng đối tượng 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 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 : 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 : 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 - : : 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 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 A.6.1 : Lớp đối tượng khai báo C++ sau: // Phần khai báo lớp: 236 LậptrìnhWindowsvớiMFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com Tên_lớp { : [ Khai báo thuộc tính, hành vi kiểu public ] : [ Khai báo thuộc tính, hành vi kiểu private ] : [ 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:: ( [ Danh_sách_tham_số ] ) { … // Các xử lý hành vi } … kiểu Tên_lớp:: ( [ 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" : 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* sử dụng để xin cấp phát vùng nhớ chứa nội dung chuỗi - Hành vi tạo lậpvới tham số giá trò chuỗi - Hành vi: 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ớ - 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ậptrình hướng đối tượng // 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 Đố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 ( [Danh sách giá trò làm tham số ] ); 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: Tên_lớp_kế_thừa: [ [, [ { … A.7 238 LậptrìnhWindowsvớiMFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com // 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 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 : 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: [, [,…]]{ … ( [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.6.3 : 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_lớp_cơ_sở1 ] Tên_lớp_cơ_sở2 [ , … ] | ( [ Danh sách thamm số ] ) : ( [ Các giá trò thamm số ] ) ( [ 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: Phụ lục A: Một số vấn đề lậptrình hướng đối tượng class CString2 : public CString1 { public: // Hành vi tạo lập bổ sung nhận tham số đối tượng CString1 CString2( CString1* s ) : CString1( s->GetInfo() ) { } }; : A.7.2 Hành vi hủy bỏ lớp kế thừa (mặc nhiên thuộc loại public) tự động kế thừa hành vi hủy bỏ lớp sở mà không cần phải khai báo Khi đối tượng thuộc lớp kế thừa chấm dứt hoạt động, xử lý hành vi hủy bỏ của lớp kế thừa xử lý hành vi hủy bỏ lớp sở thực theo thứ tự sau: // Chương trình Main2.cpp sử dụng lớp CString2 khai báo #include "String2.h" void main( void ) { CString2 a( “Vo Van B” ); CString2 b( &a ); printf( "Gia tri chuoi luu la: %s ", b.GetInfo() ); // Kết nhận được: Gia tri chuoi luu la: Vo Van B } A.8 : Khai báo hành vi toán tử số học hình thức thay thể hành vi theo dạng hàm (kiểu đại số) thành dạng toán tử (kiểu số học) Có hai loại hành vi toán tử: Hành vi toán tử hai ngôi: Là hành vi có tham số đối tác Khai báo: Kiểu Tên lớp:: Ký_ hiệu_hành_vi ( [ Danh sách tham số ] ); Hành vi toán tử ngôi: Là hành vi tham số đối tác Hành vi sử dụng cho phép chuyển kiểu đối tượng Khai báo: Tên lớp:: A.7.3 : Hành vi lớp kế thừa phép chủ động sử dụng hành vi lớp sở Cách thực hành vi lớp sở sau: Tên_lớp_cơ_sở:: ( [ Danh_sách_giá_trò_tham_số ] ); : Mở rộng không gian toán thực hành 1, với lớp đối tượng CString2 kế thừa từ CString1 bổ sung hành vi tạo lập nhận tham số đối tượng CString1 Lớp CString2 khai báo C++ sau: // Tập tin String2.h #include “String1.h” 240 LậptrìnhWindowsvớiMFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com Ký_hiệu_hành_vi ( void ); : Mở rộng không gian toán thực hành 1, với toán tử gán ( = ), cộng ( + ), chuyển kiểu lớp đối tượng chuỗi kiểu chuỗi C (char*) thay cho hành vi GetInfo Tạo lớp kế thừa CString3 từ lớp sở CString1 Thực bổ sung hành vi toán tử sau đây: - Toán tử chuyển kiểu: - Toán tử gán ( = ) với tham số giá trò kiểu chuỗi C - Toán tử cộng ( + ) với tham số giá trò kiểu chuỗi C trả trỏ đến đối tượng chuỗi Lớp CString3 khai báo C++ sau: // Tập tin String3.h Phụ lục A: Một số vấn đề lậptrình hướng đối tượng #include “String1.h” class CString3 : public CString1 { public: CString3( char* s ) : CString1( s ) { } // Toán tử chuyển kiểu operator char* ( void ) { return info; } void operator = ( char* s ); CString3* operator + ( char* s ); }; // Tập tin String3.cpp #include "String3.h" void CString3::operator = ( char* s ) { delete info; info = new char[ strlen( s ) + ]; strcpy( info, s ); } CString3* CString3::operator + ( char* s ) { char* ketqua; ketqua = new char[ strlen(info) + strlen( s ) + ]; sprintf( ketqua, "%s%s", info, s ); CString3* kq = new CString3( ketqua ); delete ketqua; return kq; } // Chương trình Main3.cpp sử dụng lớp CString3 khai báo #include "String3.h" void main( void ) { CString3 s1( "Chao Cac " ); CString3 s2( "Ban" ); CString3 *s = (s1 + s2); printf( "Cong hai chuoi la: %s", *s ); delete s; // Kết nhận được: Cong hai chuoi la: Chao Cac Ban } A.9 : 242 LậptrìnhWindowsvớiMFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com trỏ dùng tham chiếu đến thân đối tượng nội dung cài đặt Hành vi toán tử = lớp CString3 viết sau: void CString3::operator = ( char* s ) { delete this->info; this->info = new char[ strlen( s ) + ]; strcpy( this->info, s ); } A.10 : Hành vi virtual cài đặt lớp sở nhằm mục đích triển khai nhiều cách thể khác hành vi lớp kế thừa Trong ví dụ sau, lớp A cài đặt với hành vi khung Action Trong lớp B C kế thừa từ A, hành vi thể khác sau: - Lớp B : Bật tiếng beep PC speaker - Lớp C : Bật tắt ký tự x class A { public: void Action( void ) { } // Hành vi khung sở } class B : public A { public: void Action( void ) { // Cách thể Action lớp B putch( ); } } class C : public A { public: void Action( void ) { // Cách thể Action lớp C ; bật, tắt chữ x static char ch = ‘x’; putch(x); ch = ( ch == ‘x’ )? ‘ ‘ : ‘x’ ; } } void main ( void ) { Phụ lục A: Một số vấn đề lậptrình hướng đối tượng A* a[5]; for ( int i = 0; iAction( ); delay( 100 ); } for ( i = 0; i < ; i++ ) delete a[ i ]; // phần tử kiểu lớp A // Khởi tạo ngẫu nhiên theo kiểu lớp B // lớp C // Hành động theo cách lớp B C // Tạm dừng } A.11 : Thuộc tính hành vi tónh thuộc tính hành vi khai thác mà không cần sử dụng đối tượng cụ thể lớp : static Kiểuthuộctính static Kiểutrảvề ; ( [ Danh_sách_tham_số ] ); : Kiểuthuộctính Tênlớpsởhữu Kiểutrảvề Tênlớpsởhữu … = Giá_trò_khởi_đầu; ( [ Danh_sách_tham_số ] ) { // Nội dung cài đặt hành vi } Lưu ý: Hành vi static phép sử dụng thuộc tính static hành vi static lớp Trong ví dụ sau, ta cài đặt lớp Duongtron với thuộc tính bán kính, thuộc tính pi, hành vi Chuvi có hai thể sau: - Chuvi( float R ) : Trả chu vi đường tròn có bán kính R - Chuvi( void ) : Trả chu vi đường tròn quản lý đối tượng Có thể sử dụng hành vi Chuvi(R) mà không dùng đối tượng thuộc lớp Lớp Duongtron khai báo sau: 244 LậptrìnhWindowsvớiMFC - Microsoft Visual C++ 6.0 - Lê Ngọc Thạnh - lntmail@yahoo.com class Duongtron { protected: float R; static float pi; public: Duongtron( float bankinh ) { R = bankinh; } float Chuvi( void ) { return R * R * pi; } static float Chuvi( float bankinh ) { return R * R * pi; } }; float Duongtron::pi =3.14159; // Chương trình minh họa sử dụng lớp Duongtron void main( void ) { // Dùng hành vi tónh Chuvi( ) Duongtron để tính chu vi // đường tròn printf( “Chu vi duong tron ban kinh R = 10 la : %0.2f” , Duongtron::Chuvi( 10 ) ); // Dùng hành vi Chuvi() để tính chu vi đối tượng Duongtron Duongtron a( 20 ); printf( “Chu vi duong tron ban kinh R = 20 la : %0.2f”, a.Chuvi() ); } Nếu thuộc tính Duongtron thuộc tính static hành vi Chuvi( float Bankinh ) Duongtron không hợp lệ hành vi sử dụng thuộc tính static Phụ lục A: Một số vấn đề lậptrình hướng đối tượng ... (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... 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. .. ký pháp k thu t ụ nh d ng mà trình t t ng ng có th th hi n m t 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