giới thiệu vè ngôn ngữ visual C++
Trang 1CHƯƠNG I: GIỚI THIỆU VỀ NGÔN NGỮ
I - GIỚI THIỆU VỀ VISUAL C++
1- Sự đóng kín :
Sự đóng kín là cơ chế liên kết mã và dữ liệu mà nó thao tác, và giữ cho cả hai được an toàn khỏi sự can thiệp từ bên ngoài vào do sử dụng sai Trong ngôn ngữ hướng đối tượng mã và dữ liệu liên kết với nhau để tạo thành một hợp đen độc lập Trong hộp này là tất cả các mã và dữ liệu cần thiết Khi mà một dữ liệu liên kết như thế thì một đối tượng được tạo ra Nói cách khác đối tượng là dụng cụ hỗ trợ cho sự đóng kín Trong một đối tượng mã, dữ liệu hoặc cả hai có thể là riêng của đối tượng đó hoặc chung Mã hoặc dữ liệu thuộc về đối tượng đó và chỉ được truy cập bởi bộ phận của đối tượng Nghĩa là mã và dữ liệu riêng không được truy cập bởi các phần khác của chương trình tồn tại ngoài đối tượng Khi dữ liệu là chung, các bộ phận khác của chương trình có thể truy cập được nó mặc dù nó được định nghĩa trong một đối tượng Các phần chung của đối tượng được dùng để cung cấp một giao diện có điều khiển cho các phần riêng của đối tượng
Với mọi mục đích, một đối tượng là một biến thuộc loại do người sử dụng định nghĩa Một đối tượng liên kết mã và dữ liệu có thể được xem như là một biến Mỗi lần chúng ta định nghĩa một đối tượng mới, chúng ta tạo ra một loại dữ liệu mới.
2 Tính đa dạng :
Tính đa dạng là tính chất cho phép một tên được dùng cho hai hay nhiều mục đích khác nhau có quan hệ về phương diện kỹ thuật Mục đích của tính đa dạng được áp dụng cho OOP (Object Oriented Programming )là cho phép một tên dùng để chỉ rõ một lớp tác động tổng quát Trong lớp tác động tổng quát, một tác động cụ thể được xác định bởi loại dữ liệu.
Tổng quát khái niệm tính đa dạng là ý tưởng “ Một giao diện nhiều phương pháp “ Điều này có nghĩa là thiết kế một giao diện chung cho một nhóm có tác động tương quan Tuy nhiên, tác động cụ thể được thi hành cụ thể vào dữ liệu Ưu điểm của tính đa dạng là giúp làm giảm tính phức tạp bằng cách cho phép cùng một giao diện được sử dụng để chỉ rõ một lớp tác động tổng quát, chính trình biên dịch chọn lựa tác động cụ thể cho từng trường hợp Là người lập
Trang 2trình, ta không cần thực hiện này bằng tay Chỉ cần nhớ và sử dụng giao diện chung
Tính đa dạng có thể áp dụng cho cả hàm lẫn toán tử Thật sự tất cả các ngôn ngữ lập trình điều có một ứng dụng hạn chế về tính đa dạng khi nó liên hệ với toán tử số học Ví dụ trong C dấu + dùng để cộng các số nguyên, các số nguyên dài, các ký tự và các giá trị dấu phẩy động Trong những trường hợp này trình biên dịch tự động chọn số nguyên nào để áp dụng Trong C++ có thể mở rộng khái niệm này cho các biến mà ta định nghĩa Loại tính đa dạng này gọi là qúa tải các toán tử (operation loading).
3 – Tính kế thừa :
Tính kế thừa là qúa trình mà một đối tượng có thể có được các tính chất của một đối tượng khác Cụ thể hơn một đối tượng có thể thừa kế các tính chất tổng quát để bổ xung thêm các đặt điểm của nó Tính thừa kế là quan trọng vì nó cho phép các đối tượng hỗ trợ các khái niệm phân loại theo thứ bậc Hầu hết không được quản lý bằng sự phân loại theo thứ bậc Trong mỗi trường hợp lớp con thừa kế mọi đặc điểm của lớp cha và bổ xung thêm các đặt trưng của nó Không sử dụng sự phân loại theo thứ bậc, mỗi đối tượng sẽ phải định nghĩa mọi đặt trưng liên quan đến nó Tuy nhiên nhờ sự sử dụng tính kế thừa để mô tả một đối tượng bằng cách chỉ rõ lớp tổng quát nào thuộc về đối tượng cùng với các đặt điểm riêng làm cho đối tượng trở thành duy nhất.
II- LỚP VÀ ĐỐI TƯỢNG :1- Lớp :
Có lẽ đặt điểm quan trọng nhất trong lập trình hướng đối tượng là lớp Lớp là cơ cấu được dùng để tạo đối tượng Như vậy lớp là trung tâm của nhiều đặc điểm.
Cú pháp để khai báo một lớp cũng tương tự như cú pháp để khai báo một cấu trúc Dạng tổng quát như sau:
Class tên-lớp {
Các hàm và biến riêng của lớp Public :
Các hàm và biến riêng của lớp } danh sách các đối tượng
Trang 3Trong khai báo lớp danh sách các đối tượng là tùy chọn Giống như cấu trúc ta có thể khai báo đối tượng sau này khi cần Tên lớp là tùy chọn có tính kỹ thuật, từ
quan điểm thực hành, thực sự nó luôn luôn cần đến Lý do là tên lớp trở thành một tên kiểu mới được dùng để khai báo các đối tượng của lớp.
Các hàm và biến được khai báo bên trong khai báo lớp được gọi là thành viên của lớp đó Theo mặt định, thì tất cả các hàm và biến khai báo bên trong lớp là thuộc riêng của lớp đó Trong một lớp có thể có các khai báo như : public, protected, private.
+ public : là khai báo tới mọi client.
+ protected : là khai báo được truy xuất chỉ chính lớp đó, lớp con của nó, và lớp friend.
+ private : là khai báo chỉ chính lớp đó và lớp friend sử dụng.
Tóm lại: Lớp là tập hợp của các đối tượng cùng có một cấu trúc chung hay hành
vi chung Một đối tượng chỉ là thể hiện của lớp.
2- Đối tượng :
Một đối tượng có trạng thái, hành vi, đặc tính nhận dạng: Cấu trúc và hành vi của các đối tượng giống nhau được định nghĩa trong một lớp chung của chúng, thuật ngữ instance và đối tượng có thể thay thế lẫn nhau.
+ Trạng thái (state): của một đối tượng bao gồm tất cả các đặc tính ( thường là tĩnh ) của đối tượng trừ đi giá trị hiện tại ( thường là động ) của mỗi đặc tính đó.
+ Hành vi (behavior): của một đối tượng là đối tượng hoạt động như thế nào theo điều kiện trạng thái của nó thay đổi và thông điệp truyền đến.
+ Hoạt động ( Operations): là một dịch vụ mà lớp cung cấp cho khách hàng của nó.
Có hai loại operation thông dụng cần thiết để tạo và hủy những thể hiện của một lớp là :
+ constructor : là operation khởi tạo đối tượng và (hoặc) khởi động trạng thái của nó
+Destructor : là operation giải phóng trạng thái của một đối tượng và hủy chính đối tượng đó
III- THƯ VIỆN TRONG VISUAL C++:
Trang 4Visual C++ bao gồm thư viện của MicroSoft Foundation Class( MFC ) như là một công cụ quan trọng để xây dựng nhanh chương trình Window sử dụng C+ + MFC được viết ra với một mục đích duy nhất làm cho việc lập trình Window dễ dành hơn là theo kiểu cổ điển bằng cách cung cấp những lớp đối với hành vi (behavior) và thuộc tính ( property) với dạng biến lo giải quyết ( handle)
mọi công việc thông dụng trong tất cả chương trình windows Những lớp đối tượng nằm trong đã được thừa kế
Những hành vi nằm trong mỗi lớp đối tượng sẽ thực hiện những phần hành mà lập trình viên window phải viết trần ra Nhiều lớp đối tượng trong MFC mang một tương ứng rất gần gũi với structure và với “window class“ theo nghĩa cổ điển của window.
1- Các nhóm lớp trong thư viện MFC :
Document & application class : Lo quản lý các tài liệu và các ứng dụng
Control Class : Liên quan đến các ô điều khiển nhìn thấy được (visual control) như ô hiệu đính (Edit control), nút điều khiển (command button) ô liệt kê (list box) cũng như ô hỗn hợp ( combo box)
Dialog box Class: Xử lý các khung đối thoại tự tạo bởi người sử dụng ( custom dialog box) và các khung đối thoại thông dụng đã cài sẵn ( command dialog box như file, color selection, print, Fine/ Replace dialog box).
Fram Window class : Quản lý các khung cửa sổ (chính và con ) liên quan đến tài liệu SDI và MDI.
View Class: Quản lý các trình đơn và các mục trình đơn.
Control Bar Class : Tạo những thanh công, thanh tình trạng và các dialog Bar trong một ứng dụng đi kèm với cửa sổ bị chẻ đôi giống như trên file Manager của windows.
Menu Bar : Quản lý các trình đơn và mục trình đơn
Graphical Draw Object : Liên quan đến các hình ảnh đồ họa bitmap, Icon và việc quản lý và sử dụng font chữ (Font ), hộp mầu (Color palette) thường được gọi là các đối tượng GDI (Graphic Device Interface)
Graphical Drawing Class: Các lớp này sẽ giải quyết vẽ việc các điểm, đường thẳng hoặc cong, hình dáng( tròn, chữ nhật, đa giác) thường được gọi là đối tượng GDI.
File Services Class: Các lớp này chận hứng và giăng bẫy bắt các lỗi lầm khi chạy chương trình Các sai lầm này có thể do hoạt động sai liên quan đến tập tin, ký ức nguồn lực và OLE
Trang 5 Collection Class: Gồm ba nhóm lớp cho phép quản lý các bảng dãy (Array), bảng liệt kê kết nối ( Linked List) và “maps” thuộc nhiều kiểu dữ liệu khác nhau hoặc nhiều lớp khác nhau
OLE Support class: Các lớp này quản lý các đối tượng OLE trong những giao dịch
ODBC class: Liên quan đến việc quản lý và truy xuất các tập tin dữ liệu thông qua cơ chế ODBC (Open DataBase Connectivity)
Miscellaneous Class: Các lớp linh tinh này là hỗ trợ mô hình đối tượng runtime, các kiểu dữ liệu đơn giản, các cấu trúc
2- Mối quan hệ của một số lớp trong MFC :
Trang 6Lớp Cwnd hậu duệ của lớp CCmdTarget là một lớp đồ sộ khá quan trọng cung cấp những chức năng cơ bản cho tất cả các lớp cửa sổ như các ô điều khiển, các khung đối thoại và View Chỉ có những lớp dẫn xuất từ CWnd mới có thể nhận các thông điệp Thread và document có thể nhận command nhưng không thể nhận message.
Lớp CWnd cung cấp chức năng thiên cửa sổ như hàm API CreateWindow( ) và DestroyWindow( ), các hàm lo tô vẽ cửa sổ trên màn hình, xử lý các thông điệp, nói chuyện với Clipboard và nhiều thứ khác Ta không bao giờ khai báo trực tiếp một thể hiện của lớp CWnd trong ứng dụng Windows, mà phải cho dẫn xuất từ lớp này những lớp nếu muốn tạo ra một loại cửa sổ mới nhìn thấy được + Một số hàm trong lớp CWnd :
CDC* BeginPaint(LPPAINTSTRUCT lpPaint): Chuẩn bị CWnd để tô vẽ lại và điền vào cấu trúc dữ liệu PAINTSTRUCT những thông tin liên quan đến việc tô vẽ này Cấu trúc tô vẽ chứa một cấu trúc RECT mang một hình chữ nhật nhỏ nhất bao gồm trọn vùng nhật tu và một cờ hiệu cho biết vùng nền có nên xóa hay không Vùng nhật tu được đặt để bởi các hàm Invalidate ( ), InvalidateRgn( ), hoặc InvalidateRect( ) và bởi hệ thống khi hệ thống thay đổi kích thước, di chuyển, tạo mới, diễu hành hoặc thực hiện bất kỳ động tác nào ảnh hưởng đến vùng Client Nếu vùng nhật tu được đánh dấu xoá phần nền thì hàm BeginPaint( ) sẽ gởi thông điệp WM_ONERASEBKGND
Thông số lpPaint là con trỏ chỉ về cấu trúc dữ liệu PAINTSTRUCT tiếp nhận thông tin liên quan đến việc tô vẽ.
CWnd::EndPaint
Trang 7void EndPaint(LPPAINTSTRUCT lpPaint): Đánh dấu kết thúc việc tô vẽ trên cửa sổ nào đó Hàm này bắt buộc phải có khi bắt đầu hàm BeginPaint( ) nhưng chỉ khi nào việc tô vẽ hoàn tất Thông số lpPaint là con trỏ chỉ về cấu trúc PAINTSTRUCT tiếp nhận thông tin liên quan đến việc tô vẽ.
void GetClientRect( LPRECT lpRect): Hàm này sao chép tọa độ client của một vùng CWnd lên cấu trúc chỉ về bởi con trỏ lpRect Tọa độ client cho biết các góc upper-left và lower-right của vùng client Thông số lpRect là một con trỏ chỉ về cấu trúc RECT hoặc về đối tượng CRect tiếp nhận các tọa độ vùng client.
CWnd:: Invalidate
void Invalidate(BOOL bErare = TRUE): Hàm đánh dấu toàn vùng client của CWnd Vùng client đánh dấu phải được tô vẽ lại khi thôngđiệp WM_PAINT kế tiếp xẩy ra Thông số bErare cho biết mầu nền nằm trong vùng có nên xoá hay không khi xử lý.
CWnd:: OnCreate
Afx_msg int OnCreate(LPCREATESTRUCT lpcreateStruct): MFC gọi hàm này khi ứng dụng yêu cầu tạo cửa sổ Windows Việc tạo ra bằng cách gọi hàm Create( ) hoặc CreateEx( ) Đối tượng CWnd nhận triệu gọi hàm này sau khi cửa sổ đã tạo ra nhưng trước khi cửa sổ hiện nguyên hình Nghĩa là OnCreate được gọi trước khi hàm Create() hoặc CreateEx( ) trở về Thông số lpcreateStruct là con trỏ chỉ về cấu trúc CREATESTRUCT chứa thông tin liên quan đến đối tượng CWnd sẽ đươc tạo ra.
Afx_msg void OnLButtonDlbClk( UINT nFlags, CPoint point): MFC gọi hàm này khi người sử dụng nhấn nút trái chuột Chỉ những cửa sổ nào mang WNDCLASS stype CS_DBLCLHS mới nhận được triệu gọi hàm Việc bất tắt kép chuột sẽ phát sinh 4 events: Các thông điệp WM_LBUTTONDOWN, WM_LBUTTONDLBCLK,WM_MOUSEMOVE và một thông điệp WM_LBUTTONUP khi nhả nút chuột
+ nFlags cho biết những visual keys khác nhau được nhấn xuống: - MK_CONTROL: Xét nếu phím Control nhấn xuống
- MK_SHIFT: Xét nếu phím shift được nhấn xuống + point Cho biết tọa độ x,y của cursor.
Trang 8CWnd:: On_LButtonDown
afx_msg BOOL OnLButtonDown( UINT nFl;ags, CPoint point): Gọi hàm này khi người sử dụng nhấn nút trái chuột Các thông số giống hàm OnLButtonDlbClk.
CWnd:: On_LButtonUp
afx_msg void OnLButtonUp( UINT nFl;ags, CPoint point): Gọi hàm này khi người sử dụng nhả nút trái chuột Các thông số giống hàm OnLButtonDlbClk.
afx_msg void OnMouseMove(UINT nFlags, CPoint point): MFC gọi hàm này khi con trỏ chuột di chuyển Nếu con chuột không bị chặn hứng thì thông điệp WM_MOUSEMOVE sẽ trực tiếp nhận bởi đối tượng CWnd nằm dưới con
trỏ chuột, bằng không thông điệp sẽ đi đến cửa sổ đã chận hứng con chuột Các thông số được giải thích trên hàm OnLButtonDlbClk.
CWnd:: SetForcus
CWnd* SetFocus( ): Hàm này làm cho cửa sổ nhận được input focus để có thể nhận được tất cả các nhập liệu từ bàn phím và con chuột, nó sẽ gởi một thông điệp WM_KILLFOCUS cho cửa sổ đã bị đánh mất focus và một thông điệp WM_SETFOCUS cho cửa sổ đã nhận input focus Trị trả về là đối tượng CWnd có focus trước đó, nếu trị trả về NULL thì không có cưả sổ nào cả Con trỏ có thể là hiện thời nên không thể cấp trữ dùng về sau.
2.2- Lớp CView :
Lớp CView được xem như là lớp cơ sở gốc của các View, cung cấp những chức năng cơ bản cho những lớp view cơ bản tạo bởi người sử dụng Hoạt động chủ yếu của một view là in ấn.
View thường được gắn liền với document và hoạt động như chung gian giữa document và người sử dụng View phản ảnh hình ảnh của document lên màn hình hoặc lên mày in, và suy diễn nhập liệu của người sử dụng như là một thao tác lên document.
Một view được xem như là một cửa sổ con cái thuộc một Frame window Một Frame window có thể được chia sẻ sử dụng bởi một hoặc nhiều view như trong trường hớp một cửa sổ bị chẻ đôi Khi người sử dụng cho mở một cửa sổ mới hoặc chẻ đôi một cửa sổ hiện hưũ thì MFC sẽ tạo ra view mới gắn liền view này với document.
Trang 9Một view chỉ có thể gắn với một document nhưng một document có thể gắn liền với nhiều view Ứng dụng có thể hỗ trợ nhiều loại view khác nhau đối với một loại document, ví dụ một trình soạn thảo văn bản có thể cung cấp cả một view xem trọn văn bản của document và một outline view chỉ cho thấy phần tiêu đề các đoạn văn bản mà thôi Các đoạn view này có thể cho thể hiện trên nhiều khung cửa riêng biệt hoặc trên một splitter window khác nhau.
Một view có thể chịu trách nhiệm giải quyết các kiểu nhập liệu khác nhau: từ bàn phím, từ bấm tắt con chuột cũng như từ những lệnh trình đơn, lệnh thanh công cụ hoặc thanh điều hành Một view sẽ tiếp nhận những lệnh chuyển đến từ frame windows Nếu view không xử lý lệnh nào đó thì nó chuyển tiếp cho document được gắn với nó Muốn sử dụng view ta cho dẫn xuất một lớp từ CView rồi thiết đặt hàm thành viên OnDraw( ) lo việc hiển thị màn hình
+ Một số hàm thành viên lớp CView: CView::GetDocument
CDocument* GetDocument( ) const : Gọi hàm này đẻ lấy con trỏ chỉ về document của view, việc này cho phép gọi các hàm thành viên document Trị trả về là một con trỏ chỉ về đối tượng CDocument được gắn liền với view, nếu NULL view không gắn liền với document.
CView:: OnBeginPrinting
vitual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo): Được triệu gọi bởi MFC vào đầu công tác Print hoặc PrintPreview sau khi hàm OnPreparePrinting được gọi vào Thiết đặt mặc nhiên của hàm này sẽ không làm gì cả, cho phủ quyết hàm để cấp phát bất cứ nguồn lực GDI nào đó như bút vẽ, cọ vẽ hoặc guồn lực đặc biệt cần cho in ấn.
- pDC: con trỏ chỉ về printer device context.
- pInfo: con trỏ chỉ vế cấu trúc CPrintInfo mô tả công tác in hiện hành CView:: OnEndPrinting
virtual void EndPrinting( CDC* pDC, CPrintInfo): Hàm này gọi bởi MFC ngay sau khi một tài liệu đã được in hoặc xem trước Thiết đặt mặc nhiên của hàm không làm gì cả Cho phủ quyết hàm này để giải phóng những nguồn lực GDI đã cấp phát trước đó bởi hàm OnPreparePrinting.
Trang 10
2.3- Lớp CDocument :
Lớp CDocument cung cấp những chức năng cơ bản cũng như biến thành viên đối với những lớp Document tự tạo bởi người sử dụng và lớp OLE Document Theo định nghĩa một document là một đơn vị dữ kiện thường ở dạng một tập tin mà điển hình người sử dụng mở thông qua File | Open và lưu trữ thông qua File | Save.
Lớp Document hỗ trợ những công tác chuẩn như tạo document, cho nạp nó lên ký ức, đọc từ đĩa vào và cho cất trữ nó lên đĩa MFC thao tác các document này sử dụng giao diện được định nghĩa bởi lớp CDocument
+ Một số hàm thành viên của lớp CDocument: CDocument::SetModifiedFlag
void SetMdifiedFlag(BOOL bModified = TRUE): gọi hàm này sau khi có thay đổi trên document
void UpdateAllViews(CView* pSender, LPARAM lhint = OL, CObject* pHint = NULL)
Gọi hàm này sau khi document đã bị thay đổi Thông thường hàm được gọi sau khi gọi hàm SetModifiedFlag Hàm sẽ thông báo cho mỗi view được gắn với document, ngoại trừ view chỉ rõ bởi pSender( là con trỏ chỉ về view đã sửa đổi document)
2.4- Lớp CDialog:
Lớp CDialog được dẫn xuất từ lớp CWnd là lớp cơ sở được dùng để hiển thị khung đối thoại lên màn hình Thư viện MFC cung cấp những lớp dialog để hỗ trợ những khung đối thoại thông dụng được cài sẵn ( gọi là command dialog ) Command dialog là những khung đối thoại tự tạo gọi là custom dialog
Command dialog là những khung đối thoại chuẩn đã có sẵn trên window 3.1 trở đi.
Người ta phân biệt khung đối thoại làm hai loại: modal và modeless Modal dialog là khung đối thoại một khi gọi nó lên thì ta phải làm xong chuyện rồi đóng nó lại rồi mới chuyển sang cửa số khác Ngược lại, modeless dialog cho phép ta hiển thị cửa sổ rồi trở qua một công việc khác trên một cửa sổ khác không bắt buộc phải bỏ hoặc trước tiên phải đóng lại cửa sổ modeless này Sự khác biệt chủ yếu là khung đối thoại có cần dữ liệu quan trọng hay không
Trang 11Modal dialog thường có dữ liệu “gay cấn” phải tiếp nhận, modeless thì không Một khung đối thoại, tương tự như bất cứ cửa sổ nào khác thường nhận những thông điệp trên windows Trên khung đối thoại, điều đặc biệt quan tâm là làm thế nào giải quyết các thông báo phát đi từ các ô điều khiển nằm trên khung đối thoại, vì đây là cách người sử dụng tiếp cận với khung đối thoại.
+ Một số hàm thành viên của lớp CDialog
CDialog::DoModal( ): Cho gọi hàm thành viên này để gọi một khung đối thoại modal và trả về kết quả khi làm xong Hàm này sẽ giải quyết tất cả mọi tương tác với người sử dụng khi khung đối thoại đang hiện dịch.
Nếu người sử dụng bấm tắt một trong những nút điều khiển trên một khung đối thoại, như nút <OK> hoặc <CANCEL> thì một hàm thành viên sẽ giải quyết thông điệp sẽ được triệu gọi cố gắng đóng khung đối thoại
CDialog :: OnInitDialog
Vitual BOOL OnInitDialog( )
Hàm thành viên này được gọi để đáp ứng thông điệp WM_INITDIALOG Thông điệp này được chuyển cho khung đối thoại trong khi triệu gọi các hàm
Create ( ), CreateIndirect( ), hoặc DoModal( ), xảy ra ngay liền trứôc khi khung đối thoại được hiển thị.
Cho phủ quyết hàm này khi cần thực hiện việc gì đó, đặc biệt khi khung đối thoại được khởi gán
CDialog ::EndDialog
Void EndDialog (int nResult) ;
Gọi hàm này để chấm dứt một modal dialog box Hàm này sẽ trả về nResult như là một trị trả về của DoModal( ) Ta phải dùng hàm EndDialog( ) để hoàn tất việc xử lý, bất cứ lúc nào một modal dialog box được tạo ra
2.5- Lớp CWinApp:
Lơp CWinApp (Windows Application) là một lớp cơ sở cho phép dẫn xuất một đối tượng windows, Một đối tượng dùng cung cấp những hàm thành viên dùng khởi gán ứng dụng cũng như cho chạy và kết thúc chương trình windows trên MFC.
+ Các hàm thành viên: